Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 41 Next »

Table of Contents

There are two different ways to feed SonarQube with information on unit tests execution and code coverage:

  • Use its embedded engine to let SonarQube launch the unit test and code coverage execution directly. Then, the analyzer will automatically feed the database with data exported from the generated reports. (Maven only)
  • Reusing existing reports that have been previously generated by external tools.

Project samples covering the different cases below are available on github that can be browsed or downloadedprojects/code-coverage/

See Component Viewer on Unit Test File or Quality Flows > Lack of Unit Tests to browse the results in the web interface.

Using SonarQube Embedded Engine

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.

Compile

Icon

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:

Add this to your pom file:

Maven Project

With Maven, then, you just have to tell SonarQube which code coverage engine you wish to use: jacoco or cobertura or emma or clover.

Note that this property can be set at the SonarQube instance level through the web interface: Settings > Configuration > General Settings > Java.

Sample projects are available on github that can be browsed or downloaded:

  • Maven and JaCoCo: projects/code-coverage/ut/maven/ut-maven-jacoco-runTests
  • Maven and Cobertura: projects/code-coverage/ut/maven/ut-maven-cobertura-runTests
  • Maven and Emma: projects/code-coverage/ut/maven/ut-maven-emma-runTests

Maven Multi-module Project and JaCoCo

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.

 

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:

  • Which files are covered by a given unit test?
  • How many lines of code are covered by a given unit test?
  • Which lines are covered by a given unit test?
  • Which tests cover a given line of code?

See Component Viewer on Unit Test File for more details.

A sample project is available on github that can be browsed or downloadedprojects/code-coverage/ut/maven/ut-maven-jacoco-runTests. What you need to add to your pom.xml to get this behavior 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:

  • JUnit 4.7+
  • Maven Surefire Plugin 2.4+ 

Reusing Existing Reports

Every analyzer supports the reuse reports mode.

To be reused by SonarQube:

  • The tests execution reports have to comply to the JUnit XML format.
  • The code coverage reports have to be generated by JaCoCo, Emma, Cobertura or Clover.

Sample projects are available on github that can be browsed or downloaded:

  • SonarQube Runner and JaCoCo: projects/code-coverage/ut/sonar-runner/ut-sonarRunner-jacoco-reuseReports
  • Maven and JaCoCo: projects/code-coverage/ut/maven/ut-maven-jacoco-reuseReports
  • Maven and Emma: projects/code-coverage/ut/maven/ut-maven-emma-reuseReports
  • Ant and JaCoCo: projects/code-coverage/ut/ant/ut-ant-jacoco-reuseReports
  • Ant and JaCoCo (JaCoCo report generated with the JaCoCo Ant Task): projects/code-coverage/ut/ant/ut-ant-jacoco-runTests
  • Ant and JaCoCo, multi-module project (JaCoCo report generated with the JaCoCo Ant Task): projects/code-coverage/ut/ant/ut-ant-jacoco-modules-runTests

First, tell SonarQube to reuse existing reports:

With Maven in your pom.xml file:

With Ant in your build.xml file:

With SonarQube Runner in your sonar-project.properties file:

Test Execution Reports

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:

With Ant in your build file:

With SonarQube Runner in your sonar-project.properties file:

Code Coverage Report 

First, tell SonarQube which code coverage engine has been used to generate the reports: jacoco, cobertura, emma or clover.

Then, tell SonarQube where to get the code coverage reports.

With Maven in your pom file:

With Ant in your build file:

With SonarQube Runner in your sonar-project.properties file:

Depending on the code coverage tool you used to generate your report, replace jacoco by emma, cobertura or clover in the property name.

FAQ

0% code coverage reported, but unit tests are correctly executed

This problem occurs while using the Maven Cobertura Plugin and a special configuration of the Maven Surefire Plugin prevents the unit tests from being forked. This problem can be solved by removing the line "<forkMode>never</forkMode>" in the Maven configuration file (see SONAR-1445 and MCOBERTURA-70).

java.lang.Error: Unable to access JaCoCo Agent - make sure that you use JaCoCo and version not lower than 0.6.2

There can be several reasons for this error:
  • Make sure that you do NOT set 'forkMode' to 'never' on the Surefire plugin - otherwise it will not fork the process and no JaCoCo agent will be attached.
pom.xml

 

  • Make sure that you call first 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.

 

 

  • No labels