【问题标题】:SonarQube Jacoco JUnit : SonarScanner get many unexpected problemsSonarQube Jacoco JUnit : SonarScanner 遇到许多意想不到的问题
【发布时间】:2017-04-02 06:44:36
【问题描述】:

我有一个简单的项目需要运行 JUnit 测试并让 SonarQube 使用 SonarScanner 扫描/运行 JUnit 测试结果。我把我的项目放在Github here

有一些问题:

  1. 警告:类“XXX”无法通过类加载器声纳访问 (Reference)
  2. 没有 jacoco-it.exec 和 jacoco-ut.exec,只在 SonarScanner 上运行 jacoco.exec
  3. 在运行 Test JUnit 时无法排除某些文件,因为我只想在我的服务文件夹中运行测试 (Reference)

这是我的 sonar-project.properties :

# Required metadata
sonar.projectKey=com.example:Sample
sonar.projectName=Java :: Example :: SonarQube Scanner
sonar.projectVersion=1.0

# Comma-separated paths to directories with sources (required)
sonar.sources=src
sonar.exclusions=src/main/resources/**
#sonar.test.inclusions=src/main/java/com/example/service/**, src/test/java/**
#sonar.test.exclusions=src/main/java/com/example/controller/**

# Encoding of the source files
sonar.sourceEncoding=UTF-8

#Jacoco
sonar.junit.reportsPath=target/surefire-reports
sonar.jacoco.reportPath =target/jacoco.exec
sonar.jacoco.reportMissing.force.zero=true
sonar.java.binaries=target/classes/**
#sonar.java.libraries=libs/**

当我运行 Maven 测试直到构建成功时,它会在文件夹 Target 中创建一些文件和文件夹。

之后我运行 SonarScanner 来扫描我的项目,但我遇到了这些问题。

我的问题:

  1. 如何在没有任何警告的情况下运行 SonarQube 扫描仪?
  2. 扫描 JUnit 结果时如何正确排除文件?因为我使用参考设置,Coverage 仍然会扫描文件
  3. 如何创建 jacoco-it.exec 和 jacoco-ut.exec 并在 SonarScanner 上运行?

我的项目就是基于这个Reference

【问题讨论】:

  • 如果您使用 Maven,则不需要 sonar-project.properties:请参阅有关使用 Scanner for Maven 进行分析的文档 - docs.sonarqube.org/display/SCAN/… 的使用应该足以避免许多配置问题,例如比如警告Class "XXX" is not accessiblejacoco-ut.execjacoco-it.execjacoco-maven-plugin 执行的产物,分别用于单元测试和集成测试。
  • 我使用 sonarqube 和 sonarscanner 作为第三方。这就是我有 sonar-project.properties 的原因。我下载了 SonarQube 和 SonarScanner 的 RAR,然后首先启动我的 SonarQube,然后转到 CMD,转到我的文件夹(sampleProject),然后运行我的 Scanner。我的 SonarScanner 设置在 sonar-project.properties 上
  • 问:“如何在没有任何警告的情况下运行我的 SonarQube 扫描仪?”答:使用 SonarQube Scanner for Maven。

标签: maven sonarqube sonarqube-scan


【解决方案1】:

使用SonarQube Scanner for Maven 而不仅仅是SonarQube Scanner。否则你会陷入配置问题,因为需要手动完成所有事情:

  • sonar.sources 很可能是不正确的 - 应该是 src/main/java 并且将由 Scanner for Maven 正确配置,这就是为什么您将不需要的测试文件作为主文件进行分析的原因
  • 以及 sonar.tests 通常用于基于 Maven 的项目指向 src/test/java
  • sonar.java.libraries 是空的,这就是你得到Class "XXX" is not accessible through the classloader sonar 的原因 - 列出所有必需的 Maven 项目依赖项的 JAR 文件可能非常困难,而 Scanner for Maven 将再次自动执行此操作,最重要的是会正确执行此操作
  • sonar.projectKey with Scanner for Maven 将自动设置为 Maven groupId:artifactId
  • sonar.projectNamesonar.version with Scanner for Maven 将分别正确设置为 Maven 项目名称和版本,这样您就不需要更改版本,当它在 Maven 项目中更改时
  • 其他如 sonar.sourceEncodingsonar.java.binariessonar.java.test.binariessonar.java.test.libraries 以及 Scanner for Maven 也将自动设置

如果需要,您仍然可以提供其他附加属性

  • 通过命令行如mvn ... sonar:sonar -Dsonar.something=something
  • 或在 SonarQube 用户界面中
  • 或直接在properties 部分的pom.xml 中指定它们

如何创建 jacoco-it.exec 和 jacoco-ut.exec 并在 SonarScanner 上运行?

通常jacoco-ut.exec 指的是关于单元测试的覆盖率数据,jacoco-it.exec 指的是关于集成测试的覆盖率数据。它们由jacoco-maven-plugin 创建,在您的pom.xml 中,您配置了jacoco-maven-plugin 以创建jacoco.exec

【讨论】:

  • 嘿,感谢您的回答和这些解释。我不好使用 SonarScanner。如何仅在我的特定文件夹上运行覆盖单元测试?例如,在我的 Github 项目中,我只希望 Jacoco 覆盖服务文件。所以我需要排除除Service之外的其他文件。但是当我运行 mvn sonar:sonar 时,它仍然会扫描我项目中的所有文件。
猜你喜欢
  • 2016-09-05
  • 2011-12-06
  • 2014-06-09
  • 2018-07-22
  • 2018-07-27
  • 1970-01-01
  • 2016-12-03
  • 2019-04-12
  • 1970-01-01
相关资源
最近更新 更多