Sonar和Jacoco:由于没有类文件,因此无法对项目覆盖范围进行JaCoCo分析
我使用Jacoco,Sonar,Maven报告单元测试范围,这是一个springboot项目,请查看我的项目架构,如下所示:
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
我在父级pom.xml
中的Maven配置:
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>
第1步:运行mvn clean org.jacoco:jacoco-maven-plugin:0.7.8:prepare-agent package -Dmaven.test.failure.ignore=true -q
文件jacoco.exec
是在文件夹target/jacoco.exec
第2步:在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
|-.sonar_lock
|-projectName.pdf
|-report-task.txt
我检查了projectName.pdf
,存在声纳分析,但测试覆盖率是0,只有单位测试计数正确,然后我打开Sonarqube,发现测试覆盖率也为0.
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.
最后,我检查了声纳记录并发现以下记录:No Jacoco...
Finally, i checked sonar log and found below log: No Jacoco...
mvn sonar:sonar
日志:
[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]
问题 :
- 为什么声纳找不到Jacoco类文件,但找到了jacoco.exec 或其他文件.
- 如何在Sonar中生成单元测试范围.
- Why sonar couldn't find Jacoco class files, does it find jacoco.exec or other file.
- How to genetate unit test coverage in Sonar.
谢谢!
检查后,我解决了此问题.
After checked, i resolved this issue.
解决此问题的关键是声纳参数sonar.java.binaries
,此参数是必需的,并且应设置生成字节码的路径,请参见sonarqube doc: https://docs.sonarqube.org/latest/analysis/languages/java/
The key to solve this issue is sonar parameter sonar.java.binaries
, this parameter is required and should set the path where your byte code generated, see sonarqube doc: https://docs.sonarqube.org/latest/analysis/languages/java/
sonar.java.binaries (required)
:
用逗号分隔的包含已编译字节码的目录的路径 与您的源文件相对应的文件.
Comma-separated paths to directories containing the compiled bytecode files corresponding to your source files.
所以我应该做的是更新mvn sonar:sonar
的参数,进行更改
So what should i do is to update mvn sonar:sonar
's params, change
-Dsonar.java.binaries=target/sonar
到
Dsonar.java.binaries=target
,目标/声纳没有课程,但目标中有课程.
to
Dsonar.java.binaries=target
, target/sonar doesn't have classes but in target there are classes.
执行完jacoco分析后,输出为:
After doing that jacoco analysis will run and the output is that:
[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] Analysing /Users/rollsbean/workRepo/my-project/common/../target/jacoco.exec
[INFO] Sensor JaCoCoSensor [java] (done) | time=56ms
[INFO] Sensor JavaXmlSensor [java]
[INFO] 1 source files to be analyzed
[INFO] Sensor JavaXmlSensor [java] (done) | time=7ms
...
[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] Analysing /Users/rollsbean/workRepo/my-project/web/../target/jacoco.exec
[INFO] Sensor JaCoCoSensor [java] (done) | time=245ms
[INFO] Sensor JavaXmlSensor [java]
[INFO] 1 source files to be analyzed
[INFO] 1/1 source files have been analyzed
[INFO] Sensor JavaXmlSensor [java] (done) | time=206ms
...
仅此而已,希望对您有所帮助.
That's all, hope it will help you.