【问题标题】:How do I get a jacoco coverage report using Android gradle plugin 0.10.0 or higher?如何使用 Android gradle 插件 0.10.0 或更高版本获取 jacoco 覆盖率报告?
【发布时间】:2014-05-21 23:40:41
【问题描述】:

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

我的主要模块的 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.+'
}

项目的 build gradle 的 buildscript 部分是:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.10.+'
    }
}

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

获取 jacoco 报道报告有什么遗漏吗?

【问题讨论】:

    标签: android unit-testing gradle android-gradle-plugin jacoco


    【解决方案1】:

    经过数百次搜索以获得覆盖率报告的答案,我终于找到了我想要的确切答案。

    this blog post,我发现gradlew createDebugCoverageReport 创建了jacoco 覆盖率报告。

    另外,从 gradle 插件source code,该插件默认使用 jacoco 0.6.2.201302030002。 (因此,如果您要使用默认版本,jacoco 版本定义不是必需的

    总之,使用 Android gradle 插件获取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}生成。

    带有 debug 构建类型的风味 krInternal 示例:

    • 命令:./gradlew createKrInternalDebugCoverageReport
    • 报告生成于:build/reports/coverage/krInternal/debug

    提示:

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

    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.
    

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

    将此块包含在 build.gradle 中,适用于所有模块(库、示例等)

    android {
        lintOptions {
            abortOnError false
        }
    }
    

    下面是.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)
    

    【讨论】:

    • 我收到“在根项目 'MyProject' 中找不到任务 'createDebugCoverageReport'。”每当我运行 ./gradlew createDebugCoverageReport 时。我已确保执行您的前两个步骤。知道为什么吗?
    • @odiggity 你同步了吗?我有同样的问题,但在同步和重建后它出现了,现在很好。
    • 几个月后回到这个问题并弄清楚为什么它不起作用。现在看起来很明显,但我当时并没有真正理解 gradle 命令结构。对于使用风味的其他人,您也需要包含这些风味,因此它看起来像 ./gradlew create{flavorName}DebugCreateCoverageReport.
    • @odiggity 应该创建{flavourName}DebugCoverageReport,对吧?似乎是错字:)
    • 我在 src/test 中的 JUnit 测试中找不到任何覆盖率结果。有没有人设法从“正常”的 junit 测试中获得覆盖?
    【解决方案2】:

    我为此创建了一个open source plugin

    根 build.gradle

    apply plugin: "com.vanniktech.android.junit.jacoco"
    
    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.3.0'
        }
    }
    

    然后直接执行

    ./gradlew jacocoTestReportDebug // or jacocoTestReportRelease
    

    它将运行 JUnit 测试,然后在相应的构建目录中为您提供 xml 和 html 格式的 Jacoco 输出,用于调试构建类型。

    【讨论】:

    • 您的插件是否在处理多项目 android 应用程序的总覆盖率报告?
    【解决方案3】:

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

    android {
       buildTypes {
          debug {
             testCoverageEnabled = true
          }
       }
    }
    

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

    ./gradlew createDebugCoverageReport
    

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

    gradlew.bat createDebugCoverageReport
    

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

    /build/outputs/reports/coverage/debug/
    

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

    如下图所示。

    【讨论】:

    • 您是否生成了包含单元测试和 Android 测试(仪器测试)的报告?
    【解决方案4】:

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

    我要补充的是:

    Google 发布了新的构建工具,修复了令人讨厌的“VerifyError”(link) 问题。

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

    android {
        ......
        buildToolsVersion '21.1.1'
        .....
    }
    

    由于 21.0.0 构建工具有问题,请使用高于 21.0.0 的版本。我用的是 21.1.1。

    【讨论】:

      【解决方案5】:

      如果您想使用与默认版本不同的版本,请添加

      jacoco {
          version = '0.7.3.201502191951'
      }
      

      在您应用的build.gradleandroid 标记内。

      查找最新版本号的一种方法:在JCenter 上搜索“org.jacoco:jacoco”。

      【讨论】:

      • Android Gradle Plugin 1.0.0 中的默认版本现在是 0.7.1.201405082137。
      • @BetterShao 我有点挣扎,如果我运行gradlew createDebugCoverageReport 我没有收到任何报告。有什么诀窍?
      • @Niklas 遵循公认的答案就足够了。一个问题:您使用的是 Robolectric 还是默认的 Android 测试框架?我注意到您正在尝试对 Robolectric 的一些依赖。此问题应仅与 Android 测试框架有关。
      • @Niklas createDebugCoverageReport 是为 android 测试(仪器测试)创建覆盖率报告的默认任务,它使用 Jacoco 生成覆盖率报告。如果您使用的是 Robolectric,恕我直言,您需要编写自己的任务来执行测试并生成测试/覆盖报告。
      • @Niklas createDebugCoverageReport 任务仅在 build.grade 具有以下声明时才会出现: buildTypes{ debug{ testCoverageEnabled true } }
      猜你喜欢
      • 2015-08-03
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      相关资源
      最近更新 更多