问题描述
我正在使用 Gradle sonarqube 插件,我需要从声纳分析中排除所有测试源(主要目标是从问题/代码异味报告中过滤掉单元测试类)
为此,我使用了专用的 sonar.test.exclusions
属性,如下所示,从分析中排除整个 src/test
目录
sonarqube {
properties {
property("sonar.exclusions","")
property("sonar.test.exclusions","src/test/**/*.java")
// other sonar properties,omitted
}
}
这按预期工作(测试源被过滤掉)但是:设置此属性后,声纳无法正确计算/报告单元测试的数量。
查看一个非常基本的项目的简单示例:2 个主要源文件,1 个包含 2 个 Junit 测试的测试源文件(还包含一些我不想在报告中看到的问题)
- 无例外:
Sonar 正确报告了我的 2 个单元测试,但它还包含来自单元测试类的代码异味
- 排除:
现在,单元测试中的代码异味已被正确过滤,但我丢失了单元测试计数信息
注意事项:
- 使用 Gradle 6.7、sonarqube 插件版本 3.0 和声纳服务器
Community EditionVersion 8.4.2
- 还尝试使用属性
sonar.exclusions
:同样的问题 - 所有其他声纳属性均已正确设置并在两种情况下具有相同的值:特别是
sonar.tests
、sonar.java.test.binaries
、sonar.junit.reportPaths
、sonar.jacoco.reportPath
知道如何配置 sonarqube 插件以正确排除测试源,同时保持单元测试信息可用吗?
解决方法
您所追求的似乎从 Gradle 配置中是不可能的。让我详细说明我是如何得出这个结论的。
在 2013 年 Sonarqube 邮件列表上的一个(公认非常)旧线程中,有人问了同样的问题(尽管是针对 Maven)。 Sonarqube 顾问有 answered 如下:
当您使用 sonar.exclusions(或 sonar.test.exclusions)排除文件(或测试文件)时,SonarQube 只会忽略该文件。不导入源代码,不计算此文件的指标(例如测试次数)。
要忽略特定文件的某些特定问题,请参阅 http://docs.codehaus.org/display/SONAR/Narrowing+the+Focus#NarrowingtheFocus-IgnoreIssues。要忽略代码覆盖率计算要考虑的某些文件,请参阅 http://docs.codehaus.org/display/SONAR/Narrowing+the+Focus#NarrowingtheFocus-IgnoreCodeCoverage 等。
与引用中第一个(现已损坏)对应的当前文档链接是这样的:https://docs.sonarqube.org/latest/project-administration/narrowing-the-focus/#header-3(或 for version 8.4)它是关于忽略“某些组件上的问题和某些编码规则的问题”——如果我没记错的话,这就是你所追求的。但是,这些文档一开始就说明:
请注意,以下属性只能通过 Web 界面设置,因为它们是多值的。
例如,这里的“Web 界面”与(Gradle)构建配置相对。事实上,前面提到的 Sonarqube 顾问也明确为 Maven states this:
属性是 sonar.issue.ignore.multicriteria。我想我在某处读到您必须通过 GUI 执行这些操作,因为它们是多值的?是这样吗?如果没有,我将如何将其写为 pom.xml 中的条目?我们喜欢将所有配置放在一个地方(pom.xml)。
不幸的是,这是不可能的。
邮件列表讨论有点长,提供了更多见解,因此可能值得一读。它还进一步阐明了 sonar.test.exclusions
属性,否则我找不到任何好的文档。
我同意 Chriki 的回答,但只是第一部分:使用 sonar.test.exclusions
不是好方法。
我不同意最后一部分:在 Gradle 中完全可以使用 sonar.issue.ignore.multicriteria
https://www.baeldung.com/sonar-exclude-violations#using-sonar-projectproperties
尝试这样的事情(虽然我没有测试过):
sonarqube {
properties {
property "sonar.issue.ignore.multicriteria","e1"
property "sonar.issue.ignore.multicriteria.e1.resourceKey","src/test/java/**/*"
property "sonar.issue.ignore.multicriteria.e1.ruleKey","*"
}
}