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

Gradle多项目构建如何实现跨模块scoverage代码覆盖率统计?

跨项目gradle-scoverage覆盖率统计完整配置方案

1. 核心问题根因

排查到的projectA类在projectB测试运行时未插桩是核心问题,主要由两个配置错误导致:

  • scoverage依赖配置的作用范围错误,未正确引入projectA的插桩产物
  • 任务依赖绑定时机过早,直接访问未创建的任务导致配置失效

2. 分步配置修正

2.1 顶层build.gradle统一配置插件

在根项目build.gradle中添加插件预配置,避免子项目单独引入导致的任务找不到问题:

plugins {
    id 'org.scoverage' version '7.0.0' apply false
}

subprojects {
    apply plugin: 'org.scoverage'
    scoverage {
        enabled = true
    }
}

2.2 修正projectB的依赖配置

将scoverage依赖放在projectB的dependencies块内,同时保留原有普通依赖:

dependencies {
    // 原有普通业务依赖不要删除
    implementation project(':projectA')
    // 新增scoverage插桩产物依赖
    scoverage project(path: ':projectA', configuration: 'scoverage')
}

2.3 修正任务依赖绑定逻辑

使用Gradle懒加载API绑定任务依赖,避免任务未创建的报错,将以下代码放在projectB的build.gradle末尾即可:

project(':projectA').tasks.named('reportTestScoverage') {
    dependsOn tasks.named('reportTestScoverage')
}

2.4 可选:生成合并覆盖率报告

如果需要在同一份报告中查看所有子项目的覆盖数据,可以在根项目build.gradle中添加合并报告任务:

task aggregateScoverage(type: org.scoverage.ScoverageAggregate) {
    dependsOn subprojects.tasks.withType(org.scoverage.ScoverageReport)
    scoverageExecutionFiles = files(subprojects.collect { it.file("${it.buildDir}/reports/scoverage") })
    outputDir = file("${buildDir}/reports/scoverage-aggregate")
}

3. 执行验证

运行以下命令重新构建生成报告:

gradlew clean aggregateScoverage

执行完成后到根项目的build/reports/scoverage-aggregate目录查看报告,即可看到projectB测试调用projectA代码的覆盖率数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:09:00