如何让 Sonar 忽略 codeCoverage 指标的某些类?

Posted

技术标签:

【中文标题】如何让 Sonar 忽略 codeCoverage 指标的某些类?【英文标题】:How to make Sonar ignore some classes for codeCoverage metric? 【发布时间】:2012-08-21 14:01:37 【问题描述】:

我在 Maven 中有一个 Sonar 配置文件。除了代码覆盖率指标外,一切正常。我想让 Sonar 仅针对代码覆盖率指标忽略某些类。我有以下个人资料:

<profile>
    <id>sonar</id>
    <properties>
        <sonar.exclusions>**/beans/jaxb/**</sonar.exclusions>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>$maven.surefire.plugin.version</version>
                <configuration>
                    <redirectTestOutputToFile>true</redirectTestOutputToFile>
                    <excludes>
                        <exclude>**/*Suite*.java</exclude>
                        <exclude>**/*RemoteTest.java</exclude>
                        <exclude>**/*SpringTest.java</exclude>
                        <exclude>**/*CamelTest.java</exclude>
                        <exclude>**/*FunctionalTest.java</exclude>
                        <exclude>**/*IntegrationTest.java</exclude>
                        <exclude>**/*DaoBeanTest.java</exclude>
                    </excludes>
                </configuration>
            </plugin>                    
        </plugins>
    </build>
</profile>

请帮忙。我尝试添加类似

的内容
<exclude>com/qwerty/dw/publisher/Main.class</exclude>

但没用

更新

我有正确的 Cobertura 个人资料。我尝试将它添加到 Sonar 配置文件中,但我仍然有 53% 而不是像 Cobertura 配置文件中那样的大约 95%

<profile>
    <id>sonar</id>
    <properties>
        <sonar.exclusions>**/beans/jaxb/**</sonar.exclusions>
        <sonar.core.codeCoveragePlugin>cobertura</sonar.core.codeCoveragePlugin>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>$maven.surefire.plugin.version</version>
                <configuration>
                    <redirectTestOutputToFile>true</redirectTestOutputToFile>
                    <excludes>
                        <exclude>**/*Suite*.java</exclude>
                        <exclude>**/*RemoteTest.java</exclude>
                        <exclude>**/*SpringTest.java</exclude>
                        <exclude>**/*CamelTest.java</exclude>
                        <exclude>**/*FunctionalTest.java</exclude>
                        <exclude>**/*IntegrationTest.java</exclude>
                        <exclude>**/*DaoBeanTest.java</exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>cobertura-maven-plugin</artifactId>
                <version>$cobertura.maven.plugin.version</version>
                <configuration>
                    <instrumentation>
                        <excludes>
                            <exclude>com/qwerty/dw/dao/*</exclude>
                            <exclude>com/qwerty/dw/domain/*</exclude>
                            <exclude>com/qwerty/dw/beans/**/*</exclude>
                            <exclude>com/qwerty/dw/daemon/exception/*</exclude>
                            <exclude>com/qwerty/dw/daemon/Main.class</exclude>
                            <exclude>com/qwerty/dw/sink/Main.class</exclude>
                            <exclude>com/qwerty/dw/publisher/Main.class</exclude>
                            <exclude>com/qwerty/dw/publisher/dao/*</exclude>
                            <exclude>com/qwerty/dw/publisher/domain/*</exclude>
                        </excludes>
                    </instrumentation>
                    <formats>
                        <format>html</format>
                    </formats>
                    <aggregate>true</aggregate>
                    <check>
                        <haltOnFailure>true</haltOnFailure>
                        <branchRate>60</branchRate>
                        <lineRate>60</lineRate>
                        <totalBranchRate>60</totalBranchRate>
                        <totalLineRate>60</totalLineRate>
                    </check>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>clean</goal>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>

【问题讨论】:

可能是一个未解决的问题? jira.codehaus.org/browse/SONAR-766 另见 jacoco gradle 解决方案:***.com/a/43196918/907576 【参考方案1】:

在撰写本文时(使用 SonarQube 4.5.1),要设置的正确属性是 sonar.coverage.exclusions,例如:

<properties>
    <sonar.coverage.exclusions>foo/**/*,**/bar/*</sonar.coverage.exclusions>
</properties>

这似乎与之前的几个版本有所不同。请注意,这仅将给定类排除在覆盖率计算之外。计算所有其他指标和问题。

为了找到您的 SonarQube 版本的属性名称,您可以尝试转到 SonarQube 实例的 常规设置 部分并查找 代码覆盖率 项(在 SonarQube 4.5.x 中,常规设置 → 排除 → 代码覆盖率)。在输入字段下方,它给出了上面提到的属性名称(“Key: sonar.coverage.exclusions”)。

【讨论】:

对于 gradle 它是 sonarRunner sonarProperties property "sonar.coverage.exclusions", " '/domain/' , '/facade/ ' , '/stub/' , '/model/' , '/config/' "属性 "sonar.exclusions", "/stub/" @MichaelTecourt - 这里是SonarQube analysis exclusions & inclusions 从文档中摘录: sonar.coverage.exclusions - 要从覆盖计算中排除的文件路径模式的逗号分隔列表跨度> 完全忽略 foo 包的正确语法是:**/foo/**/* @Andrew Roth 我添加的评论现在已经 2 岁了,Sonar 到那时已经看到了很多变化 :) 现在要使用的参数是 sonar.exclusions。来自新文档的参考:docs.sonarqube.org/latest/project-administration/… 不,这不正确。 sonar.exclusions 将从分析中排除提到的文件或目录。 sonar.coverage.exclusions 仍然存在,并且会从代码覆盖范围中排除提到的文件或目录,就像所问的那样。但在当前文档中并未提及。我正在使用 SonarQube 8.1,我可以在 Administration &gt; Analysis Scope 下看到配置密钥 sonar.coverage.exclusions【参考方案2】:

