Android - Jacoco 代码覆盖忽略 Robolectric 测试

Android - Jacoco code coverage ignores Robolectric tests

尝试使用 Jacoco 在 Android 中获取我的 Robolectric 测试的代码覆盖率,但它在创建报告时拒绝承认我的 Robolectric 测试。

我的jacoco.gradle文件如下:

apply plugin: 'jacoco'

jacoco {
    toolVersion = "0.7.6.201602180812"
}

project.afterEvaluate {

    android.applicationVariants.all { variant ->
        def name = variant.name
        def testTaskName = "test${name.capitalize()}UnitTest"

        tasks.create(name: "${testTaskName}Coverage", type: JacocoReport, dependsOn: "$testTaskName") {
            group = "Reporting"
            description = "Generate Jacoco coverage reports for the ${name.capitalize()} build."

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

            sourceDirectories = files(['src/main/java'].plus(android.sourceSets[name].java.srcDirs))
            executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec")

            reports {
                xml.enabled = true
                html.enabled = true
            }
        }
    }
}

通过此设置,我可以获得覆盖率报告,但尽管在 "src/test/java" 中进行了 Robolectric 测试,但我的覆盖率仍为 0%。

如果我在该文件中添加以下代码:

android {
    testOptions {
        unitTests.all {
            jacoco {
                includeNoLocationClasses = true
            }
        }
    }
}

我在 Gradle 尝试同步时收到以下错误:

Error:No such property: includeNoLocationClasses for class: org.gradle.testing.jacoco.plugins.JacocoTaskExtension_Decorated

我知道我需要 Gradle 2.13 才能使用这个 includeNoLocationClasses 值,所以在 gradle-wrapper.properties 我有以下内容:

#Wed Apr 10 15:27:10 PDT 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-2.13-20160228000026+0000-all.zip

我很确定我 运行宁 Gradle 2.13 与 Android 插件版本 1.5

在我的应用 Gradle 文件中,我有以下内容:

//...

apply from: 'jacoco.gradle'

//..

testOptions {
    unitTests.returnDefaultValues = true
}

//...

debug {
    testCoverageEnabled true
}

我用来 运行 覆盖的命令是:

./gradlew createDebugCoverageReport

所以我想知道为什么尽管使用了正确的 Gradle 版本我还是会收到 includeNoLocationClasses 错误?除此之外,也许我做错了什么,Jacoco 没有在 src/test.java ?

中接受 Robolectric 测试

我没有完全看到你 build.gradle,但是要在你身上有那个标志,你必须:

  1. 使用gradle2.13+
  2. 使用jacoco0.7.6.201602180812

您确定您使用的是gradle正确的版本。所以,我认为,问题只在于使用错误的 jacoco

提及 jacoco {toolVersion = "0.7.6.201602180812"} 不会影响 gradle DSL。您应该添加更新的 jacoco 插件:

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'org.jacoco:org.jacoco.core:...'
    }
}

并且您应该应用插件,您已经在这样做了:

apply from: 'jacoco'

经过这样的配置后,您不再需要 jacoco {toolVersion = "..."}

注意:考虑更新到更新的android gradle插件,2.2.x已经稳定了。 jacoco 也已经有了更新的版本 0.7.7.201606060606

请注意:如果您在 Android Studio 中看到原始问题,请检查您是否默认使用 wrapper 并检查您是否将 wrapper 指向 gradle 2.13