如何让 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 > 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+Jenkins注意的关键点或坑及sonar规则忽略或修改