首页 文章

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

提问于
浏览
36

我正在尝试使用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.+'
}

而project的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覆盖报告有什么遗漏吗?

5 回答

  • 3

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

    jacoco {
        version = '0.7.3.201502191951'
    }
    

    在应用的 build.gradle 中的 android 标记内 .

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

  • 96

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

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

    另外,从gradle插件source code开始,该插件默认使用jacoco 0.6.2.201302030002 . (因此, jacoco version definition is not required 如果您打算使用默认版本)

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

    • Android gradle插件版本 0.10.0 或更高版本(通常在您项目的 build.gradle 中)

    • testCoverageEnabled true 添加到您想要的构建类型(即 debug

    • 运行 $ 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

    提示:

    由于您只能使用 emulatordevice 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.
    
  • 6

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

    我想补充的是:

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

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

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

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

  • 6

    我为此创建了open source plugin .

    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'
        }
    }
    

    然后简单地执行

    ./gradlew jacocoTestReportDebug // or jacocoTestReportRelease
    

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

  • 2

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

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

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

    ./gradlew createDebugCoverageReport
    

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

    gradlew.bat createDebugCoverageReport
    

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

    /build/outputs/reports/coverage/debug/
    

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

    它看起来如下图所示 .

    enter image description here

    有关Android应用程序中测试覆盖率报告的文章http://blog.wittchen.biz.pl/test-coverage-report-for-android-application/

相关问题