Cobertura 更改声纳违规

Cobertura changes Sonar violations

我的同事今天早上发现,在启用 Cobertura 的情况下编译项目会更改同一项目的声纳结果。

在这个特定项目中,我们 运行 使用 sonar:sonar 构建,然后 运行 使用 cobertura:cobertura sonar:sonar 再次构建。

比较中的声纳结果现在显示,在没有 Cobertura 的情况下,我们有 7/78/153/24/0 项违反 5 项严重性的行为,但使用 Cobertura 后,它变为 7/81/94/24/0,特别是发现了 3 项新的严重违规行为以及没有 Cobertura 就找不到的 15 项新的重大违规行为。

最大的变化之一是,在没有 Cobertura 的情况下,有 60 起违反空方法规则的行为(其中许多是构造函数),而在使用 Cobertura 的情况下,只有 3 起被报告。

如果 Cobertura 仅防止违规行为被发现,我们可以 运行 这两个独立的,但由于某些违规行为仅在启用 Cobertura 的情况下被发现,因此我们似乎必须进行两次单独的声纳分析。

这是已知的交互吗?除了在单独的构建中执行 Cobertura 和 Sonar 之外,还有其他解决方法吗?并使用两组结果来获得最佳数据?

根据您的评论,让我解释一下似乎正在发生的事情: 您正在通过 SonarQube 使用 FindBugs(您提到的规则是 findbugs 规则)

首先让我们考虑一下这里涉及的两个工具以及它们的工作原理(大致):

  • FindBugs:它是一个基于字节码的静态分析工具:它会读取字节码并在检测到错误模式时引发问题。

  • Cobertura:覆盖工具:它是如何工作的?它检测字节码以放置探测器,并在测试时 运行 跟踪哪些探测器命中或未命中。

然后您就会明白问题可能出在哪里:FindBugs 最终分析了 Cobertura 检测的字节码。这可以解释为什么您会遇到一些新问题,以及为什么在使用 cobertura 进行分析时会删除一些空方法问题。

为避免此问题,您必须确保在使用 FindBugs 分析字节码文件时未对它们进行检测,但是(免责声明,我开发了声纳 java 插件,所以我在这里可能有点偏见;) ) 我建议您停止使用 FindBugs,转而使用 SonarQube Java 分析器,它不会有这个问题,因为它的分析器处理事情的方式略有不同(参见这个 blog post 关于那个)

用户错误。 :-(

事实证明,用户在 运行使用 cobertura sonar:sonar 之前已经 运行 mvn clean,因此正如 benzonico 所暗示的那样,必须分析的 findbugs 规则编译代码没有 运行。只有源代码上 运行 的规则,如 java 插件,才会生成结果。这就是为什么我们遗漏了一堆规则和结果。

我们在 Bamboo 和手动构建之间仍然存在不一致,但这将是一个单独的主题 post。