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

问题描述

我正在使用 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 测试的测试源文件(还包含一些我不想在报告中看到的问题)

  1. 无例外:

Sonar 正确报告了我的 2 个单元测试,但它还包含来自单元测试类的代码异味

enter image description here

  1. 排除:

现在,单元测试中的代码异味已被正确过滤,但我丢失了单元测试计数信息

enter image description here

注意事项:

  • 使用 Gradle 6.7、sonarqube 插件版本 3.0 和声纳服务器 Community EditionVersion 8.4.2
  • 还尝试使用属性 sonar.exclusions:同样的问题
  • 所有其他声纳属性均已正确设置并在两种情况下具有相同的值:特别是 sonar.testssonar.java.test.binariessonar.junit.reportPathssonar.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","*"
    }
}