为多项目构建中的多个 Gradle 项目贡献代码覆盖率

Contribute scoverage code coverage to multiple Gradle projects in a multi-project build

我正在使用 gradle-scoverage 进行多项目 Gradle 构建。我想利用 :projectB 的测试练习 :projectA 中的代码这一事实。但是 gradle-scoverage 7.0.0 在 :projectB 的覆盖率报告中没有显示 :projectA 中相关行的任何代码覆盖率,并且 :projectA 的覆盖率报告仅针对该项目。

我在 GitHub 问题跟踪器中找到了 a proposed solution

project(':projectA').tasks.reportScoverage.dependsOn(project(':projectB').tasks.reportScoverage)

但是没用。第一个问题是在执行顶级项目的 build.gradle 文件时任务还没有创建,因为 gradle-scoverage 插件被应用到每个 Gradle 项目的 build.gradle 单独归档。

所以我尝试将该行移动到项目 B 的 build.gradle 文件,并将其更改为:

project(':projectA').tasks.reportScoverage.dependsOn(tasks.reportScoverage)

但是依赖关系不起作用,因为虽然 reportScoverage 任务按所需顺序执行,但 reportTestScoverage 任务按相反顺序执行。所以我将其更改为:

project(':projectA').tasks.reportTestScoverage.dependsOn(tasks.reportTestScoverage)

但是 Gradle 再次抱怨找不到 reportTestScoverage 任务。

所以,按照建议 here,我再次构建它:

project(':projectA').tasks.reportTestScoverage.dependsOn(':projectB:reportTestScoverage')

但是尽管现在项目B 的reportTestScoverage 任务首先运行,但仍然没有显示项目A 中相关行的代码覆盖率。我已验证该行被 IntelliJ 调试器中的 运行 projectB 中的相关测试击中。

然后才发现忘记补充了:

scoverage project(path: ':projectA', configuration: 'scoverage')

到 projectB 的依赖项,如 GitHub 问题评论中所述。但是添加这个没有任何区别。

每次尝试后我运行gradlew clean build

我无法使用 IntelliJ 调试 scoverage 的字节码增强,但是通过使用 jdb,我可以看到当 运行 projectB 的测试时,class 相关行显示没有覆盖, 还没有被 scoverage 检测到。

通过使用 Gradle 的 --debug 选项,我能够看到在测试执行之前没有 运行 scoverage 编译任务。

因此,除了上述更改外,我还需要更改:

scoverage project(path: ':projectA', configuration: 'scoverage')

至:

scoverage project(':projectA').sourceSets.scoverage.output