当我的所有测试都在单独的子模块中时,如何使用gradle插件获得Jacoco覆盖率报告
由于我是gradle的新手,我在为我的java项目设置jacoco覆盖方面遇到了麻烦。我的最终目标是将此连接到sonarqube。我所有的测试都在一个单独的模块中 结构:当我的所有测试都在单独的子模块中时,如何使用gradle插件获得Jacoco覆盖率报告,gradle,sonarqube,build.gradle,jacoco,jacoco-plugin,Gradle,Sonarqube,Build.gradle,Jacoco,Jacoco Plugin,由于我是gradle的新手,我在为我的java项目设置jacoco覆盖方面遇到了麻烦。我的最终目标是将此连接到sonarqube。我所有的测试都在一个单独的模块中 结构: ./build.gradle settings.gradle ./submodule1/build.gradle ./submodule1/src/main/java/prismoskills/Foo.java ./submodule2/build.gradle ./submodule2/src/main/java/com
./build.gradle
settings.gradle
./submodule1/build.gradle
./submodule1/src/main/java/prismoskills/Foo.java
./submodule2/build.gradle
./submodule2/src/main/java/com/project/prismoskills/Bar.java
./test/build.gradle
./test/src/test/java/prismoskills/TestFooBar.java
我能想到的一种方法是在测试模块中设置additionalSourceDirs,并仅在根和测试模块中启用jacoco
这种方法的问题是,我的项目有很多子模块(我在这里没有显示),我很难以自动化的方式将额外的SourceDir传递给测试模块的JacoReport任务
此外,通过参考以下内容,似乎可以在maven中轻松处理此用例
任何关于如何与gradle进一步合作的线索都将不胜感激。提前谢谢
gradle version: 6.4
jacoco gradle plugin version: 0.8.5
可以在根项目的build.gradle中定义以下内容。Jacoco插件将应用于所有子模块
subprojects{
plugins{
id 'java'
id 'jacoco'
}
test.finalizedBy jacocoTestReport
}
我认为下面的解决方案应该能解决你的问题。其想法是:
plugins {
id 'base'
id 'org.sonarqube' version '3.0'
}
allprojects {
apply plugin: 'jacoco'
apply plugin: 'project-report'
// ...
jacoco {
toolVersion = 0.8.5
}
}
subprojects {
// ...
test {
reports.html.enabled = false
useJunitPlatform()
finalizedBy jacocoTestReport
}
jacocoTestReport {
dependsOn test
reports.html.enabled = false
}
}
// ...
task testReport(type: TestReport) {
destinationDir = file("${buildDir}/reports/test")
reportOn subprojects*.test
}
task jacocoTestReport(type: JacocoReport) {
subprojects { subproject ->
subproject.tasks.findAll { it.extensions.findByType(JacocoTaskExtension) }.each { extendedTask ->
configure {
sourceSets subproject.sourceSets.main
if (file("${subproject.buildDir}/jacoco/${extendedTask.name}.exec").exists()) {
executionData(extendedTask)
}
}
}
}
reports.xml.enabled = true
}
rootProject.getTasksByName('test', true).each {
it.finalizedBy(testReport)
it.finalizedBy(jacocoTestReport)
}
这条线
if (file("${subproject.buildDir}/jacoco/${extendedTask.name}.exec").exists()) {
当某些子项目根本没有测试时,添加了以防止生成失败。我已经声明,我的源代码位于不同的模块中。所以这对@dexter2305I没有帮助,我知道您的源代码在不同的模块中,这就是为什么我在子项目下定义了插件(用渐变术语)。在您自己的示例中,提到了表示子项目的“子模块”。仅供参考,我一直在我的项目中使用相同的方法来表示jacoco reports.dexter-定义正确。如果矿山在“子项目”下,则其工作正常