为多项目构建中的多个 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
我正在使用 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