Maven SONARQUE不能获取单元测试覆盖率

Maven SONARQUE不能获取单元测试覆盖率,maven,jenkins,sonarqube,jacoco,Maven,Jenkins,Sonarqube,Jacoco,我在用声纳提取jacoco分析报告时遇到问题。然而,詹金斯能够拿起报告并显示结果。 我的项目是一个maven构建,由Jenkins构建。jacoco报告由maven生成(在pom中配置)。Sonar是使用Jenkins插件执行的 这是我在SonarQube上看到的: 这是我在詹金斯看到的项目报告 maven插件配置: org.jacoco jacocomaven插件 0.6.4.201312101107 默认准备代理 配制剂 默认报告 准备包装 报告 默认检查 检查 詹金斯声纳插件配置

我在用声纳提取jacoco分析报告时遇到问题。然而,詹金斯能够拿起报告并显示结果。 我的项目是一个maven构建,由Jenkins构建。jacoco报告由maven生成(在pom中配置)。Sonar是使用Jenkins插件执行的

这是我在SonarQube上看到的:

这是我在詹金斯看到的项目报告

maven插件配置:


org.jacoco
jacocomaven插件
0.6.4.201312101107
默认准备代理
配制剂
默认报告
准备包装
报告
默认检查
检查
詹金斯声纳插件配置

您缺少一些重要的声纳属性,以下是我的一个构建的示例:

sonar.jdbc.dialect=mssql
sonar.projectKey=projectname
sonar.projectName=Project Name
sonar.projectVersion=1.0
sonar.sources=src
sonar.language=java
sonar.binaries=build/classes
sonar.tests=junit
sonar.dynamicAnalysis=reuseReports
sonar.junit.reportsPath=build/test-reports
sonar.java.coveragePlugin=jacoco
sonar.jacoco.reportPath=build/test-reports/jacoco.exec
Jenkins控制台输出中的错误对于实现代码覆盖非常有用

项目覆盖率设置为0%,因为没有包含类的目录
表示您没有正确设置Sonar.Binaries属性

没有关于每次测试覆盖率的信息
表明您没有正确设置Sonar.Tests属性

未收集覆盖率信息。也许您忘记了将调试信息包含到编译类中?表示sonar.binaries属性设置正确,但这些文件未在调试模式下编译,需要基于以下POM进行编译:


杰科科
再利用报告
${project.basedir}/./target/jacoco.exec
org.jacoco
不推荐使用。)

然后我就跑

mvn clean install
mvn sonar:sonar

Jenkins没有显示覆盖率结果,因为这是Jenkins jacoco插件和maven jacoco插件之间的版本兼容性问题。 在我这方面,我已经通过使用maven jacoco插件的最新版本修复了它

<build>
   <pluginManagement>
     <plugins>
       <plugin>
         <groupId>org.jacoco</groupId>
         <artifactId>jacoco-maven-plugin</artifactId>
         <version>0.7.9</version>
       </plugin>
     <plugins>
   <pluginManagement>
<build>

org.jacoco
jacocomaven插件
0.7.9

在pom.xml和 运行maven命令,如下所示

mvn杰科科:准备特工杰科科:报告声纳:声纳

<properties>
    <surefire.version>2.17</surefire.version>
    <jacoco.version>0.7.2.201409121644</jacoco.version>

2.17
0.7.2.201409121644


org.apache.maven.plugins
maven surefire插件
${surefire.version}
org.jacoco
jacocomaven插件
${jacoco.version}
默认准备代理
配制剂
默认报告
准备包装
报告

我也遇到了类似的问题,0.0%的覆盖率&使用SonarQube 6.7.2的Sonar仪表板上没有单元测试: Maven:3.5.2, Java:1.8, Jacoco:使用7.0/7.9/8.0, 操作系统:Windows

