You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:24:33