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
相关产品推荐
相关产品推荐

