多模块Maven Jacoco设置用于集成测试

4
我已经设置了多个模块的Maven,设置看起来像这样:

root module
  - domain module 
  - repository module 
  - service module 
  - controllers module

Jacoco能够正确地生成单元测试的测试覆盖率,Sonar显示的百分比也是正确的(假设为20%)。我们使用Surefire进行单元测试。
对于集成测试,情况就有些棘手了。我们使用Failsafe,并且集成测试会生成“jacoco-it.exec”文件,该文件将被Sonar扫描。我的问题是,集成测试位于“controllers module”中,它只会显示位于控制器内的集成测试的测试覆盖率,而不是其他模块中的类,例如服务模块中的类。因此,整体的测试覆盖率包括集成测试仅增加到21%,而不是35%以上。
如果集成测试位于“controllers module”中,则可能配置Sonar和Jacoco以测量所有类的集成测试的测试覆盖率,而不仅仅是同一模块中的类。
以下是相关设置的参考资料。
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
...
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.9</version>
<executions>
    <execution>
        <id>pre-unit-test</id>
        <goals>
            <goal>prepare-agent</goal>
        </goals>
        <configuration>
            <destFile>${project.build.directory}/jacoco.exec</destFile>
            <propertyName>surefireArgLine</propertyName>
        </configuration>
    </execution>

    <execution>
        <id>pre-integration-test</id>
        <phase>pre-integration-test</phase>
        <goals>
            <goal>prepare-agent</goal>
        </goals>
        <configuration>
            <destFile>${project.build.directory}/jacoco-it.exec</destFile>
            <propertyName>failsafeArgLine</propertyName>
        </configuration>
    </execution>
</executions>
</plugin>

我使用mvn verify来运行测试,并使用mvn sonar:sonar扫描器。

1个回答

3
你可以将所有覆盖率报告写入同一个目标文件来聚合它们。
例如,我们目前只在多模块项目中进行单元测试覆盖率,因此我们的父POM包含:
<properties>
    ...
    <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
    ...
</properties>

并且
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <configuration>
                <destFile>${sonar.jacoco.reportPath}</destFile>
                <append>true</append>
            </configuration>
            <inherited>true</inherited>
            <executions>
                <execution>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

这将导致所有模块的单个汇总报告。我认为类似的模式可以应用于您的jacoco IT配置。

这并不是同一个问题。在你的情况下,你有单元测试在模块内部,每个单元测试对应于来自同一模块的类。所以一切都很好,sonar正在进行实际的聚合,就像你提到的那样。而在我的情况下,我在module4中有集成测试,也测试了module1、2和3中的类,jacoco-it.exec仅包含有关module4中类的执行详细信息。因此,sonar将无法将它们合并。 - Bojan Trajkovski
严格来说,我们的单元测试在很多情况下实际上是集成测试,因为它们实际上调用了其他模块的代码,并且我们确实收集了生成的代码覆盖率。 - Steve C
我刚试过了,它可以工作。这部分非常聪明 <append>true</append> 并写在根模块中。谢谢 @Steve C - Bojan Trajkovski
我该如何设置我的父POM和子POM,以将我的集成测试合并到一个文件中?在我的子POM中,我添加了<sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/../target/coverage-merged.exec</sonar.coverage.jacoco.xmlReportPaths>,但我应该在我的父POM中添加什么? - Rom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接