在为maven多模块项目(不像这里的单模块项目)寻找正确的解决方案进行了大量的努力之后,我们需要说的是从单个模块中选择jacoco报告并合并到一个报告,因此解决了此配置的问题,正如我的父pom所示:

 <properties>
            <!--Sonar -->
            <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
            <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
        <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
            <sonar.language>java</sonar.language>

        </properties>

        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <source>1.5</source>
                            <target>1.5</target>
                        </configuration>
                    </plugin>

                    <plugin>
                        <groupId>org.sonarsource.scanner.maven</groupId>
                        <artifactId>sonar-maven-plugin</artifactId>
                        <version>3.4.0.905</version>
                    </plugin>

                    <plugin>
                        <groupId>org.jacoco</groupId>
                        <artifactId>jacoco-maven-plugin</artifactId>
                        <version>0.7.9</version>
                        <configuration>
                            <destFile>${sonar.jacoco.reportPath}</destFile>
                            <append>true</append>
                        </configuration>
                        <executions>
                            <execution>
                                <id>agent</id>
                                <goals>
                                    <goal>prepare-agent</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>

                </plugins>
            </pluginManagement>
        </build>

杰科科
再利用报告
${project.basedir}/./target/jacoco.exec
JAVA
org.apache.maven.plugins
maven编译器插件
1.5
1.5
org.sonarsource.scanner.maven
声纳maven插件
3.4.0.905
org.jacoco
jacocomaven插件
0.7.9
${sonar.jacoco.reportPath}
真的
代理人
配制剂

我尝试过其他一些选项,比如jacocoaggregate&甚至通过在父pom中包含子模块来创建子模块,但没有任何效果&这很简单。我在日志中看到
已被弃用,但仍按原样工作,似乎在执行时自动替换,或者可以手动更新为
或最新版本。在cmd中完成安装后,从mvn clean install开始mvn org.jacoco:jacoco maven插件:准备代理安装(检查项目的目标文件夹是否创建了jacoco.exec)&然后执行mvn sonar:sonar,这是我尝试过的,如果有其他最好的解决方案,请告诉我。希望这有帮助!!如果没有,请发布您的问题。

我也面临着同样的问题,我面临的挑战是正确配置Jacoco和正确配置声纳参数。我将简要解释,我最终是如何让SonarQube正确显示测试结果和测试覆盖率的

在您的项目中,您的pom或父pom中需要Jacoco插件(您已经得到了这个)。此外,还需要maven surefire插件,用于显示测试结果。所有测试报告都是在运行maven构建时自动生成的。棘手的部分是找到正确的声纳参数。并非所有参数似乎都适用于正则表达式,您必须使用逗号分隔的列表(文档不适用)
 <properties>
            <!--Sonar -->
            <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
            <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
        <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
            <sonar.language>java</sonar.language>

        </properties>

        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <source>1.5</source>
                            <target>1.5</target>
                        </configuration>
                    </plugin>

                    <plugin>
                        <groupId>org.sonarsource.scanner.maven</groupId>
                        <artifactId>sonar-maven-plugin</artifactId>
                        <version>3.4.0.905</version>
                    </plugin>

                    <plugin>
                        <groupId>org.jacoco</groupId>
                        <artifactId>jacoco-maven-plugin</artifactId>
                        <version>0.7.9</version>
                        <configuration>
                            <destFile>${sonar.jacoco.reportPath}</destFile>
                            <append>true</append>
                        </configuration>
                        <executions>
                            <execution>
                                <id>agent</id>
                                <goals>
                                    <goal>prepare-agent</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>

                </plugins>
            </pluginManagement>
        </build>
-Dsonar.branch.target=master (in newer version of SQ I had to remove this, so that master branch is analyzed correctly; I used auto branch checkbox in bamboo instead)
-Dsonar.working.directory=./target/sonar
-Dsonar.java.binaries=**/target/classes
-Dsonar.sources=./service-a/src,./service-b/src,./service-c/src,[..]
-Dsonar.exclusions=**/data/dto/**
-Dsonar.tests=.
-Dsonar.test.inclusions=**/*Test.java [-> all your tests have to end with "Test"]
-Dsonar.junit.reportPaths=./service-a/target/surefire-reports,./service-b/target/surefire-reports,
./service-c/target/surefire-reports,[..]
-Dsonar.jacoco.reportPaths=./service-a/target/jacoco.exec,./service-b/target/jacoco.exec,
./service-c/target/jacoco.exec,[..]
-Dsonar.projectVersion=${bamboo.buildNumber}
-Dsonar.coverage.exclusions=**/src/test/**,**/common/**
-Dsonar.cpd.exclusions=**/*Dto.java,**/*Entity.java,**/common/**
config.stopBubbling = true
lombok.addLombokGeneratedAnnotation = true
<properties>
  <argLine>your jvm options here</argLine>
</properties>
<sonar.binaries>${project.basedir}/../target/classes</sonar.binaries>