当我的所有测试都在单独的子模块中时,如何使用gradle插件获得Jacoco覆盖率报告

当我的所有测试都在单独的子模块中时,如何使用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

由于我是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/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
}

我认为下面的解决方案应该能解决你的问题。其想法是:

  • 为每个项目生成JaCoCo exec文件
  • 最后生成一个包含所有数据的XML报告
  • 对于JUnit报告也是如此,因为在根项目中一起查看所有测试报告比在目录之间导航更容易

    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-定义正确。如果矿山在“子项目”下,则其工作正常