Sonar 和 Jacoco:由于没有 class 文件,因此无法对项目覆盖率进行 JaCoCo 分析
Sonar and Jacoco: No JaCoCo analysis of project coverage can be done since there are no class files
我使用 Jacoco、Sonar、Maven 来报告单元测试覆盖率,这是一个 springboot 项目,请查看我的项目架构如下:
web
|-src/test/java --unit test classes
|-target/
|-pom.xml
service
|-pom.xml
pom.xml
target
|-sonar
|-jacoco.exec
父级中的我的 Maven 配置 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:运行 命令下方:
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。
最后,我检查了声纳日志,发现下面的日志: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 class 文件,它能找到 jacoco.exec
或其他文件。
- 如何在 Sonar 中生成单元测试覆盖率。
谢谢!
检查后,我解决了这个问题。
解决这个问题的关键是声纳参数sonar.java.binaries
,这个参数是必需的,应该设置你的字节码生成的路径,见声纳文档: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
的参数,改
-Dsonar.java.binaries=target/sonar
到
Dsonar.java.binaries=target
, target/sonar 没有 类 但在目标中有 类.
完成 jacoco 分析后 运行 输出为:
[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
...
就这些了,希望对你有帮助。
我使用 Jacoco、Sonar、Maven 来报告单元测试覆盖率,这是一个 springboot 项目,请查看我的项目架构如下:
web
|-src/test/java --unit test classes
|-target/
|-pom.xml
service
|-pom.xml
pom.xml
target
|-sonar
|-jacoco.exec
父级中的我的 Maven 配置 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:运行 命令下方:
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。
最后,我检查了声纳日志,发现下面的日志: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 class 文件,它能找到 jacoco.exec 或其他文件。
- 如何在 Sonar 中生成单元测试覆盖率。
谢谢!
检查后,我解决了这个问题。
解决这个问题的关键是声纳参数sonar.java.binaries
,这个参数是必需的,应该设置你的字节码生成的路径,见声纳文档: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
的参数,改
-Dsonar.java.binaries=target/sonar
到
Dsonar.java.binaries=target
, target/sonar 没有 类 但在目标中有 类.
完成 jacoco 分析后 运行 输出为:
[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
...
就这些了,希望对你有帮助。