多模块 Gradle 项目中的 Jacoco 覆盖范围不包括子模块

问题描述 投票:0回答:1

我正在开发一个多模块 Gradle (8.7) 项目,其结构如下:一个模块充当主应用程序,而其他模块是该应用程序使用的库。所有单元测试都位于应用程序模块内。尽管这些测试覆盖了库模块中的代码路径,但 Jacoco 似乎没有为这些子模块生成覆盖率报告,从而导致覆盖率指标不准确。 结构如下:

repository-root/
└── application/
    ├── app/
    │   ├── src/
    │   │   ├── main/
    │   │   │   └── java/
    │   │   └── test/
    │   └── build.gradle.kts
    ├── common/
    │   ├── src/
    │   │   └── main/
    │   │       └── java/
    │   └── build.gradle.kts
    └── build.gradle.kts

问题: 主要问题:尽管进行了涵盖库模块代码的测试,但 Jacoco 的报告仅反映了应用程序模块的覆盖范围。 目标:获得准确包含所有模块数据的覆盖率报告,反映通过在应用程序模块中运行的测试实现的真实覆盖率。

我尝试通过在应用程序模块的 build.gradle 的 app/build.gradle.kts 中配置 jacocoTestReport 任务来包含库模块之一(:common)的覆盖范围,如下所示:

tasks.jacocoTestReport {
    val common = project(":common")
    dependsOn(tasks.test)
    dependsOn(common.tasks.test)
    classDirectories.setFrom(
        files("$buildDir/classes/java/main"),
        files("${common.buildDir}/classes/java/main"))
    sourceDirectories.setFrom(
        files("${projectDir}src/main/java"),
        files("${common.projectDir}/src/main/java"))
    executionData.setFrom(
        files("$buildDir/jacoco/test.exec"),
        files("${common.buildDir}/jacoco/test.exec"))
    reports {
        xml.required.set(true)
        csv.required.set(false)
        html.required.set(true)
    }
}

我想指出,我在某个论坛上找到了这个解决方案,但我的公共模块中没有生成 test.exec 。因此,我在其他问题上发现的其他解决方案(例如生成聚合 RootReport)可能不适合我的情况。

java spring-boot gradle sonarqube jacoco
1个回答
0
投票

您的公共项目不会创建任何执行文件,因为它不包含任何要执行的测试。 但是,由于 jacoco 在测试执行时记录了任何类的覆盖率,您只需告诉您感兴趣的报告即可。
最简单的方法是

tasks {
  jacocoTestReport {
    classDirectories.from(project(":common").tasks.compileJava)
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.