如果 JUnit 覆盖率低于某个阈值,如何使 Maven 构建失败
Posted
技术标签:
【中文标题】如果 JUnit 覆盖率低于某个阈值,如何使 Maven 构建失败【英文标题】:How to fail a maven build, if JUnit coverage falls below certain threshold 【发布时间】:2017-06-13 00:04:37 【问题描述】:我从 sonar rest api 获取单元测试覆盖率指标。
如果构建低于定义的值,我怎么会失败?
【问题讨论】:
如果 JUnit 提供者检测到测试错误,Maven 默认会失败。 根据项目的JUnit覆盖率构建失败。不是JUnit自行测试。 Cobertura 怎么样? 【参考方案1】:JaCoCo
提供该功能。
带有配置规则的JaCoCo
使用配置规则 COVEREDRATIO
为LINE
和 BRANCH
定义 JaCoCo 插件:
<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
选项有:
我相信INSTRUCTION
将允许您进行一般检查(例如,验证整个项目至少有 0.80 的覆盖率)。
Example with INSTRUCTION - overall instruction coverage of 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] ------------------------------------------------------------------------
排除
在上面的例子中,我设置了<exclude>com.xyz.ClassToExclude</exclude>
。我想你会发现你需要添加许多排除项。项目通常包含许多不可测试/测试的类(Spring 配置、Java bean ...)。你也可以使用正则表达式。
来源:
http://choudhury.com/blog/2014/02/25/enforcing-minimum-code-coverage http://www.eclemma.org/jacoco/trunk/doc/maven.html http://www.eclemma.org/jacoco/trunk/doc/check-mojo.html【讨论】:
我已经编辑了,我相信您也可以使用 INSTRUCTION(而不是 LINE 或 BRANCH)对项目进行一般检查(例如验证整个项目至少有 0.80 的覆盖率) 使用mvn clean verify
来执行它【参考方案2】:
如果您使用的是 0.8.2 或类似版本的 jacoco-maven-plugin,请确保定义了数据文件,并为插件使用以下配置。
<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 验证
命令。
【讨论】:
【参考方案3】:Specify the datFile location if it is not under default folder.
<execution>
<id>check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<dataFile><path-to-jacoc-ut.exec></dataFile>
<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>
【讨论】:
一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。以上是关于如果 JUnit 覆盖率低于某个阈值,如何使 Maven 构建失败的主要内容,如果未能解决你的问题,请参考以下文章