如何使用Android gradle插件0.10.0或更高版本获取jacoco覆盖率报告?

Tae*_*Kim 38 android unit-testing gradle jacoco android-gradle-plugin

我正在尝试使用Gradle Android插件0.10.2获取测试覆盖率报告.但是在运行一些测试后我仍然无法获得覆盖率报告.(connectedAndroidTest).

我的主模块的build.gradle是:

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        debug {
            testCoverageEnabled true
        }

        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.+'
}
Run Code Online (Sandbox Code Playgroud)

而project的build gradle的buildscript部分是:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.10.+'
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦我gradlew connectedAndroidTest从终端运行,我可以在文件夹中找到coverage-instrumented-classescode-coverage文件build夹.但我coveragereports文件夹中找不到文件夹.(只有我能看到的是androidTests文件夹)

获取jacoco覆盖率报告有什么遗漏吗?

Tae*_*Kim 100

通过数百次搜索获得报道的答案,我终于找到了我想要的确切答案.

这篇博文中,我发现gradlew createDebugCoverageReport创建了jacoco覆盖率报告.

此外,从gradle插件源代码,该插件默认使用jacoco 0.6.2.201302030002.(因此,如果您要使用默认版本,则不需要jacoco版本定义)

总之,使用Android gradle插件获取覆盖率报告的ESSENTIAL步骤jacoco如下:

  1. Android gradle插件版本0.10.0或更高版本(通常在您的项目中build.gradle)
  2. 添加testCoverageEnabled true到您想要的构建类型(即debug)
  3. 运行$ gradlew createDebugCoverageReportgradlew connectedCheck获取jacoco覆盖率报告.

您可以在此处找到您的承保范围报告build/reports/coverage/{buildType}.(即build/reports/coverage/debug用于调试版本)

(从@ odiggity的评论中添加多味案例)

如果您的项目使用多风味配置,请create{flavorName}CoverageReport改用.覆盖率报告将在以下位置生成build/reports/coverage/{flavorName}/{buildType}.

使用调试版本类型调整krInternal的示例:

  • 命令: ./gradlew createKrInternalDebugCoverageReport
  • 报告主要针对: build/reports/coverage/krInternal/debug

小费 :

由于您只能使用emulator和获取覆盖率报告,因此device with root permission在常规(非根)设备上运行命令后会出现以下错误:

05:48:33 E/Device: Error during Sync: Permission denied                         
java.io.IOException: com.android.ddmlib.SyncException: Permission denied
    at com.android.builder.testing.ConnectedDevice.pullFile(ConnectedDevice.java:114)
    at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:158)
    at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:42)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)   
Caused by: com.android.ddmlib.SyncException: Permission denied
    at com.android.ddmlib.SyncService.doPullFile(SyncService.java:511)
    at com.android.ddmlib.SyncService.pullFile(SyncService.java:320)
    at com.android.ddmlib.Device.pullFile(Device.java:849)
    at com.android.builder.testing.ConnectedDevice.pullFile(ConnectedDevice.java:107)
    ... 10 more                
:myDirections:connectedAndroidTest FAILED      

FAILURE: Build failed with an exception.
Run Code Online (Sandbox Code Playgroud)

Travis-CI构建脚本以获得代码覆盖率

在build.gradle中包含此块,用于所有模块(库,样本等)

android {
    lintOptions {
        abortOnError false
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是.travis-ci.yml文件

language: android
jdk: oraclejdk8
sudo: required

android:
  components:
  # Uncomment the lines below if you want to
  # use the latest revision of Android SDK Tools
  - tools
  - platform-tools
  # The BuildTools version used by your project
  - build-tools-28.0.3
  # The SDK version used to compile your project
  - android-28
  - android-22
  - add-on
  # Additional components
  - extra-google-google_play_services
  - extra-android-support
  - extra-google-m2repository
  - extra-android-m2repository
  # Specify at least one system image,
  # if you need to run emulator(s) during your tests
  - sys-img-armeabi-v7a-android-22

  licenses:
  - 'android-sdk-preview-license-52d11cd2'
  - 'android-sdk-license-.+'
  - 'google-gdk-license-.+'

before_cache:
- rm -f  $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/

cache:
  directories:
    - $HOME/.gradle/caches/
    - $HOME/.gradle/wrapper/
    - $HOME/.android/build-cache

before_install:
- yes | sdkmanager "build-tools;28.0.3"

before_script:
- echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a -c 100M
- emulator -avd test -no-audio -no-window &
- android-wait-for-emulator
- sleep 180
- adb devices
- adb shell input keyevent 82 &

script:
- ./gradlew build connectedCheck

after_success:
- bash <(curl -s https://codecov.io/bash)
Run Code Online (Sandbox Code Playgroud)

  • 几个月后回到这里并弄清楚它为什么不起作用.现在似乎显而易见但我当时并没有真正理解gradle命令结构.对于使用flavor的其他任何人,你需要包含那些,所以它看起来像./gradlew create {flavourName} DebugCreateCoverageReport. (4认同)
  • 我找不到位于src/test中的JUnit测试的任何覆盖结果.有没有人设法从"正常"的junit测试中获得报道? (4认同)
  • 我在根项目'MyProject'中找不到"任务'createDebugCoverageReport'." 每当我运行./gradlew createDebugCoverageReport.我已经确保你的前两步了.知道为什么吗? (2认同)

Nik*_*las 7

我为此创建了一个开源插件.

Root build.gradle

apply plugin: "com.vanniktech.android.junit.jacoco"

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.3.0'
    }
}
Run Code Online (Sandbox Code Playgroud)

然后简单地执行

./gradlew jacocoTestReportDebug // or jacocoTestReportRelease
Run Code Online (Sandbox Code Playgroud)

它将运行JUnit测试,然后在调试构建类型的相应构建目录中以xml和html形式提供Jacoco输出.


Bet*_*hao 6

因为我的声誉低于50,所以必须添加答案而不是评论...

我想补充的是:

谷歌发布了新的构建工具来修复令人讨厌的"VerifyError"(链接)问题.

如果遇到"VerifyError"问题,请尝试在gradle中更改设置以使用最新的构建工具.例如,

android {
    ......
    buildToolsVersion '21.1.1'
    .....
}
Run Code Online (Sandbox Code Playgroud)

由于21.0.0构建工具存在问题,请使用大于21.0.0的版本.我用21.1.1.


Yul*_*mok 5

Gradle 已经内置支持生成测试覆盖率报告,我们不需要创建任何额外的配置或添加任何插件来生成测试覆盖率报告。基本上,我们唯一需要做的就是在文件中设置testCoverageEnabled参数,如下所示:truebuild.gradle

android {
   buildTypes {
      debug {
         testCoverageEnabled = true
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

接下来,我们可以从 CLI 执行以下 Gradle 任务:

./gradlew createDebugCoverageReport
Run Code Online (Sandbox Code Playgroud)

在 Windows 上,我们可以这样执行:

gradlew.bat createDebugCoverageReport
Run Code Online (Sandbox Code Playgroud)

任务将分析/src/main/java/目录中我们项目的代码和放置在/src/androidTest/java/目录中的单元测试。执行此任务后,我们可以在模块的以下目录中找到测试覆盖率报告:

/build/outputs/reports/coverage/debug/
Run Code Online (Sandbox Code Playgroud)

当我们打开index.html文件时,我们可以看到测试覆盖率的可视化报告,可以在 Web 浏览器中查看。

它看起来如下图所示。

在此处输入图片说明