Jacoco生成测试报告而非代码覆盖率报告的问题排查
我帮你梳理几个常见的排查方向和解决办法,应该能搞定这个问题:
检查Jacoco插件的配置完整性
光引入插件和开启testCoverageEnabled=true还不够,得确保配置完整的覆盖率报告规则。在app模块的build.gradle里补充这些配置试试:plugins { id 'com.android.application' id 'jacoco' } android { buildTypes { debug { testCoverageEnabled true } } } jacoco { toolVersion = "0.8.10" // 使用最新稳定版,避免版本兼容坑 } // 自定义覆盖率报告任务,整合单元测试和插桩测试的覆盖率数据 task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'createDebugCoverageReport']) { reports { xml.required = true html.required = true } // 过滤掉不需要统计覆盖率的文件 def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*'] def debugTree = fileTree(dir: "${buildDir}/intermediates/javac/debug", excludes: fileFilter) def mainSrc = "${project.projectDir}/src/main/java" sourceDirectories.setFrom(files([mainSrc])) classDirectories.setFrom(files([debugTree])) executionData.setFrom(fileTree(dir: "$buildDir", includes: [ "jacoco/testDebugUnitTest.exec", "outputs/code_coverage/debugAndroidTest/connected/*coverage.ec" ])) }确认AndroidJacocoTestRunner的配置生效
你添加了自定义Runner,但得在build.gradle里指定它才能生效,不然系统还是用默认的测试运行器:android { defaultConfig { testInstrumentationRunner "com.yourpackage.AndroidJacocoTestRunner" // 其他配置... } }另外检查下
AndroidJacocoTestRunner的代码,新版本Jacoco可能不需要手动启动Runtime,试试简化版:import androidx.test.runner.AndroidJUnitRunner; public class AndroidJacocoTestRunner extends AndroidJUnitRunner { // 不需要额外代码,继承即可 }旧版本可能需要加
RT.startRuntime(),但现在很多版本已经自动处理了,去掉试试说不定能解决问题。确保执行了完整的测试任务
单独跑createDebugCoverageReport可能没数据,因为这个任务依赖测试执行的结果。建议先跑testDebugUnitTest(单元测试)和connectedDebugAndroidTest(插桩测试),确保所有测试都正常跑完,再跑createDebugCoverageReport,或者直接跑我们上面自定义的jacocoTestReport任务,它会自动依赖前面的测试任务。检查覆盖率数据文件是否存在
去app/build/outputs/code_coverage/debugAndroidTest/connected/目录看看有没有coverage.ec,再去app/build/jacoco/看看有没有testDebugUnitTest.exec。如果这两个文件不存在,说明测试没收集到覆盖率数据,得先排查测试能不能正常运行,有没有测试失败导致任务中断。排除版本兼容和混淆干扰
确保Jacoco版本和Android Gradle插件版本匹配,比如AGP 7.x+建议用Jacoco 0.8.7及以上。另外Debug模式下尽量关闭混淆,如果必须开,要在混淆规则里保留Jacoco相关类:android { buildTypes { debug { minifyEnabled false // 优先关混淆,避免影响覆盖率收集 // 若开混淆,添加测试混淆规则 testProguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-test-rules.pro' } } }在
proguard-test-rules.pro里加:-keep class org.jacoco.** { *; }
内容的提问来源于stack exchange,提问作者satish reddy

