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]

问题 :

  1. 为什么声纳找不到Jacoco类文件,但找到了jacoco.exec 或其他文件.
  2. 如何在Sonar中生成单元测试范围.
  1. Why sonar couldn't find Jacoco class files, does it find jacoco.exec or other file.
  2. 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.