Android Studio中Jacoco未统计Robolectric测试代码覆盖率问题
解决Robolectric单元测试未被Jacoco覆盖率统计的问题
针对你的环境(AGP 7.2.0、Gradle 7.4.2、Robolectric 4.10.3),需要补充Jacoco的核心配置,确保本地单元测试的代码插桩和覆盖率收集正常工作,具体修改如下:
1. 启用Jacoco插件
在模块级build.gradle的plugins块中添加Jacoco插件:
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("jacoco") // 新增Jacoco插件 }
2. 配置测试覆盖率与Robolectric兼容项
在android块内补充以下配置:
android { // ... 保留原有配置(namespace、compileSdk、defaultConfig等) buildTypes { debug { isTestCoverageEnabled = true // 开启Debug变体的测试覆盖率收集 } release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } // 配置Jacoco版本,避免AGP自带版本与Robolectric的兼容问题 jacoco { toolVersion = "0.8.8" // 可使用0.8.8+的稳定版本 } testOptions { unitTests { isIncludeAndroidResources = true // Robolectric访问资源必需,同时确保测试被正确识别 all { testTask -> testTask.jacoco { isIncludeNoLocationClasses = true // 解决Robolectric类无位置信息导致的覆盖率丢失问题 // 排除JDK/R8生成类的警告,避免干扰统计 excludeClassLoaders = listOf("sun.misc.Launcher$AppClassLoader", "com.android.tools.r8.GeneratedClassLoader") } } } } }
3. 生成并查看覆盖率报告
执行以下Gradle命令运行测试并生成覆盖率报告:
./gradlew clean jacocoTestDebugUnitTestReport
报告生成后,可在路径模块名/build/reports/jacoco/jacocoTestDebugUnitTestReport/html/index.html中打开查看,此时Robolectric测试覆盖的代码会被正常统计。
关键注意事项
- 必须基于Debug变体运行测试,Release变体默认不开启覆盖率收集(即使你关闭了混淆)
- 确保Robolectric测试类位于
src/test/java目录下(本地单元测试目录),而非src/androidTest/java(Instrumented测试目录) - 若仍存在统计缺失,可尝试清理构建缓存后重新运行测试:
./gradlew clean testDebugUnitTest jacocoTestDebugUnitTestReport
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

