我将 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 检测。