如果 JUnit 覆盖率低于特定阈值,如何使 maven 构建失败具有配置规则的 JaCoCo 多种选择失败消息排除

2022-09-02 09:04:35

我从声纳休息 API 获取单元测试覆盖率百分比指标。

如果生成低于定义的值,我该如何使生成失败?


答案 1

JaCoCo提供该功能。

具有配置规则的 JaCoCo

使用 和 的配置规则定义 JaCoCo 插件:COVEREDRATIOLINEBRANCH

<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.7.7.201606060606</version>
  <executions>
    <execution>
      <id>default-prepare-agent</id>
      <goals>
        <goal>prepare-agent</goal>
      </goals>
    </execution>
    <execution>
      <id>check</id>
      <goals>
          <goal>check</goal>
      </goals>
      <configuration>
        <rules>
          <rule>
            <element>CLASS</element>
            <limits>
              <limit>
                <counter>LINE</counter>
                <value>COVEREDRATIO</value>
                <minimum>0.80</minimum>
              </limit>
              <limit>
                <counter>BRANCH</counter>
                <value>COVEREDRATIO</value>
                <minimum>0.80</minimum>
              </limit>
            </limits>
            <excludes>
              <exclude>com.xyz.ClassToExclude</exclude>
            </excludes>
          </rule>
        </rules>
      </configuration>
    </execution>
  </executions>
</plugin>

多种选择

支持的选项包括:counter

  • 线
  • 分支
  • 指令
  • 复杂性
  • 方法

我相信可以让你进行一般检查(例如,验证整个项目至少有0.80的覆盖范围)。INSTRUCTION

带指令的示例 - 总指令覆盖率为 80%

此示例要求总体指令覆盖率为 80%,并且不能错过任何类:

<rules>
  <rule implementation="org.jacoco.maven.RuleConfiguration">
    <element>BUNDLE</element>
    <limits>
      <limit implementation="org.jacoco.report.check.Limit">
        <counter>INSTRUCTION</counter>
        <value>COVEREDRATIO</value>
        <minimum>0.80</minimum>
      </limit>
      <limit implementation="org.jacoco.report.check.Limit">
        <counter>CLASS</counter>
        <value>MISSEDCOUNT</value>
        <maximum>0</maximum>
      </limit>
    </limits>
  </rule>
</rules>

失败消息

如果覆盖范围不符合预期,则会失败,并显示以下消息:

[WARNING] Rule violated for class com.sampleapp.SpringConfiguration: lines covered ratio is 0.00, but expected minimum is 0.80
[WARNING] Rule violated for class com.sampleapp.Launcher: lines covered ratio is 0.33, but expected minimum is 0.80
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

排除

在上面的示例中,我设置了 .我想你会发现你需要添加很多排除项。项目通常包含许多不可测试/测试的类(Spring Configuration,Java beans...)。您也可以使用正则表达式。<exclude>com.xyz.ClassToExclude</exclude>


来源:


答案 2

如果您使用的是 0.8.2 或类似版本的 jacoco-maven 插件,请确保定义了数据文件,并对插件使用以下配置。

<execution>
  <id>jacoco-check</id>
  <goals>
    <goal>check</goal>
  </goals>
  <configuration>
    <dataFile>${project.build.directory}/coverage-reports/jacoco.exec</dataFile>
    <rules>
      <rule>
        <element>BUNDLE</element>
        <limits>
          <limit>
            <counter>INSTRUCTION</counter>
            <value>COVEREDRATIO</value>
            <minimum>0.17</minimum>
          </limit>
        </limits>
      </rule>
    </rules>
  </configuration>
</execution>

此代码可确保总体覆盖率达到 17%。

请使用

mvn clean verify

命令。


推荐