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

Android单元测试覆盖率始终为0,如何解决该问题?

解决Jacoco覆盖率报告为0的问题

针对AGP 7.4.2、Gradle 7.5、Java 11环境下的Groovy配置,按以下步骤排查解决:

  • 指定兼容的Jacoco版本
    在项目根目录的build.gradle中显式配置Jacoco版本,避免AGP默认版本与Java 11不兼容:

    buildscript {
        repositories {
            google()
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:7.4.2'
            classpath 'org.jacoco:org.jacoco.core:0.8.7' // 适配AGP 7.4.2的稳定版本
        }
    }
    
  • 配置单元测试的Jacoco兼容性参数
    在模块级build.gradle的android块中添加Java 11适配的测试配置,解决类位置信息缺失的问题:

    android {
        // ... 已有配置(buildTypes等)
        
        testOptions {
            unitTests.all {
                jacoco {
                    includeNoLocationClasses = true // 处理Java 11模块系统导致的类无位置信息问题
                    excludes = ['jdk.internal.*'] // 排除JDK内部类,避免干扰覆盖率统计
                }
            }
        }
    }
    
  • 确保测试任务被正确触发
    直接执行createDebugUnitTestCoverageReport可能不会自动运行单元测试,改为执行包含测试任务的完整命令:

    ./gradlew clean debugUnitTest createDebugUnitTestCoverageReport
    
  • 验证覆盖率数据文件并自定义报告配置
    先检查模块目录下build/jacoco/debugUnitTest.exec文件是否存在且非空:

    • 若文件为空:说明单元测试未执行或未正确收集覆盖率数据,需检查测试类是否符合命名规范(默认要求以Test结尾)、测试任务是否正常运行。
    • 若文件正常:可手动配置Jacoco报告任务,确保源文件和类文件路径正确:
      jacoco {
          toolVersion = "0.8.7"
      }
      
      task customJacocoReport(type: JacocoReport, dependsOn: ['debugUnitTest']) {
          reports {
              xml.required = true
              html.required = true
              html.destination file("${buildDir}/reports/coverage/customDebug")
          }
      
          // 过滤不需要统计的类
          def excludeFilters = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*']
          // 指定被测试类的目录
          def debugClassDir = fileTree(dir: "${buildDir}/intermediates/javac/debug/classes", excludes: excludeFilters)
          // 指定源码目录
          def mainSrcDir = "${project.projectDir}/src/main/java"
      
          sourceDirectories.setFrom(files([mainSrcDir]))
          classDirectories.setFrom(files([debugClassDir]))
          // 指定覆盖率数据文件
          executionData.setFrom(file("${buildDir}/jacoco/debugUnitTest.exec"))
      }
      
      执行./gradlew clean customJacocoReport生成自定义报告,查看是否正常统计覆盖率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:45:25