Sonarqube gradle 插件 - 排除测试源会破坏报告中的单元测试计数
Sonarqube gradle plugin - excluding test sources breaks the unit test count in report
我正在使用 Gradle sonarqube 插件,我需要从声纳分析中排除所有测试源(主要目标是从 issues/code 气味报告)
为此,我使用了如下专用的 sonar.test.exclusions
属性,将整个 src/test
目录从分析中排除
sonarqube {
properties {
property("sonar.exclusions" , "")
property("sonar.test.exclusions" , "src/test/**/*.java")
// other sonar properties, omitted
}
}
这按预期工作(测试源被过滤掉)但是:设置此 属性 时,声纳不会 compute/report 单元测试的数量正确。
查看一个非常基本的项目的简单示例:2 个主要源文件、1 个包含 2 个 Junit 测试的测试源文件(还包含一些我不想在报告中看到的问题)
- 没有排除:
Sonar 正确地报告了我的 2 个单元测试,但它也包含来自单元测试的代码味道 class
- 排除:
现在,单元测试的代码味道被正确过滤了,但是我丢失了单元测试计数信息
备注:
- 使用 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 如下:
When you exclude a file (or a test file) with sonar.exclusions (or sonar.test.exclusions), the file is just ignored by SonarQube. The source code is not imported, no metrics are computed on this file (such as number of tests).
To ignore some specific issues on specific files, see http://docs.codehaus.org/display/SONAR/Narrowing+the+Focus#NarrowingtheFocus-IgnoreIssues. To ignore some files to be taking into account for code coverage computation, see http://docs.codehaus.org/display/SONAR/Narrowing+the+Focus#NarrowingtheFocus-IgnoreCodeCoverage and so on.
当前文档 link 对应于引用中的第一个(现已损坏)文档是这样的:https://docs.sonarqube.org/latest/project-administration/narrowing-the-focus/#header-3 (or for version 8.4) 它是关于忽略“某些组件上的问题和违反某些编码规则”——如果我没记错的话,这就是你想要的。但是,这些文档一开始就说明:
Note that the properties below can only be set through the web interface because they are multi-valued.
这里的“网络界面”是指与 (Gradle) 构建配置相对的例子。事实上,前面提到的 Sonarqube 顾问也明确地 states this for Maven:
The property is sonar.issue.ignore.multicriteria. I think I read somewhere that you have to do these through the GUI because they are multi-valued? Is that the case? If not, how would I write it as an entry in the pom.xml? We like to keep all config in the one place (pom.xml).
很遗憾,这不可能。
邮件列表的讨论有点长,提供了更多的见解,因此可能值得一读。它还进一步阐明了 sonar.test.exclusions
属性,否则我找不到任何好的文档。
我同意 Chriki 的回答,但只同意第一部分:使用 sonar.test.exclusions
不是好方法。
我不同意最后一部分:使用 sonar.issue.ignore.multicriteria
完全有可能与 Gradle
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", "*"
}
}
我正在使用 Gradle sonarqube 插件,我需要从声纳分析中排除所有测试源(主要目标是从 issues/code 气味报告)
为此,我使用了如下专用的 sonar.test.exclusions
属性,将整个 src/test
目录从分析中排除
sonarqube {
properties {
property("sonar.exclusions" , "")
property("sonar.test.exclusions" , "src/test/**/*.java")
// other sonar properties, omitted
}
}
这按预期工作(测试源被过滤掉)但是:设置此 属性 时,声纳不会 compute/report 单元测试的数量正确。
查看一个非常基本的项目的简单示例:2 个主要源文件、1 个包含 2 个 Junit 测试的测试源文件(还包含一些我不想在报告中看到的问题)
- 没有排除:
Sonar 正确地报告了我的 2 个单元测试,但它也包含来自单元测试的代码味道 class
- 排除:
现在,单元测试的代码味道被正确过滤了,但是我丢失了单元测试计数信息
备注:
- 使用 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 如下:
When you exclude a file (or a test file) with sonar.exclusions (or sonar.test.exclusions), the file is just ignored by SonarQube. The source code is not imported, no metrics are computed on this file (such as number of tests).
To ignore some specific issues on specific files, see http://docs.codehaus.org/display/SONAR/Narrowing+the+Focus#NarrowingtheFocus-IgnoreIssues. To ignore some files to be taking into account for code coverage computation, see http://docs.codehaus.org/display/SONAR/Narrowing+the+Focus#NarrowingtheFocus-IgnoreCodeCoverage and so on.
当前文档 link 对应于引用中的第一个(现已损坏)文档是这样的:https://docs.sonarqube.org/latest/project-administration/narrowing-the-focus/#header-3 (or for version 8.4) 它是关于忽略“某些组件上的问题和违反某些编码规则”——如果我没记错的话,这就是你想要的。但是,这些文档一开始就说明:
Note that the properties below can only be set through the web interface because they are multi-valued.
这里的“网络界面”是指与 (Gradle) 构建配置相对的例子。事实上,前面提到的 Sonarqube 顾问也明确地 states this for Maven:
The property is sonar.issue.ignore.multicriteria. I think I read somewhere that you have to do these through the GUI because they are multi-valued? Is that the case? If not, how would I write it as an entry in the pom.xml? We like to keep all config in the one place (pom.xml).
很遗憾,这不可能。
邮件列表的讨论有点长,提供了更多的见解,因此可能值得一读。它还进一步阐明了 sonar.test.exclusions
属性,否则我找不到任何好的文档。
我同意 Chriki 的回答,但只同意第一部分:使用 sonar.test.exclusions
不是好方法。
我不同意最后一部分:使用 sonar.issue.ignore.multicriteria
完全有可能与 Gradle
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", "*"
}
}