Sonarqube gradle 插件 - 排除测试源会破坏报告中的单元测试计数

Posted

技术标签:

【中文标题】Sonarqube gradle 插件 - 排除测试源会破坏报告中的单元测试计数【英文标题】:Sonarqube gradle plugin - excluding test sources breaks the unit test count in report 【发布时间】:2021-04-06 02:23:00 【问题描述】:

我正在使用 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.testssonar.java.test.binariessonar.junit.reportPathssonar.jacoco.reportPath

知道如何配置 sonarqube 插件,以正确排除测试源,同时保持单元测试信息可用?

【问题讨论】:

【参考方案1】:

我同意 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", "*"
    

【讨论】:

嗨@Toyonos,谢谢你的回答,你的例子工作得很好!【参考方案2】:

你所追求的似乎不可能从 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 界面”是指与(Gradle)构建配置相对的意思。事实上,前面提到的 Sonarqube 顾问也为 Maven 明确states this:

属性是 sonar.issue.ignore.multicriteria。我想我在某处读到您必须通过 GUI 执行这些操作,因为它们是多值的?是这样吗?如果没有,我将如何将其写为 pom.xml 中的条目?我们喜欢将所有配置保存在一个地方 (pom.xml)。

很遗憾,这是不可能的。

邮件列表讨论更长一些,并且提供了更多见解,因此可能值得一读。它还进一步阐明了 sonar.test.exclusions 属性,否则我找不到任何好的文档。

【讨论】:

嗨@Chriki,感谢您的详细回答,您提供的链接很有用:使用sonar.issue.ignore.multicriteria 是个好方法。如另一个答案中所述,甚至可以从 gradle 配置这些属性,这正是我所需要的。 BR

以上是关于Sonarqube gradle 插件 - 排除测试源会破坏报告中的单元测试计数的主要内容,如果未能解决你的问题,请参考以下文章

gradle、sonarqube 和 jacoco 插件的哪些版本兼容

使用android productFlavors时,sonarqube gradle插件异常

使用sonarqube gradle插件配置带有子模块的Android项目的正确方法是啥?

Gradle Build - 任务“:sonarqube”的执行失败无法被索引两次

未找到 ID 为“org.sonarqube”的插件

从 gradle 向配置了 cobertura 的 sonarqube 报告覆盖率