Sonarqube,我不明白它是如何衡量测试覆盖率的



我是sonarqube的新手,我不知道它是如何工作的。我克隆了此示例项目:https://github.com/tkgregory/sonarqube-jacoco-code-coverage

按原样,该项目的代码覆盖率为66%,所以我添加了一个伪类,它降到了33。我添加了以下行:property 'sonar.coverage.exclusions', 'src/main/java/com/tom/service/MartinDTO.java'排除我添加的类,覆盖率再次上升到66。

然后我删除了所有的测试,覆盖率仍然是66,它应该是零,因为它没有测试!

有最了解情况的人能向我解释一下这是怎么回事吗?我只需要排除一个项目的所有DTO。

设置并运行:

我以这个例子为例https://tomgregory.com/how-to-measure-code-coverage-using-sonarqube-and-jacoco/#2_A_worked_example

克隆此项目:https://github.com/tkgregory/sonarqube-jacoco-code-coverage

我启动了一个本地声纳:

./gradlew composeUp

在示例项目中(您需要安装docker才能工作(。

要将信息发送到码头声纳只需运行

./gradlew sonarqube

请记住,所有这些都是在示例项目中配置的。

Thx!

"之前的所有内容;然后我删除了所有的测试,覆盖率仍然是66,它应该是零,因为它没有测试">对我来说,这似乎是我想要的行为。如果我错了,请纠正我。

删除所有测试后会发生什么

好吧,您可以运行带有详细输出的sonarqubeGradle任务来查看正在执行的任务。

$ ./gradlew  sonarqube --console=verbose 
> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses
> Task :test
> Task :jacocoTestReport SKIPPED
> Task :sonarqube
...

重要的是,jacocoTestReport任务被跳过。它负责生成XML报告。

这意味着:

  1. 保留旧的XML报告
  2. 旧的XML报告被发送到SonarQube
  3. SonarQube中显示了不正确的覆盖率

这是因为jacocoTestReport任务的编写方式。如果没有测试执行数据(这里是这样的,因为没有测试(,任务就会被跳过。

你可以在这个错误报告中阅读更多关于这种行为的信息,我也在报告中跟进了这个特定的问题。

声纳扫描仪本身并不测量代码覆盖率,它只是导入测试执行时jacoco生成的覆盖率报告。如果你只是跑"/gradlew sonarqube";它将导入您现有的覆盖率报告,而不是生成更新的报告。很可能你需要运行这个:

./gradlew clean build sonarqube

最新更新