对我来说这很有效(基本上是pom.xml 级别的全局属性):

<properties>
    <sonar.exclusions>**/Name*.java</sonar.exclusions>
</properties>

根据:http://docs.sonarqube.org/display/SONAR/Narrowing+the+Focus#NarrowingtheFocus-Patterns

看来你可以用“.java”或可能的“*”结束它

获取您感兴趣的 java 类。

【讨论】:

我也在查看这个,但这不包括每个指标(记录的 API、规则合规性等)中的文件,而不仅仅是测试覆盖率。 是的,这就是我们想要的。您也许可以将其添加到 pmd/findbugs 或 jacoco 排除项中,否则 [?] 这可能是您想要的,但问题是关于覆盖率的明确问题:“我想让 Sonar 忽略某些类用于代码覆盖率指标”【参考方案3】:

根据this SonarQube 7.1 的文档

sonar.exclusions - 以逗号分隔的文件路径模式列表 排除在分析之外 sonar.coverage.exclusions - 逗号分隔 要从覆盖范围中排除的文件路径模式列表 计算

document 给出了一些关于如何创建路径模式的示例

# Exclude all classes ending by "Bean"
# Matches org/sonar.api/MyBean.java, org/sonar/util/MyOtherBean.java, org/sonar/util/MyDTO.java, etc.
sonar.exclusions=**/*Bean.java,**/*DTO.java

# Exclude all classes in the "src/main/java/org/sonar" directory
# Matches src/main/java/org/sonar/MyClass.java, src/main/java/org/sonar/MyOtherClass.java
# But does not match src/main/java/org/sonar/util/MyClassUtil.java
sonar.exclusions=src/main/java/org/sonar/*

# Exclude all COBOL programs in the "bank" directory and its sub-directories
# Matches bank/ZTR00021.cbl, bank/data/CBR00354.cbl, bank/data/REM012345.cob
sonar.exclusions=bank/**/*

# Exclude all COBOL programs in the "bank" directory and its sub-directories whose extension is .cbl
# Matches bank/ZTR00021.cbl, bank/data/CBR00354.cbl
sonar.exclusions=bank/**/*.cbl

如果您在项目中使用 Maven,可以像这样传递 Maven 命令行参数,例如 -Dsonar.coverage.exclusions=**/config/*,**/model/*

我在明确排除单个类时遇到问题。下面是我的观察:

**/*GlobalExceptionhandler.java - not working for some reason, I was expecting such syntax should work
com/some/package/name/GlobalExceptionhandler.java - not working
src/main/java/com/some/package/name/GlobalExceptionhandler.java - good, class excluded explicitly without using wildcards

