Azure DevOps管道代码覆盖率如何排除第三方DLL文件
Azure DevOps 管道Cobertura覆盖率排除第三方DLL配置方法
问题原因
当前使用的VSTest@2任务仅配置了测试程序集的筛选规则,未给代码覆盖率采集器指定程序集排除规则,默认会把测试进程加载到的所有带PDB的程序集(包括第三方依赖DLL)都纳入覆盖率统计,因此最终报告会出现FluentAssertions、Microsoft.Azure等非业务代码的覆盖率数据。
配置方法
有两种可行的配置方式,按需选择即可:
方式1:直接在VSTest任务参数内追加排除规则(适合规则少的场景)
修改VSTest任务的otherConsoleOptions字段,在原有采集参数后追加Exclude配置,把要排除的第三方程序集匹配规则写进去,规则格式为[程序集通配符]类型通配符,多个规则用分号分隔。
修改后的VSTest任务片段参考:
- task: VSTest@2 displayName: 'Run .NET Core Unit Tests $(ucSolution)' continueOnError: true inputs: testSelector: 'testAssemblies' testAssemblyVer2: | **\MyApp.*.UnitTests.dll !**\*TestAdapter.dll !**\obj\** !**\ref\** searchFolder: '$(System.DefaultWorkingDirectory)' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' diagnosticsEnabled: true rerunFailedTests: true rerunFailedThreshold: '10' rerunMaxAttempts: '1' resultsFolder: '$(build.ArtifactStagingDirectory)\Test\Results\core' otherConsoleOptions: '/collect:"Code Coverage;Format=Cobertura;Exclude=[FluentAssertions*]*;[Microsoft.Azure*]*;[*Tests*]*;[*TestAdapter*]*;[Newtonsoft.Json*]*;[Moq*]*"'
常用排除规则可按需追加:
[FluentAssertions*]*:排除FluentAssertions相关所有程序集[Microsoft.Azure*]*:排除所有Azure SDK相关程序集[*Tests*]*:排除测试项目本身的程序集- 第三方库规则统一遵循
[DLL名称前缀*]*格式编写即可
方式2:使用.runsettings配置文件(适合规则多、需要长期维护的场景)
如果排除规则较多,写在命令行参数里可读性差,可以在代码仓库根目录添加.runsettings配置文件,在文件内配置覆盖率排除规则,然后在VSTest任务里指定该配置文件即可。
- 新建
.runsettings文件,内容参考:
<?xml version="1.0" encoding="utf-8"?> <RunSettings> <DataCollectionRunSettings> <DataCollectors> <DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <Configuration> <CodeCoverage> <Format>Cobertura</Format> <!-- 配置要排除的程序集/模块 --> <ModulePaths> <Exclude> <ModulePath>.*FluentAssertions.*</ModulePath> <ModulePath>.*Microsoft\.Azure.*</ModulePath> <ModulePath>.*TestAdapter.*</ModulePath> <ModulePath>.*moq.*</ModulePath> <ModulePath>.*Newtonsoft\.Json.*</ModulePath> </Exclude> </ModulePaths> <!-- 也可以按命名空间、特性排除,比如排除自动生成的代码 --> <Functions> <Exclude> <Function>.*\.g\..*</Function> </Exclude> </Functions> </CodeCoverage> </Configuration> </DataCollector> </DataCollectors> </DataCollectionRunSettings> </RunSettings>
- 修改VSTest任务,指定
runSettingsFile参数指向该配置文件,同时简化otherConsoleOptions:
- task: VSTest@2 displayName: 'Run .NET Core Unit Tests $(ucSolution)' continueOnError: true inputs: testSelector: 'testAssemblies' testAssemblyVer2: | **\MyApp.*.UnitTests.dll !**\*TestAdapter.dll !**\obj\** !**\ref\** searchFolder: '$(System.DefaultWorkingDirectory)' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' diagnosticsEnabled: true rerunFailedTests: true rerunFailedThreshold: '10' rerunMaxAttempts: '1' resultsFolder: '$(build.ArtifactStagingDirectory)\Test\Results\core' runSettingsFile: '$(System.DefaultWorkingDirectory)/.runsettings' otherConsoleOptions: '/collect:"Code Coverage"'
补充说明
PublishCodeCoverageResults@1任务本身不支持过滤覆盖率数据,所有过滤规则必须在VSTest执行测试、生成Cobertura XML报告的环节配置,发布环节只会原样上传生成的报告文件。- 配置完成后重新运行管道,第三方DLL的覆盖率数据就不会出现在最终报告中。
内容的提问来源于stack exchange,提问作者Tushar patel
相关产品推荐
相关产品推荐

