Jenkins上Android插桩测试覆盖率报告问题:JaCoCo版本不兼容
解决Android插桩测试JaCoCo版本不兼容导致的覆盖率报告失败问题
我之前也踩过Gradle插件和JaCoCo版本不兼容的坑,结合你用的Gradle插件3.0.1的场景,给你梳理几个可行的解决方案:
1. 先理清版本匹配的核心问题
你可能混淆了两个容易搞混的“版本”:
- Android Gradle插件(3.0.1)本身依赖特定版本的JaCoCo核心库,3.0.1默认绑定的是JaCoCo 0.7.9
- Jenkins上的JaCoCo插件版本(你提到的3.0.1)是Jenkins插件自身的版本,和JaCoCo核心库版本不是一回事,它需要和项目生成的覆盖率报告格式兼容
所以第一步要强制项目使用和Gradle插件兼容的JaCoCo核心版本,在app/build.gradle里添加:
jacoco { toolVersion = "0.7.9" // 和Gradle 3.0.1完美兼容的版本 }
2. 调整Jenkins JaCoCo插件的配置路径
Android插桩测试(connectedAndroidTest)生成的覆盖率文件路径和普通单元测试不同,你需要在Jenkins的JaCoCo插件设置里指定正确的路径:
- Path to exec files:填
**/coverage.ec(插桩测试生成的二进制覆盖率文件) - Path to class directories:填
app/build/intermediates/classes/debug(编译后的Debug类文件目录) - Path to source directories:填
app/src/main/java(项目源码目录)
如果同时要包含单元测试的覆盖率,再把**/testDebugUnitTest.exec添加到exec文件路径里。
3. 自定义Gradle任务生成Jenkins可识别的报告
如果默认任务生成的报告Jenkins解析有问题,可以自定义一个JacocoReport任务,强制生成标准的XML格式报告(Jenkins对XML的兼容性最好)。在app/build.gradle里添加:
task jacocoTestReport(type: JacocoReport, dependsOn: ['connectedDebugAndroidTest', 'testDebugUnitTest']) { // 开启XML和HTML报告生成 reports { xml.enabled = true html.enabled = true } // 过滤不需要统计覆盖率的文件 def excludeFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*'] def debugClassDir = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: excludeFilter) def mainSourceDir = "${project.projectDir}/src/main/java" // 指定源码、类文件和覆盖率数据文件路径 sourceDirectories.setFrom(files([mainSourceDir])) classDirectories.setFrom(files([debugClassDir])) executionData.setFrom(fileTree(dir: buildDir, includes: [ 'outputs/code-coverage/connected/debugAndroidTest/coverage.ec', 'jacoco/testDebugUnitTest.exec' ])) }
然后在Jenkins的构建步骤里,先执行:
./gradlew clean connectedDebugAndroidTest jacocoTestReport
再让JaCoCo插件读取生成的XML报告,路径是app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml
额外注意事项
- 如果你的项目开启了ProGuard,要在混淆规则里保留测试相关的类,不然覆盖率会缺失:
-keep class com.yourpackage.** { *; } // 替换成你的项目包名 -keep class * extends android.test.InstrumentationTestCase - 确保Jenkins用户有项目build目录的读写权限,不然报告生成会失败
内容的提问来源于stack exchange,提问作者Jean Creuzé des Châtelliers
相关产品推荐
相关产品推荐

