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

