There are two different ways to feed SonarQube with information on unit tests execution and code coverage:
Project samples covering the different cases below are available on github that can be browsed or downloaded: projects/code-coverage/
Maven supports this mode with the following code coverage tools: JaCoCo, Cobertura, Emma and Clover.
The SonarQube Ant Task and the SonarQube Runner do not support this mode.
Before running an analysis with JaCoCo, the source code has to be compiled. |
First, tell SonarQube to execute the unit tests and the code coverage tool:
With Maven in your pom file:
<sonar.dynamicAnalysis>true</sonar.dynamicAnalysis> |
With Maven, then, you just have to tell SonarQube which code coverage engine you wish to use: jacoco or cobertura or emma or clover.
<sonar.java.coveragePlugin>jacoco or cobertura or emma or clover</sonar.java.coveragePlugin> Prior to SonarQube 3.4, the property was sonar.core.codeCoveragePlugin. |
Note that this property can be set at SonarQube instance level through the web interface: Settings > Configuration > General Settings > Java.
Sample projects are available on github that can be browsed or downloaded:
For multi-module Maven projects, compute overall code coverage by unit tests across modules. This case clearly lies between unit tests and integration tests but this is widely used.
Sample projects are available on github that can be browsed or downloaded: projects/code-coverage/combined ut-it/maven/combined-ut-it-multimodule-maven-jacoco
Note that this project structure is not compatible with the below feature: mapping of unit tests and covered code.
Since SonarQube 3.5, it is possible to display the mapping of unit tests and covered code. The objective is to answer the following questions:
A sample project is available on github that can be browsed or downloaded: projects/code-coverage/ut/maven/ut-maven-jacoco-runTests. What is necessary to get this mapping is contained between 'BEGIN/END: Specific to mapping unit tests and covered code' tags in the pom file. Note that you have to run the analysis with the 'coverage-per-test' profile. Read the README file for more information.
Requires:
Every analyzer supports this reusing reports mode.
To be reused by SonarQube :
First, tell SonarQube to reuse existing reports:
With Maven in your pom.xml file:
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis> |
With Ant in your build.xml file:
<property name="sonar.dynamicAnalysis" value="reuseReports" /> |
With SonarQubeRunner in your sonar-project.properties file:
sonar.dynamicAnalysis=reuseReports |
Tell SonarQube where your unit tests execution reports are: absolute or relative path to the directory containing your reports
With Maven in your pom file:
<sonar.surefire.reportsPath>[baseDir]/myReports/myExecutionReports</sonar.surefire.reportsPath> |
With Ant in your build file:
<property name="sonar.surefire.reportsPath" value="[baseDir]/myReports/myExecutionReports" /> |
With SonarQube Runner in your sonar-project.properties file:
sonar.surefire.reportsPath=[baseDir]/myReports/myExecutionReports |
First, tell SonarQube which code coverage engine has been used to generate the reports: jacoco or cobertura or emma or clover.
<sonar.java.coveragePlugin>jacoco or cobertura or emma or clover</sonar.java.coveragePlugin> Prior to SonarQube 3.4, the property was sonar.core.codeCoveragePlugin. |
Then, tell SonarQube where to get the code coverage reports:
With Maven in your pom file:
<sonar.jacoco.reportPath>[baseDir]/myReports/myCodeCoverageReport</sonar.jacoco.reportPath> |
With Ant in your build file:
<property name="sonar.jacoco.reportPath" value="[baseDir]/myReports/myCodeCoverageReport" /> |
With SonarQubeRunner in your sonar-project.properties file:
sonar.jacoco.reportPath=[baseDir]/myReports/myCodeCoverageReport |
Depending on the code coverage tool you used to generate your report, replace jacoco by emma, cobertura or clover in the property name.
This problem occurs while using the Maven Cobertura Plugin and a special configuration of the Maven Surefire Plugin preventing unit tests to be forked. This problem can be solved by removing the line "<forkMode>never</forkMode>" in the Maven configuration file (see SONAR-1445 and MCOBERTURA-70).
... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.4.2</version> <configuration> <forkMode>never</forkMode> <!-- Do not set forkMode to never --> <reportFormat>xml</reportFormat> <testFailureIgnore>true</testFailureIgnore> </configuration> </plugin> ... |
mvn clean install and then mvn sonar:sonar Pcoverage-per-test separately. Indeed, only SonarQube can attach the JaCoCo agent, so mvn clean install sonar:sonar -Pcoverage-per-test will produce the error because the test phase will be executed a first time alone.