Lon*_*ngi 20 android code-coverage robolectric jacoco
我想在我的android项目中生成我的JUnit测试的代码覆盖率报告,所以我添加了JaCoCo gradle插件.这是我的项目级build.gradle文件:
apply plugin: 'jacoco'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0-beta6'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
allprojects {
repositories {
jcenter()
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
subprojects { prj ->
apply plugin: 'jacoco'
jacoco {
toolVersion '0.7.6.201602180812'
}
task jacocoReport(type: JacocoReport, dependsOn: 'testDebugUnitTest') {
group = 'Reporting'
description = 'Generate Jacoco coverage reports after running tests.'
reports {
xml {
enabled = true
destination "${prj.buildDir}/reports/jacoco/jacoco.xml"
}
html {
enabled = true
destination "${prj.buildDir}/reports/jacoco"
}
}
classDirectories = fileTree(
dir: 'build/intermediates/classes/debug',
excludes: [
'**/R*.class',
'**/BuildConfig*',
'**/*$$*'
]
)
sourceDirectories = files('src/main/java')
executionData = files('build/jacoco/testDebugUnitTest.exec')
doFirst {
files('build/intermediates/classes/debug').getFiles().each { file ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}
}
}
jacoco {
toolVersion '0.7.6.201602180812'
}
task jacocoFullReport(type: JacocoReport, group: 'Coverage reports') {
group = 'Reporting'
description = 'Generates an aggregate report from all subprojects'
//noinspection GrUnresolvedAccess
dependsOn(subprojects.jacocoReport)
additionalSourceDirs = project.files(subprojects.jacocoReport.sourceDirectories)
sourceDirectories = project.files(subprojects.jacocoReport.sourceDirectories)
classDirectories = project.files(subprojects.jacocoReport.classDirectories)
executionData = project.files(subprojects.jacocoReport.executionData)
reports {
xml {
enabled = true
destination "${buildDir}/reports/jacoco/full/jacoco.xml"
}
html {
enabled = true
destination "${buildDir}/reports/jacoco/full"
}
}
doFirst {
//noinspection GroovyAssignabilityCheck
executionData = files(executionData.findAll { it.exists() })
}
}
Run Code Online (Sandbox Code Playgroud)
它运行起来很棒./gradlew jacocoFullReport.但遗憾的是,没有报告使用的测试报告(测试RobolectricTestRunner中明显调用的指令未报告为覆盖).没有@RunWith注释的测试或运行MockitoJUnitTestRunner报告覆盖率就好了.
任何帮助将不胜感激,以解决这个问题.
更新1:我注意到我应该使用RobolectricGradleTestRunner.但它没有帮助.
Eug*_*nov 16
已知问题可能的解决方法 - https://github.com/jacoco/jacoco/pull/288
或者将jacoco版本降级为0.7.1.201405082137
UPDATE
不再需要解决方法.您必须使用gradle版本2.13和jacoco版本0.7.6.201602180812.
更新根目录build.gradle:
buildscript {
dependencies {
classpath 'org.jacoco:org.jacoco.core:0.7.6.201602180812'
}
}
task wrapper( type: Wrapper ) {
gradleVersion = '2.13'
}
Run Code Online (Sandbox Code Playgroud)
跑 ./gradlew wrapper
更新项目build.gradle:
apply plugin: 'jacoco'
android {
testOptions {
unitTests.all {
jacoco {
includeNoLocationClasses = true
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
接受的答案有点过时了。这是我们刚刚实施的类似修复。在模块(即 app)build.gradle 中添加:
apply plugin: 'jacoco'
tasks.withType(Test) {
jacoco.includeNoLocationClasses = true
}
Run Code Online (Sandbox Code Playgroud)
这确实需要 JaCoCo 7.6+,但您可能已经在使用它。
工作室注意事项:
| 归档时间: |
|
| 查看次数: |
4271 次 |
| 最近记录: |