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

ant*_*n91 48 maven jenkins jacoco sonarqube

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

这就是我在SonarQube上看到的:

SonarQube屏幕截图

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

Jacoco在詹金斯报道

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>
Run Code Online (Sandbox Code Playgroud)

Jenkins Sonar插件配置 在此输入图像描述

Col*_*350 64

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

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
Run Code Online (Sandbox Code Playgroud)

Jenkins控制台输出中的错误对于使代码覆盖率起作用非常有用.

由于没有包含类的目录,项目范围设置为0%.
表示您尚未正确设置Sonar.Binaries属性

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

未收集覆盖范围信息.也许您忘记将调试信息包含在已编译的类中?表示sonar.binaries属性设置正确,但这些文件未在调试模式下编译,它们必须是

  • 这些设置并非都是必需的(例如,不建议使用dynamicAnalysis).我赞成这个二进制属性,我设置错了. (5认同)

thS*_*oft 18

基于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>
Run Code Online (Sandbox Code Playgroud)
  • 将目标文件设置为报告路径可确保Sonar准确读取JaCoCo生成的文件.
  • 报告路径应该在项目的目录之外,以考虑跨项目的覆盖范围(例如,在Tycho的情况下,其约定是具有单独的测试项目).
  • reuseReports设置可防止在读取之前删除JaCoCo报告文件!(自4.3起,这是默认值,不推荐使用.)

然后我就跑了

mvn clean install
mvn sonar:sonar
Run Code Online (Sandbox Code Playgroud)


sri*_*asy 6

我有类似的问题,0.0%的覆盖率和没有单位测试计数在Sonar仪表板上使用SonarQube 6.7.2: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>
Run Code Online (Sandbox Code Playgroud)

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