I use Jacoco, Sonar, Maven to report unit test coverage, this is a springboot project and please see my project arch as below:
web
|-src/test/java --unit test classes
|-target/
|-pom.xml
service
|-pom.xml
pom.xml
target
|-sonar
|-jacoco.exec
My maven config in parent pom.xml:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.8</version>
<configuration>
<destFile>${project.basedir}/../target/jacoco.exec</destFile>
<append>true</append>
</configuration>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
web/pom.xml:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M4</version>
<configuration>
<skipTests>false</skipTests>
<redirectTestOutputToFile>true</redirectTestOutputToFile>
<testFailureIgnore>true</testFailureIgnore>
<argLine>${argLine}</argLine>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit4</artifactId>
<version>3.0.0-M4</version>
</dependency>
</dependencies>
</plugin>
Step 1: run mvn clean org.jacoco:jacoco-maven-plugin:0.7.8:prepare-agent package -Dmaven.test.failure.ignore=true -q
file jacoco.exec was generated in folder target/jacoco.exec
Step 2: run below cmd:
mvn sonar:sonar -Dsonar.projectKey="projectName" -Dsonar.login={key} -Dsonar.host.url=http://ip:port -Dsonar.jdbc.url=jdbc:postgresql://ip:port/sonar -Dsonar.java.binaries=target/sonar
sonar folder was generated
sonar
|-.sonar_lock
|-projectName.pdf
|-report-task.txt
I checked projectName.pdf,sonar analysis was there but test coverage was 0, only unit test count is correct, then i open Sonarqube find test coverage also 0.
Finally, i checked sonar log and found below log: No Jacoco...
mvn sonar:sonar log:
[INFO] Sensor JaCoCoSensor [java]
[WARNING] Property 'sonar.jacoco.reportPaths' is deprecated (JaCoCo binary format). 'sonar.coverage.jacoco.xmlReportPaths' should be used instead (JaCoCo XML format).
[INFO] No JaCoCo analysis of project coverage can be done since there are no class files.
[INFO] Sensor JaCoCoSensor [java] (done) | time=1ms
[INFO] Sensor JavaXmlSensor [java]
Question:
- Why sonar couldn't find Jacoco class files, does it find jacoco.exec or other file.
- How to genetate unit test coverage in Sonar.
Thanks!
sonar.jacoco.reportPathsshould refer to classes that code compiled, so i copied classes fromweb/target/classestotarget/classes, then updatesonar.jacoco.reportPaths=target/classes, rerunmvn sonar:sonar..., it can findjacoco.execand code coverage in sonarqube is correct, will check how to run it without copy classes from web/target/classes. - Rollsbean