SonarQube没有获得单元测试覆盖率

时间:2014-03-04 14:20:28

标签: maven jenkins sonarqube jacoco

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

这是我在SonarQube上看到的:

SonarQube Screen Capture

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

Jacoco report in Jenkins

maven插件配置:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.4.201312101107</version>
    <executions>
      <execution>
        <id>default-prepare-agent</id>
        <goals>
            <goal>prepare-agent</goal>
        </goals>
      </execution>
      <execution>
        <id>default-report</id>
        <phase>prepare-package</phase>
        <goals>
            <goal>report</goal>
        </goals>
      </execution>
      <execution>
          <id>default-check</id>
          <goals>
              <goal>check</goal>
          </goals>
      </execution>
    </executions>
</plugin>

Jenkins Sonar插件配置 enter image description here

8 个答案:

答案 0 :(得分:58)

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

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属性设置正确,但这些文件未在调试模式下编译,它们必须是

答案 1 :(得分:13)

基于https://github.com/SonarSource/sonar-examples/blob/master/projects/tycho/pom.xml,以下POM适用于我:

<properties>
    <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.7.0.201403182114</version>
            <executions>
                <execution>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <destFile>${sonar.jacoco.reportPath}</destFile>
            </configuration>
        </plugin>
    </plugins>
</build>
  • 将目标文件设置为报告路径可确保Sonar准确读取JaCoCo生成的文件。
  • 报告路径应该在项目之外&#39;将跨项目覆盖考虑在内的目录(例如,对于Tycho,其惯例是有单独的测试项目)。
  • reuseReports设置可防止在读取之前删除JaCoCo报告文件! (自4.3以来,this is the default并且已弃用。)

然后我就跑了

mvn clean install
mvn sonar:sonar

答案 2 :(得分:5)

我有类似的问题,0.0%覆盖范围&amp;使用SonarQube 6.7.2的Sonar仪表板上没有任何单元测试: Maven:3.5.2, Java:1.8, Jacoco:使用7.0 / 7.9 / 8.0, 操作系统:Windows

经过多次努力寻找maven多模块项目的正确解决方案,不像单个模块项目,我们需要说从各个模块中选择jacoco报告&amp;合并到一个报告,因此解决了这个配置的问题,因为我的父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>

我尝试过其他一些选项,例如 jacoco-aggregate &amp;甚至创建一个子模块,通过将其包含在父pom中,但没有真正起作用的&amp;这很简单。我在日志中看到<sonar.jacoco.reportPath>已被弃用,但仍然按原样运行,似乎在执行时自动替换,或者可以手动更新为<sonar.jacoco.reportPaths>或最新。在使用 mvn clean install 开始在cmd中进行设置之后,然后 mvn org.jacoco:jacoco-maven-plugin:prepare-agent install (检查项目的目标文件夹是否为jacoco。 exec创建)&amp;然后做 mvn声纳:声纳,这就是我试过的,如果有其他最好的解决方案,请告诉我。希望这有帮助!!如果没有,请发表您的问题..

答案 3 :(得分:1)

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>

答案 4 :(得分:0)

在pom.xml中包含sunfire和jacoco插件 运行maven命令,如下所示。

mvn jacoco:prepare-agent jacoco:报告声纳:声纳

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

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${surefire.version}</version>
        </plugin> 

        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco.version}</version>

            <executions>
                <execution>
                    <id>default-prepare-agent</id>
                    <goals><goal>prepare-agent</goal></goals>
                </execution>
                <execution>
                    <id>default-report</id>
                    <phase>prepare-package</phase>
                    <goals><goal>report</goal></goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

答案 5 :(得分:0)

我遇到了同样的问题,我面临的挑战是正确配置Jacoco并为Sonar配置正确的参数。我将简要解释一下,如何最终使SonarQube正确显示测试结果和测试范围。

在您的项目中,您需要pom或父pom中的Jacoco插件(您已经拥有了此插件)。此外,您需要使用maven-surefire-plugin来显示测试结果。运行Maven构建时,将自动生成所有测试报告。棘手的部分是为声纳找到正确的参数。并非所有参数似乎都适用于正则表达式,因此您必须使用逗号分隔的列表(我认为文档并不是很好)。这是我使用过的参数列表(我从Bamboo使用它们,如果使用sonar.properties文件,则可能会省略“ -D”):

-Dsonar.branch.target=master
-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/**

如果在项目中使用Lombok,则还需要lombok.config文件来获得正确的代码覆盖率。 lombok.config文件位于项目的根目录中,具有以下内容:

config.stopBubbling = true
lombok.addLombokGeneratedAnnotation = true

答案 6 :(得分:0)

surefire和jacoco插件中都存在argLine配置,从而停止了jacoco报告的生成。 argLine应该在属性中定义

<properties>
  <argLine>your jvm options here</argLine>
</properties>

答案 7 :(得分:0)

对我来说,sonarqube 仪表板中没有显示百分比覆盖率。我在我们的 pom.xml 中添加了以下属性来工作。

<sonar.binaries>${project.basedir}/../target/classes</sonar.binaries>