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