首页 > 解决方案 > 如何从 SonarQube 中的代码覆盖率中排除 golang 测试、结构和常量?

问题描述

SonarQube 7.3 它内置了对 golang 的支持,我发现至少有 2 个问题:-

它不会自动将 *_test.go 从覆盖范围中排除。在单元测试中,它还会获取 IP 地址并要求它们可配置(不是恒定的,也不能修复错误)。

它将 structs 和 const 视为未覆盖的行,因此覆盖率明显低于 go 覆盖工具本身,使其成为一个糟糕的用例。例如,在一个中等规模的项目中,它报告了 40% 的覆盖率,而 go 工具的覆盖率为 70%

除了将它们全部注释为声纳排除或将常量和结构放在一个通用的排除模式文件中之外,还有其他事情可以做吗?是否有计划在更高版本的 SonarQube 中解决这些问题?

标签: gosonarqube

解决方案


目前(SonarQube 7.4),SonarGo 分析器不会自动识别*_test.go为测试文件。这是一个缺失的功能,这就是SonarGo 文档描述如何通过设置正确识别测试文件的原因:

sonar.test.inclusions=**/*_test.go

如果没有正确的测试识别,覆盖结果将是错误的,分析结果可能会引发没有意义的问题(如测试中的硬编码 IP 地址)。

关于覆盖精度(对于不是测试文件的文件),有两种情况:

  • 如果文件在覆盖报告中有与之相关的条目,SonarQube 中显示的覆盖行应该与报告中的行完全匹配,否则这是一个主要错误。但是 go tools 显示的百分比(范围覆盖率)可能与 SonarQube 中显示的百分比(线路覆盖率)略有不同,例如:+2%。
  • 如果文件不在覆盖率报告中,SonarGo 会根据其对可执行代码行的定义生成 0% 的覆盖率。如果可执行代码行的go test定义存在差异,则该错误会在文件被部分覆盖后消失。

修复这些覆盖错误的最佳方法是通过使用小型代码复制器创建主题,在community.sonarsource.com上报告它们。Report a Bug


推荐阅读