Jacoco和Unit使用android-gradle-plugin> = 1.1测试代码覆盖率

Ser*_*ici 36 android unit-testing jacoco android-gradle-plugin

我最近开始android-gradle-plugin在我的一个项目中集成1.1.0.该项目用于robolectric 2.4运行单元测试.

这是一个具有非常复杂依赖关系的多模块项目(某些模块依赖于其他模块).像这样的东西:

--> application-module (dependsOn: module1, module2, module-core)
    --> module1 (dependsOn: module-core)
    --> module2 (dependsOn: module-core)
    --> module-core (dependsOn: module3, module4)
        --> module3 (library dependencies)
        --> module4 (library dependencies)
Run Code Online (Sandbox Code Playgroud)

有关更清晰的图片,请参阅jacoco-example项目.

我试图集成JaCoCo来生成单元测试的报告,但在我看来,它只运行androidTests基本上是仪器测试.

经过一些谷歌搜索后,我遇到了一些关于GitHub和其他文章的项目,但他们主要关注的是以前的版本,android-gradle-plugin或者正在使用其他第三方插件android-unit-test ,例如这里.

可能是我失去了谷歌的能力.但有人能指出我可以找到一些关于android gradle插件中的新内容以及如何仅针对单元测试运行jacoco任务的文档吗?

UPDATE

采用了nenick的例子中的脚本:

apply plugin: "jacoco"

configurations {
    jacocoReport
}

task jacocoReport(dependsOn: 'testDebug') << {
    ant {
        taskdef(name:'jacocoreport',
                classname: 'org.jacoco.ant.ReportTask',
                classpath: configurations.jacocoReport.asPath)

        mkdir dir: "${buildDir}/test-coverage-report"
        mkdir dir: "${buildDir}/reports/jacoco/test/"

        jacocoreport {
            executiondata = files("${buildDir}/jacoco/testDebug.exec")

            structure(name: "${rootProject.name}") {
                classfiles {
                    fileset (dir: "${buildDir}/intermediates/classes/debug") {
                        //exclude(name: '**/*_*.class')
                        exclude(name: '**/R.class')
                        exclude(name: '**/R$*.class')
                        exclude(name: '**/BuildConfig.class')
                    }
                }

                sourcefiles {
                    fileset dir: "src/main/java"
                    fileset dir: "${buildDir}/generated/source/buildConfig/debug"
                    fileset dir: "${buildDir}/generated/source/r/debug"
                }
            }

            xml destfile: "${buildDir}/reports/jacoco/test/jacocoTestReport.xml"
            html destdir: "${buildDir}/test-coverage-report/"
        }
    }
}

dependencies {
    jacocoReport 'org.jacoco:org.jacoco.ant:0.7.2.201409121644'
}
Run Code Online (Sandbox Code Playgroud)

之后./gradlew jacocoReport执行并生成报告,但它显示0(零)测试覆盖率,这是不可能的,因为至少有一半的类被测试.

UPDATE_2

试过这个例子.将下一个任务添加到我的一个gradle构建文件中:

task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
    group = "Reporting"
    description = "Generate Jacoco coverage reports"

    classDirectories = fileTree(
            dir: "${buildDir}/intermediates/classes/debug",
            excludes: ['**/R.class',
                       '**/R$*.class',
                       '**/*$ViewInjector*.*',
                       '**/BuildConfig.*',
                       '**/Manifest*.*']
    )

    sourceDirectories = files("${buildDir.parent}/src/main/java")
    additionalSourceDirs = files([
            "${buildDir}/generated/source/buildConfig/debug",
            "${buildDir}/generated/source/r/debug"
    ])
    executionData = files("${buildDir}/jacoco/testDebug.exec")

    reports {
        xml.enabled = true
        html.enabled = true
    }
}
Run Code Online (Sandbox Code Playgroud)

同样的问题,生成了报告,但代码覆盖率仍为零.

UPDATE_3

它接收来自UPDATE_2的任务有效,但仅适用于具有apply plugin: 'com.android.application'(正确生成报告)的模块.但对于android库(apply plugin: 'com.android.library')的模块,报告显示零覆盖,尽管模块包含更多测试,然后是应用程序模块.

UPDATE_4

创建了一个演示我的问题的简单示例项目.目前,如果运行./gradlew jacocoReport生成报告,则不会为模块项目显示测试覆盖率.看到这个链接

简短说明:当测试是AndroidUnitTests(whiteout JUnit 4和Robolectric)时,JaCoCo报告显示所有模块的覆盖范围.

有任何想法吗?

Nik*_*las 14

麻烦之后我决定为此创建一个开源Gradle插件.

Root build.gradle

buildscript {
    repositories {
        mavenCentral() // optional if you have this one already
    }
    dependencies {
        classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.8.0'
    }
}

apply plugin: 'com.vanniktech.android.junit.jacoco'
Run Code Online (Sandbox Code Playgroud)

然后简单地执行

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

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

它还支持口味.有两种颜色的红色和蓝色这些任务将被创建

  • jacocoTestReportRedDebug
  • jacocoTestReportBlueDebug
  • jacocoTestReportRedRelease
  • jacocoTestReportBlueRelease


Ser*_*ici 8

在进行了一些额外的搜索之后,我偶然发现了这个项目, 我不得不进行一些修改,以便解决方案可以适用于我的项目类型,但现在可以正确生成测试覆盖率报告.

我已将所采用的更改推送到我的示例github repo,以防将来有人遇到类似的问题.

  • 你能告诉我们这些修改是什么以及你偶然发现了什么! (3认同)