首页 > 解决方案 > Sonar/Jacoco 测量的测试覆盖率会因每次提交而无明显原因下降

问题描述

我有一个带有声纳集成的 SpringBoot Maven 多模块项目,配置如下:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    ...
    <sonar.projectKey>${project.artifactId}</sonar.projectKey>
    <sonar.projectName>${project.artifactId}</sonar.projectName>
    <sonar.sources>src/</sonar.sources>
    <sonar.tests>src/test/</sonar.tests>
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.jacoco.reportPaths>${project.basedir}/target/jacoco.exec</sonar.jacoco.reportPaths>
    <sonar.language>java</sonar.language>
    <sonar.exclusions>**/test/**/*</sonar.exclusions>
</properties>
...
<plugins>
    <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.9</version>
    <configuration>
        <destFile>${sonar.jacoco.reportPaths}</destFile>
        <append>true</append>
    </configuration>
    <executions>
        <execution>
            <id>jacoco-initialize</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <output>file</output>
                <destFile>${sonar.jacoco.reportPaths}</destFile>
            </configuration>
        </execution>
        <execution>
            <id>jacoco-site</id>
            <phase>package</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <dataFile>${sonar.jacoco.reportPaths}</dataFile>
                <outputDirectory>${project.basedir}/../target/</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

现在我遇到了一个奇怪的现象,即这个项目的测试覆盖率(根据 JaCoCo)随着时间的推移而下降。提交只更改一行(之前覆盖和之后覆盖)可能会导致覆盖率降低 0.1%。

这是在重构模块结构之后开始的;在每个子模块以 SpringBoot 作为父模块之前,它被记录为(真正的)父模块的子模块。我改变了它,现在每个模块都将父模块作为父模块,并通过 maven 插件插入 SpringBoot。到目前为止效果很好;只有在那之后,单元测试的数量才下降了 5 个;而记录每个模块的测试。我还无法确定缺少哪些测试,因为我们在这个项目中有数百个测试。

并且(如前所述)随着每次代码更改,检测到的覆盖率都会降低。在模块重构之前显示了近 80% 的覆盖率;现在它已经下降到 26%,没有添加太多代码或删除测试。

更新:我在构建日志中发现了一些警告:

[警告] 以下类与执行数据不匹配:

...

[警告] 为了获得准确的覆盖率度量,必须使用与运行时相同的类文件来生成报告。

[INFO] 没有关于每次测试覆盖率的信息。

给出的是一些类的列表,但到目前为止还不是全部。它们来自任何子模块。我做错了什么?我怎么能对某些类使用另一个编译器/构建链或其他东西?这些不是由其他代理检测的。

标签: spring-bootsonarqubejacocomaven-surefire-plugin

解决方案


推荐阅读