How to fail a maven build, if JUnit coverage falls below certain threshold How to fail a maven build, if JUnit coverage falls below certain threshold jenkins jenkins

How to fail a maven build, if JUnit coverage falls below certain threshold


JaCoCo offers that feature.

JaCoCo with Configuration rules

Define JaCoCo plugin using configuration rules COVEREDRATIO forLINE and BRANCH :

<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>

Various options

The supported counter options are:

  • LINE
  • BRANCH
  • INSTRUCTION
  • COMPLEXITY
  • METHOD
  • CLASS

I believe INSTRUCTION would allow you to make a general check (verify that the whole project has at least 0.80 of coverage for instance).

Example with INSTRUCTION - overall instruction coverage of 80%

This example requires an overall instruction coverage of 80% and no class must be missed:

<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>

Message on failure

If the coverage isn't as expected, it fails with the following message:

[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] ------------------------------------------------------------------------

Exclusions

In the example above, I set <exclude>com.xyz.ClassToExclude</exclude>. I think you'll find you need to add many exclusions. Projects usually contain many classes which aren't testable/tested (Spring Configuration, Java beans...). You may be able to use regular expression too.


sources:


If you are using 0.8.2 or similar versions of jacoco-maven-plugin, please make sure data file is defined, and use the following configuration for the 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>

This code ensures overall coverage of 17%.

Please verify this using

mvn clean verify

command.


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>