【问题标题】:Sonarqube gradle plugin - excluding test sources breaks the unit test count in reportSonarqube gradle 插件 - 排除测试源会破坏报告中的单元测试计数
【发布时间】: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 测试的测试源文件(还包含一些我不想在报告中看到的问题)

  1. 不排除:

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

  1. 排除:

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

注意事项:

  • 使用 Gradle 6.7、sonarqube 插件版本 3.0 和声纳服务器 Community EditionVersion 8.4.2
  • 也尝试了sonar.exclusions 属性:同样的问题
  • 所有其他声纳属性均已正确设置并在两种情况下具有相同的值:特别是sonar.testssonar.java.test.binariessonar.junit.reportPathssonar.jacoco.reportPath

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

【问题讨论】:

    标签: gradle sonarqube sonarqube-scan


    【解决方案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
    猜你喜欢
    • 2017-07-26
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多