Don*_*rty 7 java testing android 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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个设置,我可以得到覆盖报告,但我得到0%的覆盖率,尽管在"的src/test/java下"有Robolectric测试.
如果我将以下代码添加到该文件:
android {
testOptions {
unitTests.all {
jacoco {
includeNoLocationClasses = true
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我很确定我使用Android插件版本1.5运行Gradle 2.13
在我的应用程序Gradle文件中,我有以下内容:
//...
apply from: 'jacoco.gradle'
//..
testOptions {
unitTests.returnDefaultValues = true
}
//...
debug {
testCoverageEnabled true
}
Run Code Online (Sandbox Code Playgroud)
我用来运行覆盖的命令是:
./gradlew createDebugCoverageReport
所以我想知道为什么我使用正确的Gradle版本时会得到includeNoLocationClasses错误?除此之外,我可能做错了,Jacoco没有在src/test.java中接受Robolectric测试?
我没有build.gradle完全看到你,但要在你身上留下那面旗帜:
2.13+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:...'
}
}
Run Code Online (Sandbox Code Playgroud)
你应该应用插件,你已经在做了:
apply from: 'jacoco'
Run Code Online (Sandbox Code Playgroud)
在这样的配置之后你不需要jacoco {toolVersion = "..."}更多.
注意:考虑更新到更新的android gradle插件,2.2.x已经稳定了.jacoco也有更新的版本0.7.7.201606060606
还有一点需要注意:如果您在Android Studio中看到原始问题,请检查您是否默认使用包装器,并检查您是否将包装器指向gradle 2.13