This example shows how to generate coverage for unit and integration tests using Maven and Sonar.It uses very simple techniques and should only take 10-15 minutes to get running in any existing Maven build.It can be used across unit, integration, ATDD or any other kind of test suite. The coverage results are shown in Sonar. Whats Coming?My previous post showed how we to use JUnit categories to easily split unit and integration test suites.https://johndobie.blogspot.com/2012/04/unit-and-integration-tests-with-maven.html The next logical step is to be able to look at metrics for each test suite.This example shows how to do that using Jacoco and Sonar. CodeThe code for the example is here. svn co <a href="https://designbycontract.googlecode.com/svn/trunk/examples/maven/categories-sonar">https://designbycontract.googlecode.com/svn/trunk/examples/maven/categor...</a> mvn clean install sonar:sonar Sonar.This example relies on Sonar to show the code coverage metrics. Sonar is a fanatastic open source code quality tool that everyone should have a look at.https://www.sonarsource.org/ For our example there are a couple of simple configuration changes that are needed.The following link shows how to install Sonar and make the changeshttps://johndobie.blogspot.com/p/setting-up-sonar.html Splitting The Test Suites.This example relies on JUnit categories to split our tests. We define a marker interface and then apply it to the tests we want to split. public interface IntegrationTest {} The category annotation is added to your test class. It takes the name of your new interface.import org.junit.experimental.categories.Category; @Category(IntegrationTest.class) public class ExampleIntegrationTest{ @Test public void longRunningServiceTest() throws Exception { } } The whole process is very simple and is fully explained herehttps://johndobie.blogspot.com/2012/04/unit-and-integration-tests-with-maven.html Analyzing The Code CoverageWe use the jacoco plugin to do the code coverage. There is an overview of Jacoco here.https://johndobie.blogspot.com/2012/01/unit-test-code-coverage.htmlWe first define the directories for the jacoco coverage files. <coverage.reports.dir> ${basedir}/target/coverage-reports </coverage.reports.dir> <sonar.jacoco.reportPath> ${coverage.reports.dir}/jacoco-unit.exec </sonar.jacoco.reportPath> <sonar.jacoco.itReportPath> ${coverage.reports.dir}/jacoco-it.exec </sonar.jacoco.itReportPath> <sonar.jacoco.jar> ${basedir}/lib/jacocoagent.jar </sonar.jacoco.jar> Configure the Unit TestsThen we start the unit tests by running the standard the surefire plugin with the Jacoco agent pointing to ${sonar.jacoco.reportPath}. This is used to store the unit test code coverage results. <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.7.2</version> <configuration> <argLine>-javaagent:${sonar.jacoco.jar}=destfile=${sonar.jacoco.reportPath},includes=com.*</argLine> <includes> <include>**/*.class</include> </includes> <excludedGroups>com.test.annotation.type.IntegrationTest</excludedGroups> </configuration> </plugin> we ignore any marked integration tests with the following config <excludedGroups>com.test.annotation.type.IntegrationTest</excludedGroups> Configure the integration testsFor the Integration tests we use the failsafe plugin and point the Jacoco agent to ${sonar.jacoco.itReportPath} . This is used to store the integration test code coverage results.<plugin> <plugin> <artifactId>maven-failsafe-plugin</artifactId> <version>2.12</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.12</version> </dependency> </dependencies> <configuration> <groups>com.test.annotation.type.IntegrationTest</groups> </configuration> <executions> <execution> <goals> <goal>integration-test</goal> </goals> <configuration> <argLine>-javaagent:${sonar.jacoco.jar}=destfile=${sonar.jacoco.itReportPath},includes=com.*</argLine> <includes> <include>**/*.class</include> </includes> </configuration> </execution> </executions> </plugin> We also tell the plugin to use the correct JUnit categories <configuration> <groups>com.test.annotation.type.IntegrationTest</groups> </configuration> When these are run they will produce the following 2 coverage files. Start Sonar.Before running the build you need to start your Sonar server. https://johndobie.blogspot.com/p/setting-up-sonar.html Running The ExampleWe can run the whole lot using the following command mvn clean install sonar:sonar You will see the following results if you browse to your sonar instance. Java