Android单元测试覆盖率始终为0,如何解决该问题?
解决Jacoco覆盖率报告为0的问题
针对AGP 7.4.2、Gradle 7.5、Java 11环境下的Groovy配置,按以下步骤排查解决:
指定兼容的Jacoco版本
在项目根目录的build.gradle中显式配置Jacoco版本,避免AGP默认版本与Java 11不兼容:buildscript { repositories { google() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:7.4.2' classpath 'org.jacoco:org.jacoco.core:0.8.7' // 适配AGP 7.4.2的稳定版本 } }配置单元测试的Jacoco兼容性参数
在模块级build.gradle的android块中添加Java 11适配的测试配置,解决类位置信息缺失的问题:android { // ... 已有配置(buildTypes等) testOptions { unitTests.all { jacoco { includeNoLocationClasses = true // 处理Java 11模块系统导致的类无位置信息问题 excludes = ['jdk.internal.*'] // 排除JDK内部类,避免干扰覆盖率统计 } } } }确保测试任务被正确触发
直接执行createDebugUnitTestCoverageReport可能不会自动运行单元测试,改为执行包含测试任务的完整命令:./gradlew clean debugUnitTest createDebugUnitTestCoverageReport验证覆盖率数据文件并自定义报告配置
先检查模块目录下build/jacoco/debugUnitTest.exec文件是否存在且非空:- 若文件为空:说明单元测试未执行或未正确收集覆盖率数据,需检查测试类是否符合命名规范(默认要求以
Test结尾)、测试任务是否正常运行。 - 若文件正常:可手动配置Jacoco报告任务,确保源文件和类文件路径正确:
执行jacoco { toolVersion = "0.8.7" } task customJacocoReport(type: JacocoReport, dependsOn: ['debugUnitTest']) { reports { xml.required = true html.required = true html.destination file("${buildDir}/reports/coverage/customDebug") } // 过滤不需要统计的类 def excludeFilters = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*'] // 指定被测试类的目录 def debugClassDir = fileTree(dir: "${buildDir}/intermediates/javac/debug/classes", excludes: excludeFilters) // 指定源码目录 def mainSrcDir = "${project.projectDir}/src/main/java" sourceDirectories.setFrom(files([mainSrcDir])) classDirectories.setFrom(files([debugClassDir])) // 指定覆盖率数据文件 executionData.setFrom(file("${buildDir}/jacoco/debugUnitTest.exec")) }./gradlew clean customJacocoReport生成自定义报告,查看是否正常统计覆盖率。
- 若文件为空:说明单元测试未执行或未正确收集覆盖率数据,需检查测试类是否符合命名规范(默认要求以
内容的提问来源于stack exchange,提问作者B3n
相关产品推荐
相关产品推荐

