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

AndroidStudio 3.0中如何获取AndroidTest目录下测试的代码覆盖率?

解决AndroidTest目录测试及Espresso的代码覆盖率问题

我完全懂你的处境——把依赖Android框架的测试(不管是需要调用DB方法的仪器测试,还是Espresso UI测试)放在androidTest目录是合理的,但默认的代码覆盖率工具往往只盯着test目录的单元测试。不用迁移测试,下面这几个方案能帮你拿到想要的覆盖率数据:

方案1:配置Gradle生成AndroidTest专属覆盖率报告

Android Gradle插件原生支持为androidTest的测试生成覆盖率报告,你只需要在模块的构建脚本里做如下配置:

Groovy版本(build.gradle)

android {
    buildTypes {
        debug {
            testCoverageEnabled true // 开启debug构建的覆盖率 instrumentation
        }
    }

    testOptions {
        unitTests.all {
            // 可选:如果需要同时兼容单元测试的覆盖率统计,保留这行
            jacoco.includeNoLocationClasses = true
        }
        animationsDisabled = true // 可选:关闭系统动画,让Espresso测试更稳定
    }
}

// 自定义任务:生成包含AndroidTest测试的覆盖率报告
task androidTestCoverageReport(type: JacocoReport, dependsOn: ['connectedDebugAndroidTest']) {
    reports {
        xml.required true // 生成XML格式报告(用于CI工具)
        html.required true // 生成HTML可视化报告
    }

    // 过滤不需要统计的文件(比如R类、BuildConfig、测试类本身)
    def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'android/**/*.*']
    def debugClassDir = fileTree(dir: "$project.buildDir/intermediates/javac/debug", excludes: fileFilter)
    def mainSourceDir = "$project.projectDir/src/main/java"

    sourceDirectories.setFrom(files([mainSourceDir]))
    classDirectories.setFrom(files([debugClassDir]))
    executionData.setFrom(fileTree(dir: project.buildDir, includes: [
            'outputs/code_coverage/debugAndroidTest/connected/*coverage.ec', // AndroidTest的执行数据
            'jacoco/testDebugUnitTest.exec' // 可选:合并test目录单元测试的覆盖率数据
    ]))
}

Kotlin DSL版本(build.gradle.kts)

android {
    buildTypes {
        debug {
            isTestCoverageEnabled = true
        }
    }

    testOptions {
        unitTests.all {
            jacoco.includeNoLocationClasses = true
        }
        animationsDisabled = true
    }
}

tasks.register<JacocoReport>("androidTestCoverageReport") {
    dependsOn("connectedDebugAndroidTest")

    reports {
        xml.required.set(true)
        html.required.set(true)
    }

    val fileFilter = listOf("**/R.class", "**/R$*.class", "**/BuildConfig.*", "**/Manifest*.*", "**/*Test*.*", "android/**/*.*")
    val debugClassDir = fileTree("${project.buildDir}/intermediates/javac/debug") { exclude(fileFilter) }
    val mainSourceDir = "${project.projectDir}/src/main/java"

    sourceDirectories.setFrom(files(mainSourceDir))
    classDirectories.setFrom(files(debugClassDir))
    executionData.setFrom(fileTree(project.buildDir) {
        include(
            "outputs/code_coverage/debugAndroidTest/connected/*coverage.ec",
            "jacoco/testDebugUnitTest.exec" // 可选:合并单元测试覆盖率
        )
    })
}

使用方式

在终端运行命令:

./gradlew androidTestCoverageReport

执行完成后,HTML格式的报告位于模块/build/reports/jacoco/androidTestCoverageReport/html/index.html,打开后就能看到androidTest目录测试(包括Espresso)覆盖的代码详情。

方案2:直接用Android Studio内置工具快速查看

如果你不想写Gradle任务,Android Studio自带的覆盖率工具可以直接运行androidTest测试并生成报告:

  • 打开Run/Debug Configurations,新建一个Android Instrumented Tests配置
  • 在配置中选择你要运行的测试类/包
  • 切换到Coverage标签页,勾选Enable coverage instrumentation
  • 运行这个配置,测试结束后Android Studio会自动弹出覆盖率面板,直观展示所有被androidTest测试覆盖的代码(包括DB逻辑和Espresso覆盖的UI代码)

方案3:合并AndroidTest与Test目录的覆盖率(可选)

如果需要查看所有测试(单元测试+仪器测试)的总覆盖率,只需要在方案1的Gradle任务中保留jacoco/testDebugUnitTest.exec这一行,运行任务后就能得到合并后的完整覆盖率报告。

关键注意事项

  • 确保测试设备/emulator运行的是debug版本的App,testCoverageEnabled仅在debug构建下生效
  • 依赖Android框架的测试(比如调用Room、ContentProvider的DB测试)必须放在androidTest目录,迁移到test目录会因为缺少Android运行时环境而失败,你的顾虑完全正确
  • 如果项目包含NDK代码,需要额外配置Jacoco支持,但纯Java/Kotlin项目无需此操作

内容的提问来源于stack exchange,提问作者dari1495

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:30:00