我正在使用Gradle -scoverage与多项目Gradle构建。我想利用这样一个事实:项目b的测试在项目a中执行代码。但是gradle-scoverage 7.0.0并没有在:projectB的覆盖率报告中显示:projectA中相关行的任何代码覆盖率,并且:projectA的覆盖率报告只是针对那个项目的。
我在GitHub问题跟踪器中找到了一个建议的解决方案:
project(':projectA').tasks.reportScoverage.dependsOn(project(':projectB').tasks.reportScoverage)
,但它没有工作。第一个问题是在执行顶级项目的构建时还没有创建任务。因为gradle-scoverage插件应用于每个gradle项目的构建。Gradle文件。
所以我试着把那行移动到项目b的构建中。Gradle文件,并将其改为:
project(':projectA').tasks.reportScoverage.dependsOn(tasks.reportScoverage)
但是依赖关系不起作用,因为当reportScoverage
任务以期望的顺序执行时,reportTestScoverage
任务以相反的顺序执行。所以我改成:
project(':projectA').tasks.reportTestScoverage.dependsOn(tasks.reportTestScoverage)
但是Gradle又抱怨找不到reportTestScoverage
任务。
因此,按照这里的建议,我重新构建了它:
项目(":projectA").tasks.reportTestScoverage.dependsOn (projectB: reportTestScoverage)
但是,尽管现在项目b的reportTestScoverage
任务首先运行,仍然没有显示项目a中相关行的代码覆盖率。我已经通过在IntelliJ调试器的projectB中运行相关测试验证了这行是否被击中。
然后我意识到我忘了加上:
scoverage project(path: ':projectA', configuration: 'scoverage')
到projectB的依赖项,如GitHub问题注释中提到的。但是加上这个也没有什么区别。
每次尝试后我都运行gradlew clean build
。
我不能使用IntelliJ调试scoverage的字节码增强,但是通过使用jdbc,我可以看到,当运行项目b的测试时,相关行显示没有覆盖的类没有被scoverage检测。
通过使用Gradle的--debug
选项,我能够看到scoverage编译任务在测试执行之前没有被运行。
所以,除了上面的修改,我还需要修改:
scoverage project(path: ':projectA', configuration: 'scoverage')
:
scoverage project(':projectA').sourceSets.scoverage.output