测试代码包含在覆盖率报告中并影响覆盖率

Test code gets included in coverage report and skews coverate rate

我在 Azure DevOps 管道中使用 OpenClover。

问题:尽管 target/site/clover/index.html 中给出的覆盖率,当我在本地 运行 clover 时,(遗憾地)约为 45%,在 Azure DevOps 中为 71%。

原因是 AzDO 中基于 target/site/clover.xml 的覆盖率报告还包括测试代码,通常覆盖率是 100%,因此会影响结果。

我怎样才能去掉包含测试代码的覆盖率报告?我试过没有用的是在 ReportGenerator 中使用 classfilters - 它负责转换 clover.xml 到 Cobertura,以便 AzDO 可以解释它。以下均无效:

classfilters: '-*Test.java'
classfilters: '-*Test'
classfilters: '-*Test.class'

对于上下文,这是我的管道。

- task: Maven@3
  inputs:
    mavenPomFile: 'pom.xml'
    mavenOptions: '-Xmx1024m'
    mavenAuthenticateFeed: true
    javaHomeOption: 'JDKVersion'
    jdkVersionOption: '1.11'
    jdkArchitectureOption: 'x64'
    publishJUnitResults: false
    goals: 'clean clover:setup test clover:aggregate clover:clover'

- task: reportgenerator@4
  inputs:
    reports: '$(Build.SourcesDirectory)/target/site/clover/clover.xml'
    classfilters: '-*Test'
    targetdir: '$(Build.SourcesDirectory)/CoverageResults'

- task: PublishCodeCoverageResults@1
  displayName: 'Publish code coverage'
  inputs:
    codeCoverageTool: Cobertura
    summaryFileLocation: '$(Build.SourcesDirectory)/CoverageResults/Cobertura.xml'

这是 pom 文件中与三叶草相关的部分:

<build>
    <plugins>
        <plugin>
            <groupId>org.openclover</groupId>
            <artifactId>clover-maven-plugin</artifactId>
            <version>4.4.1</version>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>instrument</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

在 ReportGenerator 任务中使用 filefilters 而不是 classfilters 有效:

- task: reportgenerator@4
  inputs:
    reports: '$(Build.SourcesDirectory)/target/site/clover/clover.xml'
    filefilters: '-*Test.java'
    targetdir: '$(Build.SourcesDirectory)/CoverageResults'

从 ReportGenerator 4.6.4 开始,可以在没有(脆弱的)文件过滤器的情况下排除测试项目。

- task: reportgenerator@4
  inputs:
    reports: '$(Build.SourcesDirectory)/target/site/clover/clover.xml'
    customSettings: 'settings:excludeTestProjects=true'
    targetdir: '$(Build.SourcesDirectory)/CoverageResults'