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

时间:2016-06-25 17:55:59

标签: java android testing robolectric jacoco

尝试使用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
            }
        }
    }
}

通过这种设置,我可以获得Coverage报告,但我获得了0%的覆盖率,尽管在“src / test / java”中进行了Robolectric测试。

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

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

Gradle尝试同步时出现以下错误:

  

错误:没有这样的属性:class的includeNoLocationClasses:   org.gradle.testing.jacoco.plugins.JacocoTaskExtension_Decorated

我知道我需要让Gradle 2.13使用这个includeNoLocationClasses值,所以在graddle-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

我很确定我正在使用Android插件版本1.5运行Gradle 2.13

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

//...

apply from: 'jacoco.gradle'

//..

testOptions {
    unitTests.returnDefaultValues = true
}

//...

debug {
    testCoverageEnabled true
}

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

  

./ gradlew createDebugCoverageReport

所以我想知道为什么我使用正确的Gradle版本时会得到includeNoLocationClasses错误?除此之外,我可能做错了,Jacoco没有在src / test.java中进行Robolectric测试?

1 个答案:

答案 0 :(得分:6)

我完全没有见到你build.gradle,但要在你身上留下那面旗帜:

  1. 使用 gradle 2.13+
  2. 使用 jacoco 0.7.6.201602180812
  3. 您确定使用 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中看到原始问题,请检查您是否默认使用包装器并检查您是否将包装器指向gradle 2.13