0

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

我在 GitHub 问题跟踪器中找到了一个建议的解决方案:

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

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

所以我尝试将该行移至 projectB 的 build.gradle 文件,并将其更改为:

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

但是随后依赖关系不起作用,因为虽然reportScoverage任务以期望的顺序reportTestScoverage执行,但任务以相反的顺序执行。所以我把它改成:

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

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

所以,按照这里的建议,我再次构建它:

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

但是,虽然现在 projectB 的reportTestScoverage任务首先运行,但仍然没有显示 projectA 中相关行的代码覆盖率。我已经通过在 IntelliJ 调试器中的 projectB 中运行相关测试来验证该行是否命中。

然后我意识到我忘记添加:

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

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

gradlew clean build每次尝试后我都会跑。

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

4

1 回答 1

0

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

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

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

至:

scoverage project(':projectA').sourceSets.scoverage.output
于 2021-08-28T16:57:19.560 回答