Android Gradle Jacoco:用于集成测试的离线工具

2023-11-21

我们正在构建一个 Android 应用程序,并使用 Appium 进行测试。现在我想看看我们的 Appium 测试的测试覆盖率。 我认为这是可能的,因为Jacoco支持离线检测(http://www.eclemma.org/jacoco/trunk/doc/offline.html).

甚至 jacoco gradle 插件的文档也说:

虽然在应用 java 插件时,所有 Test 类型的任务都会自动增强以提供覆盖率信息,但任何实现 JavaForkOptions 的任务都可以通过 JaCoCo 插件进行增强。也就是说,任何派生 Java 进程的任务都可以用来生成覆盖率信息。

see https://docs.gradle.org/current/userguide/jacoco_plugin.html

但是,我如何编写 build.gradle 以便在执行 Appium 测试甚至执行手动测试用例时检测我们的验收调试风格并将 exec 文件写入智能手机? 因为这样我就可以提取 exec 文件并将其发送给 SonarQube 进行进一步分析。

谢谢 本


最后我设法使其正常工作,我想与您分享解决方案:

为您的 buildType 启用检测并相应配置 SonarQube 例如

...
apply plugin: 'jacoco'
...

android {
    ...
    productFlavors {
        acceptance {
            applicationId packageName + ".acceptance"
            buildTypes {
                debug {
                    testCoverageEnabled true
                }
            }
        }
    }
}


sonarRunner {
    sonarProperties {
        property "sonar.host.url", "..."
        property "sonar.jdbc.url", sonarDatabaseUrl
        property "sonar.jdbc.driverClassName", sonarDatabaseDriverClassName
        property "sonar.jdbc.username", sonarDatabaseUsername
        property "sonar.jdbc.password", sonarDatabasePassword

        property "sonar.sourceEncoding", "UTF-8"
        property "sonar.sources", "src/main"
        property "sonar.tests", "src/test"
        property "sonar.inclusions", "**/*.java,**/*.xml"
        property "sonar.import_unknown_files", "true"
        property "sonar.java.binaries", "build/intermediates/classes/acceptance/debug"
        property "sonar.junit.reportsPath", "build/test-results/acceptanceDebug"
        property "sonar.android.lint.report", "build/outputs/lint-results.xml"
        property "sonar.java.coveragePlugin", "jacoco"
        property "sonar.jacoco.reportPath", "build/jacoco/testAcceptanceDebugUnitTest.exec"
        // see steps below on how to get that file:
        property "sonar.jacoco.itReportPath", "build/jacoco/jacoco-it.exec"

        property "sonar.projectKey", projectKey
        property "sonar.projectName", projectName
        property "sonar.projectVersion", appVersionName
    }
}

将以下内容添加到您的 AndroidManifest.xml

<receiver
 android:name=".util.CoverageDataDumper"
 tools:ignore="ExportedReceiver">
 <intent-filter>
    <action android:name="org.example.DUMP_COVERAGE_DATA"/>
 </intent-filter>
</receiver>

CoverageDataDumper 应该如下所示:

public class CoverageDataDumper extends BroadcastReceiver {
   private static final Logger LOG = LoggerFactory.getLogger( CoverageDataDumper.class );

   @Override
   public void onReceive( Context context, Intent intent ) {
      try {
         Class
            .forName( "com.vladium.emma.rt.RT" )
            .getMethod( "dumpCoverageData", File.class, boolean.class, boolean.class )
            .invoke( null,
               new File( App.getContext().getExternalFilesDir( null ) + "/coverage.ec" ),
               true, // merge
               false // stopDataCollection
            );
      }
      catch ( Exception e ) {
         LOG.error( "Error when writing coverage data", e );
      }
   }
}

然后使用验收风味应用程序(带有检测类)运行您的 Appium 测试用例。在调用“重置应用程序”或“关闭应用程序”之前,请确保调用以下方法(只是草稿,但我认为您已经明白了):

// intent is "org.example.DUMP_COVERAGE_DATA"
public void endTestCoverage( String intent ) {
  if ( driver instanceof AndroidDriver ) {
     ((AndroidDriver) driver).endTestCoverage( intent, "" );
  }
}
public void pullCoverageData( String outputPath ) {
  String coverageFilePath = (String) appiumDriver.getCapabilities().getCapability( "coverageFilePath" );
  if ( coverageFilePath != null ) {
     byte[] log = appiumDriver.pullFile( coverageFilePath );
     MobileAppLog.writeLog( new File( outputPath ), log );
  }
  else {
     throw new AppiumLibraryNonFatalException(
        "Tried to pull the coverage data, but the coverageFilePath wasn't specified." );
  }
}

输出路径可以是例如:/sdcard/Android/data/org.example.acceptance/files/coverage.ec

现在 Jacoco 数据已写入智能手机。接下来我们需要下载该文件。您可以使用

appiumDriver.pullFile( logFilePath );

现在您需要复制文件“jacoco-it.exec”(它应该始终是appended当您将文件拉入 build/jacoco/jacoco-it.exec 时,请参阅上面的 gradle.build 并运行

gradlew sonarRunner

在 SonarQube 中添加集成测试覆盖率小部件,您现在应该看到一些值...

不幸的是,如果您使用retrolambda(就像我们一样),代码覆盖率将不起作用。 Retrolambda 将生成不属于源文件一部分的匿名类 - 因此 SonarQube 无法正确匹配它们,并且显示的代码覆盖率比实际低得多。如果有人找到解决方案,我会很高兴:-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Gradle Jacoco:用于集成测试的离线工具 的相关文章

  • Android 应用程序在后台运行时保存数据

    目前我正在开发 xmmp 客户端 当应用程序位于前台时 该客户端工作得很好 但由于事实上 当应用程序处于后台时 我在 Application 类中保存了大量数据 复杂的 ArrayList 字符串和布尔值作为公共静态 每个字段都被垃圾收集
  • 与 Admob 广告单元 ID 混淆

    我跟着tutorial https developers google com admob android quick start在我的应用程序中创建广告横幅 到目前为止 这有效 我可以看到测试广告 但是 本教程指示我在两个不同的位置使用两
  • Phonegap - 如何将.txt文件保存在Android手机的根目录中

    我正在尝试使用phonegap 将 txt 文件保存在Android 手机的根目录中 我已经安装了这些插件 cordova plugin file 和 cordova plugin file transfer 在 config xml 文件
  • Android:“dp”到“px”转换?

    我正在读这篇文章 http developer android com guide practices screens support html http developer android com guide practices scre
  • Android libgdx 首选项丢失

    我在 Libgdx 引擎中创建了 Android 游戏 一段时间后 我注意到在某些应用程序杀手中杀死该应用程序后 或者如果我在 Android 设置中执行 强制关闭 操作 我保存到首选项中的游戏选项就会丢失 有办法防止这种情况吗 我从来没有
  • 无法在自定义 AOSP 上安装 Google Play 中的某些应用程序:项目不可用。理由:9

    我在尝试从 Google Play 安装某些应用程序时收到以下错误 LibraryUtils isAvailable not available restriction 9 DocUtils getAvailabilityRestricti
  • 在 Android 中使用 DataOutputStream 在 POST 正文中发送特殊字符 (ë ä ï)

    我目前正在开发一个具有大量服务器端通信的 Android 应用程序 昨天 我收到一份错误报告 称用户无法发送 简单 特殊字符 例如 我搜索过但没有找到任何有用的东西 可能重复 没有答案 https stackoverflow com que
  • 在意图过滤器中使用多个操作时的默认值

    尝试理解 Android 中的意图和操作并查看文档 http developer android com guide topics intents intents filters html 但我一直看到的一件事是定义了多个操作的意图过滤器
  • CookieManager.getInstance().removeAllCookie();不删除所有cookie

    我在应用程序的 onCreate 中调用 CookieManager getInstance removeAllCookie 我遇到了一个奇怪的问题 我看到 GET 请求中传递了意外的 cookie 值 事实上 cookie 值是一个非常非
  • 带有自定义阵列适配器的微调器不允许选择项目

    我使用自定义阵列适配器作为微调器 但是 当在下拉列表中选择一个项目时 下拉列表保留在那里 并且微调器不会更新 这是错误行为 与使用带有字符串的通用数组适配器相比 这是自定义类 我错过了什么吗 谢谢 public class Calendar
  • Android 启动器快捷方式

    我制作了一个简单的打卡 打卡时钟应用程序 我想向用户添加在主屏幕上创建快捷方式的选项 该快捷方式将切换应用程序的状态 超时 超时 但我根本不希望此快捷方式在屏幕上打开应用程序 这是我的 setupShortcut private void
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • 调节麦克风录音音量

    我们正在尝试调整录音时的音量级别 麦克风似乎非常敏感 会接收到很多静电 我们查看了 setVolumeControlStream 但找不到传入其中来控制麦克风的流 将您的音频源设置为 MIC using MediaRecorder Audi
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • 当手机旋转(方向改变)时如何最好地重新创建标记/折线

    背景 开发一个使用 Android Google Map v2 的本机 Android 应用程序 使用android support v4 app FragmentActivity 在 Android v2 2 上运行 客观的 在更改手机方
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • 在 Android 中,如何将字符串从 Activity 传递到 Service?

    任何人都可以告诉如何将字符串或整数从活动传递到服务 我试图传递一个整数 setpossition 4 但它不需要 启动时总是需要 0 Service 我不知道为什么我不能通过使用 Service 实例从 Activity 进行操作 publ
  • 无法运行我的应用程序,要求选择 Android SDK

    今天我已经安装了Android Studio 金丝雀 1 现在我无法运行我的应用程序 将出现以下对话框 我已经通过 文件 gt 项目结构 gt Android SDK 位置 设置了正确的 SDK 位置 期待您的帮助来解决这个问题 警告对话框
  • 如何删除因 Google Fitness API 7.5.0 添加的权限

    将我的 play services fitness api 从 7 0 0 更新到 7 5 0 后 我注意到当我将新版本上传到 PlayStore 时 它 告诉我正在添加一个新权限和 2 个新功能 我没有这样做 有没有搞错 在做了一些研究来

随机推荐

  • 节点-gyp。 MSBuild.exe`失败,退出代码:1

    我试图安装 Sharp 模块 这需要 c 编译器 我下载了 Visual Studio 2017 和 Visual C 构建工具 node gyp 安装成功 但是运行 npm install g Sharp 我遇到了很多错误 吉普 错误 堆
  • 如何在 ASP.NET ListBox 中设置多项选择?

    我无法在后面的代码中找到在 ASP NET ListBox 中选择多个项目的方法 这是需要在 Javascript 中完成的事情吗 您必须使用 ListBox 的 FindByValue 方法 foreach string selected
  • Python:如何修改/编辑打印到屏幕的字符串并将其读回?

    我想在 Windows 中将字符串打印到命令行 终端 然后编辑 更改该字符串并将其读回 有人知道该怎么做吗 谢谢 print Hell Hello lt Edit it on the screen s raw input print s H
  • 在IE11中,如何使用console.log?

    尝试使用console log 但总是打印undefined 尝试使用类似的解决方案Console log IE9 问题它也不起作用 In this IE11文档 有如下句子 Last but not least forget about
  • 比较数组是否相等,忽略元素的顺序

    我有一个包含 4 个数组列的表 结果如下 ids signed ids new ids new ids signed 1 2 3 2 1 3 4 5 6 6 5 4 无论如何都要比较ids and signed ids通过忽略元素的顺序 使
  • 重新附加实体图并检测集合更改

    我首先使用实体 框架代码 并通过 WCF REST HTTP 接口公开 Northwind 数据库 我没有公开 OrderDetails 表 订单项 因为创建订单然后通过另一个服务单独添加每个所需的 OrderDetail 是没有意义的 在
  • 在 Rails 中使用带有 has_many 的委托?

    我们有 2 个模型和一个连接模型 app models message rb Class Message lt ActiveRecord Base has many image messages has many images throug
  • 如何对实体的自定义属性进行建模?

    假设我们有一个应用程序应该能够存储所有类型的产品 每个产品至少有一个ID and a Name但所有其他属性都可以由用户自己定义 例如 他可以创建一个产品组Ipods其中将包含属性capacity and 一代 例如 他可以创建一个产品组T
  • strstr 的优化版本(搜索具有恒定长度)

    我的 C 程序有很多 strstr 函数调用 标准库 strstr 已经很快 但在我的例子中 搜索字符串的长度始终为 5 个字符 我用一个特殊版本替换了它以获得一些速度 int strstr5 const char cs const cha
  • C# - 让 Process.Start 等待进程启动

    在继续使用方法之前 我需要确保进程正在运行 声明是 Process Start popup exe 您可以执行 WAIT 命令或对此值设置延迟吗 你的意思是等到完成吗 然后使用Process WaitForExit var process
  • Linq 表达式中的条件运算符导致 NHibernate 异常

    我正在尝试在 ASP NET MVC 2 应用程序中实现搜索功能 我根据用户输入的条件创建一个表达式 public ViewResult FindCustomer string forename string familyname Date
  • 奇怪的for循环问题

    我不确定这是否是一个错误 所以我想也许你们可能想看一下 问题出在这段代码上 for i 0 1 05 do print i end 输出应该是 0 05 1 snip 95 1 相反 输出是 0 05 1 snip 95 while 循环也
  • Laravel 5.5 具有不同列名的单独表的唯一验证规则

    所以我有用户和公司 一名用户属于一家公司 我想验证用户注册 以便business name他们用来注册的字段在companies表 目标是不允许用户创建重复的公司 这是我的注册功能 public function register Requ
  • 更改活动输入选择器的背景颜色

    任何原因为什么当我运行这段代码时 input type submit active background color green 当我单击所需的按钮时 它只会闪烁绿色一瞬间 然后返回到原始颜色 怎样才能让它永远保持绿色呢 input typ
  • 非常量引用绑定到临时的 Visual Studio bug?

    我在编译一些可移植代码时遇到了这个问题gcc 基本上这个奇怪的代码在 Visual Studio 中编译 这真的让我大吃一惊 class Zebra int x Zebra goo Zebra z return z void foo Zeb
  • Min-width, max-width css 使用最小宽度

    好吧 所以我希望做的是创建一个 DIV 它将根据其中的内容自动调整大小 但它应该使用尽可能小的宽度 我不知道如何做到这一点 所以 如果我有一个包含 3 个字符的 DIV 标签 其宽度无疑低于 200px 那么我想要的就是 div 为 200
  • pthread_mutex_lock.c:62: __pthread_mutex_lock: 断言 `mutex->__data.__owner == 0' 失败

    我收到了那个错误 pthread mutex lock c 62 pthread mutex lock 断言 mutex gt data owner 0 失败 我找不到任何原因 但是我不确定以下代码 声明 std mutex lock st
  • 如何使用 jquery 隐藏父元素?

    假设以下 HTML li class fooli a class foo href anchor a li li class fooli a class foo href anchor a li 和以下 Javascript 使用 jque
  • ASP.NET 的 JSON 最大长度问题

    我正在创建一个 asp net 2 0 Web 服务 它提供 json 作为输出 并且有一个非常大的 无法分解的数据集 超出了最大长度限制 我在互联网上搜索过 net 3 5 4 上有解决方案 但 2 0 上没有 谁能告诉我如何增加 JSO
  • Android Gradle Jacoco:用于集成测试的离线工具

    我们正在构建一个 Android 应用程序 并使用 Appium 进行测试 现在我想看看我们的 Appium 测试的测试覆盖率 我认为这是可能的 因为Jacoco支持离线检测 http www eclemma org jacoco trun