Introduction to Cobertura
In this article, we will demonstrate several aspects of generating code coverage reports using Cobertura.
Simply put, Cobertura is a reporting tool that calculates test coverage for a codebase – the percentage of branches/lines accessed by unit tests in a Java project.
2. Maven Plugin
<reporting> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> <version>2.7</version> </plugin> </plugins> </reporting>
You can always check the latest version of the plugin in the Maven central repository.
Once done, go ahead and run Maven specifying cobertura:cobertura as a goal.
This will create a detailed HTML style report showing code coverage statistics gathered via code instrumentation:
The line coverage metric shows how many statements are executed in the Unit Tests run, while the branch coverage metric focuses on how many branches are covered by those tests.
For each conditional, you have two branches, so basically, you’ll end up having twice as many branches as conditionals.
The complexity factor reflects the complexity of the code — it goes up when the number of branches in code increases.
In theory, the more branches you have, the more tests you need to implement in order to increase the branch coverage score.
2.2. Configuring Code Coverage Calculation and Checks
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> <version>2.7</version> <configuration> <instrumentation> <ignores> <ignore>com/baeldung/algorithms/dijkstra/*</ignore> </ignores> <excludes> <exclude>com/baeldung/algorithms/dijkstra/*</exclude> </excludes> </instrumentation> </configuration> </plugin>
After calculating the code coverage comes the check phase. The check phase ensures that a certain level of code coverage is reached.
Here’s a basic example on how to configure the check phase:
<configuration> <check> <haltOnFailure>true</haltOnFailure> <branchRate>75</branchRate> <lineRate>85</lineRate> <totalBranchRate>75</totalBranchRate> <totalLineRate>85</totalLineRate> <packageLineRate>75</packageLineRate> <packageBranchRate>85</packageBranchRate> <regexes> <regex> <pattern>com.baeldung.algorithms.dijkstra.*</pattern> <branchRate>60</branchRate> <lineRate>50</lineRate> </regex> </regexes> </check> </configuration>
When using the haltOnFailure flag, Cobertura will cause the build to fail if one of the specified checks fail.
The branchRate/lineRate tags specify the minimum acceptable branch/line coverage score required after code instrumentation. These checks can be expanded to the package level using the packageLineRate/packageBranchRate tags.
It is also possible to declare specific rule checks for classes with names following a specific pattern by using the regex tag. In the example above, we ensure that a specific line/branch coverage score must be reached for classes in the com.baeldung.algorithms.dijkstra package and below.
3. Eclipse Plugin
Step 1: From the Eclipse menu, select Help → Install New Software. Then, at the work with the field, enter http://ecobertura.johoop.de/update/:
Step 2: Select eCobertura Code Coverage, click “next”, and then follow the steps in the installation wizard.
Now that eCobertura is installed, restart Eclipse and show the coverage session view under Windows → Show View → Other → Cobertura.
3.2. Using Eclipse Kepler or Later
For the newer version of Eclipse (Kepler, Luna, etc.), the installation of eCobertura may cause some problems related to JUnit — the newer version of JUnit packaged with Eclipse is not fully compatible with eCobertura‘s dependencies checker:
Cannot complete the install because one or more required items could not be found. Software being installed: eCobertura 0.9.8.201007202152 (ecobertura.feature.group 0.9.8.201007202152) Missing requirement: eCobertura UI 0.9.8.201007202152 (ecobertura.ui 0.9.8.201007202152) requires 'bundle org.junit4 0.0.0' but it could not be found Cannot satisfy dependency: From: eCobertura 0.9.8.201007202152 (ecobertura.feature.group 0.9.8.201007202152) To: ecobertura.ui [0.9.8.201007202152]
As a workaround, you can download an older version JUnit and place it into the Eclipse plugins folder.
This can be done by deleting the folder org.junit.*** from %ECLIPSE_HOME%/plugins, and then copying the same folder from an older Eclipse installation that is compatible with eCobertura.
Once done, restart your Eclipse IDE and re-install the plugin using the corresponding update site.
3.3. Code Coverage Reports in Eclipse
Under the Coverage Session view, you can check the line/branch coverage report per class:
Java 8 users may encounter a common error when calculating code coverage:
java.lang.VerifyError: Expecting a stackmap frame at branch target ...
In this case, Java is complaining about some methods not having a proper stack map, due to the stricter bytecode verifier introduced in newer versions of Java.
This issue can be solved by disabling verification in the Java Virtual Machine.
To do so, right-click your project to open the context menu, select Cover As, and then open the Coverage Configurations view. In the arguments tab, add the -noverify flag as a VM argument. Finally, click on the coverage button to launch coverage calculation.
You can also use the flag -XX:-UseSplitVerifier, but this only works with Java 6 and 7, as the split verifier is no longer supported in Java 8.
Cobertura is a great yet simple code coverage tool, but not actively maintained, as it is currently outclassed by newer and more powerful tools like JaCoCo.
Finally, you can check out the example provided in this article in the GitHub project.