【讨论】:

【参考方案4】:

当使用 sonar-scanner 进行 swift 时,使用 sonar-project.properties 中的 sonar.coverage.exclusions 排除任何文件以仅用于代码覆盖。如果您还想从分析中排除文件,您可以使用 sonar.exclusions。这对我很有效

sonar.coverage.exclusions=**/*ViewController.swift,**/*Cell.swift,**/*View.swift

【讨论】:

【参考方案5】:

对于 jacoco:使用此属性:

-Dsonar.jacoco.excludes=**/*View.java

【讨论】:

sonar.jacoco.excludes 不再受支持(从 SonarQube 4.5.1 开始)。有关“新”配置,请参阅 here。【参考方案6】:

我认为您正在寻找此答案Exclude methods from code coverage with Cobertura 中描述的解决方案 请记住,如果您使用的是 Sonar 3.2,则您已指定您的覆盖工具是 cobertura 而不是 jacoco(默认),它还不支持这种功能

【讨论】:

我重新提出问题。如何重用 cobertura 生成的报告【参考方案7】:

有时,Clover 被配置为为所有非测试代码提供代码覆盖率报告。如果您希望覆盖这些首选项,您可以使用配置元素来排除和包含源文件以防止被检测:

<plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-clover2-plugin</artifactId>
    <version>$clover-version</version>
    <configuration> 
        <excludes> 
            <exclude>**/*Dull.java</exclude> 
        </excludes> 
    </configuration>
</plugin>

此外,您还可以包括以下声纳配置:

<properties>
    <sonar.exclusions>
        **/domain/*.java,
        **/transfer/*.java
    </sonar.exclusions>
</properties> 

【讨论】:

【参考方案8】:

我不得不挣扎了一下,但我找到了解决方案,我补充道

-Dsonar.coverage.exclusions=**/*.* 

并且覆盖率指标完全从仪表板中取消,所以我意识到问题出在我经过的路径上,而不是属性上。在我的情况下,要排除的路径是 java/org/acme/exceptions,所以我使用了:

`-Dsonar.coverage.exclusions=**/exceptions/**/*.*` 

它有效,但由于我没有子文件夹,它也适用于

-Dsonar.coverage.exclusions=**/exceptions/*.*

【讨论】:

【参考方案9】:

我可以通过更新 pom.xml 中的 jacoco-maven-plugin 配置来实现必要的代码覆盖排除

<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.6</version>
                <executions>
                    <execution>
                        <id>pre-test</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <propertyName>jacocoArgLine</propertyName>
                            <destFile>$project.test.result.directory/jacoco/jacoco.exec</destFile>
                        </configuration>
                    </execution>
                    <execution>
                        <id>post-test</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <configuration>
                            <dataFile>$project.test.result.directory/jacoco/jacoco.exec</dataFile>
                            <outputDirectory>$project.test.result.directory/jacoco</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
                <configuration>
                    <excludes>
                        <exclude>**/GlobalExceptionHandler*.*</exclude>
                        <exclude>**/ErrorResponse*.*</exclude>
                    </excludes>
                </configuration>
            </plugin>

此配置排除了jacoco覆盖范围内的GlobalExceptionHandler.java和ErrorResponse.java。

以下两行对声纳覆盖范围也是如此。

    <sonar.exclusions> **/*GlobalExceptionHandler*.*, **/*ErrorResponse*.</sonar.exclusions>
        <sonar.coverage.exclusions> **/*GlobalExceptionHandler*.*, **/*ErrorResponse*.* </sonar.coverage.exclusions>

【讨论】:

为什么 sonar.exclusions 和 soar.coverage.exclusions 都需要?

以上是关于如何让 Sonar 忽略 codeCoverage 指标的某些类?的主要内容,如果未能解决你的问题,请参考以下文章

sonar做代码检测时如何忽略一些代码文件

sonar+Jenkins注意的关键点或坑及sonar规则忽略或修改

SonarQube 正在使用 pom.xml 并忽略 sonar-project.properties 文件

如何评论为啥可以忽略捕获

属性文件排除多个路径

SonarQube 忽略 pylint 结果