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
,但是要在你身上有那个标志,你必须:
- 使用gradle
2.13+
- 使用jacoco
0.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
尝试使用 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
,但是要在你身上有那个标志,你必须:
- 使用gradle
2.13+
- 使用jacoco
0.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