Joh*_*zen 6 maven jacoco sonarqube
我正在尝试为多模块maven项目生成声纳的单元测试代码覆盖率数据,而不是获得正确的结果.
项目结构类似于以下内容:
我使用jacoco maven插件生成jacoco.exec文件,使用声纳maven插件分析代码(包括jacoco.exec文件).
这些文件在此process-tests阶段生成,如下所示:
<properties>
<jacoco.report.path>${project.build.directory}/jacoco.exec</jacoco.report.path>
<sonar.jacoco.reportPath>${jacoco.report.path}</sonar.jacoco.reportPath>
</properties>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.4.201502262128</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<phase>process-test-classes</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${jacoco.report.path}</destFile>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
当我运行mvn clean install时,我可以看到jacoco.exec为每个模块创建了一个文件:
$ find . -name '*.exec'
./moduleA/target/jacoco.exec
./moduleB/moduleB1/target/jacoco.exec
./moduleB/moduleB2/target/jacoco.exec
./moduleC/target/jacoco.exec
Run Code Online (Sandbox Code Playgroud)
当我运行mvn sonar:sonar时,我看到Jacoco传感器可以运行所有模块,但似乎只适用于第一个模块.后续模块显示Coverage information was not collected:
[INFO] [17:13:58.333] Sensor JaCoCoSensor
[INFO] [17:13:58.350] Analysing moduleA\target\jacoco.exec
[INFO] [17:13:58.374] No information about coverage per test.
[INFO] [17:13:58.374] Sensor JaCoCoSensor (done) | time=41ms
...
[INFO] [17:14:02.202] Sensor JaCoCoSensor
[INFO] [17:14:02.261] Analysing moduleB\moduleB1\target\jacoco.exec
[WARN] [17:14:02.334] Coverage information was not collected. Perhaps you forget to include debug information into compiled classes?
[INFO] [17:14:02.334] Sensor JaCoCoSensor (done) | time=132ms
...
Run Code Online (Sandbox Code Playgroud)
我不确定为什么第二个和后续模块中没有覆盖信息,因为maven-compiler-plugin默认情况下包含调试信息,为了安全起见我也跑了mvn clean install -Dmaven.compiler.debug=true但得到了相同的结果.
因此,当我在声纳服务器中检查项目时,它只显示第一个模块的代码覆盖率:moduleA.没有其他模块的代码覆盖率信息.
显然,此处的解决方案是仅生成单个jacoco.exec文件,以便在jacoco-maven-plugin执行时将每个模块的结果附加到该文件,以便声纳可以正确地发挥其魔力.
因此,我修改了我的parentPom/pom.xml文件如下:
<properties>
<!-- single jacoco.exec file relative to root directory of the project -->
<jacoco.report.path>${session.executionRootDirectory}/code-coverage/jacoco.exec</jacoco.report.path>
<sonar.jacoco.reportPath>${jacoco.report.path}</sonar.jacoco.reportPath>
</properties>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.4.201502262128</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<phase>process-test-classes</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${jacoco.report.path}</destFile>
<append>true</append> <!-- now appending to single jacoco.exec file -->
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
这意味着在运行单元测试后,调用jacaco代理现在当我运行mvn clean install时,我只看到一个jacoco.exec文件:
$ find . -name '*.exec'
./code-coverage/target/jacoco.exec
Run Code Online (Sandbox Code Playgroud)
但是,当我运行MVN声纳:声纳的JaCoCoSensor似乎并没有被调用和声纳服务器上的项目没有代码覆盖的.
我在这做错了什么?如何让sonar分析我的maven项目中所有模块的代码覆盖率?
我需要以maven-surefire-plugin某种方式修改吗?
我正在使用SonarQube 5.1,JDK 1.8,jacoco-maven-plugin 0.7.4.201502262128
JaCoCo 传感器将仅加载您在模块中涵盖的类的覆盖范围。
这意味着,如果由于某种原因,模块 B 中的 jacoco.exec 不包含有关该模块的 .class 文件的覆盖信息,那么它将不会加载任何覆盖范围(即使您覆盖了另一个模块中的类)。
| 归档时间: |
|
| 查看次数: |
3404 次 |
| 最近记录: |