在Azure DevOps中排除DTO文件并生成coverage.cobertura.xml代码覆盖率文件的方法
在Azure DevOps中排除DTO文件并生成coverage.cobertura.xml代码覆盖率文件的方法
我来帮你搞定这个问题!结合你遇到的情况,我们需要同时解决两个核心点:一是让使用runsettings配置时能正常生成coverage.cobertura.xml文件,二是确保所有带DTO标识的文件都被排除在代码覆盖率统计之外。
1. 修正RunSettings配置文件
你的现有runsettings缺少了指定覆盖率报告格式的关键配置,这也是本地使用该文件时无法生成Cobertura格式文件的原因。另外,原来的DTO排除正则表达式不够精准,咱们一起调整:
<?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=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <Configuration> <CodeCoverage> <!-- 强制生成Cobertura格式的覆盖率报告 --> <ReportOutputFormat>Cobertura</ReportOutputFormat> <ModulePaths> <Exclude> <!-- 精准匹配所有含DTO的程序集和源码文件 --> <ModulePath>.*DTO\.dll$</ModulePath> <ModulePath>.*DTO\.cs$</ModulePath> </Exclude> </ModulePaths> <!-- 保留微软推荐的默认配置,不要修改 --> <UseVerifiableInstrumentation>True</UseVerifiableInstrumentation> <AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses> <CollectFromChildProcesses>True</CollectFromChildProcesses> <CollectAspDotNet>False</CollectAspDotNet> </CodeCoverage> </Configuration> </DataCollector> </DataCollectors> </DataCollectionRunSettings> </RunSettings>
这里的关键修改:
- 添加
<ReportOutputFormat>Cobertura</ReportOutputFormat>:明确告诉代码覆盖率收集器输出Cobertura格式的报告; - 优化排除正则:分别匹配以
DTO.dll和DTO.cs结尾的文件,确保所有DTO相关代码都被排除统计。
2. 调整本地测试命令
用修正后的runsettings,执行下面的命令就能生成coverage.cobertura.xml了:
dotnet test --configuration Release --collect:"Code coverage" --settings ./cover.runsettings
默认情况下,生成的文件会放在TestResults/{随机GUID}/coverage.cobertura.xml目录下,你可以加上--results-directory参数指定固定输出目录,方便查找:
dotnet test --configuration Release --collect:"Code coverage" --settings ./cover.runsettings --results-directory ./TestResults
3. 更新Azure DevOps Pipeline任务
你的现有Pipeline任务已经指定了runsettings,但咱们可以优化参数,确保文件能被正确保留,还能可选地在DevOps平台展示覆盖率报告:
- task: DotNetCoreCLI@2 displayName: "Run Tests" inputs: command: "test" projects: | TestCodeCoverage\Domain.Tests\Domain.Tests.csproj arguments: '--configuration $(BuildConfiguration) --collect:"Code coverage" --settings TestCodeCoverage/cover.runsettings --results-directory $(Build.ArtifactStagingDirectory)/TestResults' # 可选步骤:把覆盖率报告发布到Azure DevOps,方便直观查看 - task: PublishCodeCoverageResults@1 displayName: "Publish Code Coverage" inputs: codeCoverageTool: "Cobertura" summaryFileLocation: "$(Build.ArtifactStagingDirectory)/TestResults/**/coverage.cobertura.xml"
优化点说明:
--results-directory $(Build.ArtifactStagingDirectory)/TestResults:把测试结果(包括覆盖率文件)放到构建工件目录,方便后续保存或发布;- 新增的
PublishCodeCoverageResults@1任务:会在Pipeline的结果页面展示覆盖率统计,你能直接看到DTO被排除后的覆盖率数据。
备注:内容来源于stack exchange,提问作者FMax
相关产品推荐
相关产品推荐

