Android Studio无法查看Kotlin项目代码覆盖率报告求助
解决Kotlin+Mockito单元测试覆盖率报告不显示的问题
看起来你的单元测试能正常运行,但覆盖率报告无法生成,这在Kotlin Android项目里很常见,主要是因为默认的覆盖率工具对本地单元测试(test目录下)的Kotlin代码支持有限,需要配置JaCoCo来解决。下面是一步步的解决方案:
1. 添加JaCoCo插件与配置
默认的testCoverageEnabled主要针对Instrumented测试(androidTest目录),本地单元测试需要JaCoCo来收集覆盖率数据。修改你的模块级build.gradle:
// 顶部添加JaCoCo插件 apply plugin: 'jacoco' // 配置JaCoCo版本(选一个兼容的版本,这里用0.8.7示例) jacoco { toolVersion = "0.8.7" } android { // ... 你的其他配置 buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } debug { testCoverageEnabled true } } // 配置单元测试的JaCoCo参数,解决Kotlin无位置类的问题 testOptions { unitTests.all { jacoco { includeNoLocationClasses = true } } } } dependencies { // ... 你的现有依赖 // 可选:添加Kotlin测试扩展,让测试更顺畅 testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" } // 创建生成本地单元测试覆盖率报告的任务 task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) { reports { xml.enabled = true html.enabled = true // 生成可视化的HTML报告 } // 过滤不需要统计的类(比如R类、BuildConfig、测试类等) def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*'] // 包含Java编译后的类 def debugTree = fileTree(dir: "${buildDir}/intermediates/javac/debug", excludes: fileFilter) // 包含Kotlin编译后的类(关键:Kotlin代码的类文件在这里) def kotlinDebugTree = fileTree(dir: "${buildDir}/tmp/kotlin-classes/debug", excludes: fileFilter) // 设置源码目录、类目录和执行数据路径 sourceDirectories.setFrom(files([android.sourceSets.main.java.srcDirs, android.sourceSets.main.kotlin.srcDirs])) classDirectories.setFrom(files([debugTree, kotlinDebugTree])) executionData.setFrom(fileTree(dir: buildDir, includes: [ 'jacoco/testDebugUnitTest.exec', 'outputs/code_coverage/debugAndroidTest/connected/*coverage.ec' ])) }
2. 检查Run Configuration的覆盖率设置
确保你的测试配置正确包含了目标类:
- 打开
Run/Debug Configurations,找到你的LoginViewModelTest配置 - 切换到
Coverage标签页 - 在
Choose coverage by:选项中,选择All classes in project,或者手动添加com.example.testcasesdemo.LoginViewModel到包含列表 - 确认
Track test coverage选项已勾选
3. 生成并查看覆盖率报告
有两种方式生成报告:
- 方式1:运行JaCoCo任务:在Android Studio的Gradle面板中,找到
Tasks > verification > jacocoTestReport,双击运行。报告生成后,会在build/reports/jacoco/jacocoTestReport/html目录下,打开index.html就能看到可视化的覆盖率数据。 - 方式2:直接运行测试并覆盖:右键点击你的测试类,选择
Run 'LoginViewModelTest' with Coverage,完成后Android Studio会直接在IDE中显示覆盖率结果。
额外提示
- 你的测试类可以简化RunWith注解:把
@RunWith(JUnit4::class)换成@RunWith(MockitoJUnitRunner::class),这样可以去掉MockitoAnnotations.initMocks(this)代码,更简洁。 - 目前你的测试只覆盖了
validatePassword和validateEmail方法,onPasswordTextChanged和onEmailTextChanged还没有被测试,补充这些测试可以提升覆盖率。
内容的提问来源于stack exchange,提问作者Android_programmer_office
相关产品推荐
相关产品推荐

