我试图在Android中利用Jacoco实现对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尝试同步时,我会收到以下错误:
错误:对于类org.gradle.testing.jacoco.plugins.JacocoTaskExtension_Decorated,不存在includeNoLocationClasses属性。
我知道我需要使用includeNoLocationClasses值的Gradle版本为2.13。因此在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
我非常确定我正在使用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测试?