BuildQualityChecks未读取全部覆盖率报告,如何合并多份报告校验?
问题:合并多项目单元测试覆盖率报告以确保BuildQualityChecks基于完整数据校验
问题现象
- 解决方案包含3个分别对应Api、Service、Data的单元测试项目,构建时生成3份测试结果,但
PublishCodeCoverageResults任务仅读取其中一份报告 - 管道的Code Coverage标签显示总行覆盖率正确,但代码覆盖率工具数值偏低,
BuildQualityChecks统计的已覆盖行数极少 - 发布步骤出现警告:
##[warning]Multiple file or directory matches were found. Using the first match: /azp/_work/_temp/1c8c6bf9-96be-405d-b0b5-b852eb474a1b/coverage.cobertura.xml
当前管道配置
- task: DotNetCoreCLI@2 displayName: dotnet test $(buildConfiguration) inputs: command: test publishTestResults: true projects: '$(unitTestsDirs)/**/*.csproj' arguments: '--configuration $(buildConfiguration) --no-build --collect:"XPlat Code Coverage" --settings "./coverage.runsettings" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura' - task: PublishCodeCoverageResults@1 displayName: 'Publish code coverage report' inputs: codeCoverageTool: 'Cobertura' summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml' - task: BuildQualityChecks@9 displayName: 'Check build quality' inputs: checkCoverage: true coverageFailOption: fixed coverageType: lines coverageThreshold: $(CoverageThreashold) buildPlatform: $(BuildPlatform)
测试输出片段
Results File: /azp/_work/_temp/_rancher-ubuntu-on-prem-agents-nhpsb_2024-11-18_15_05_23.trx Attachments: /azp/_work/_temp/d0caa73f-caee-48d1-b626-f49093a0fb14/_rancher-ubuntu-on-prem-agents-nhpsb_2024-11-18.15_05_23.cobertura.xml /azp/_work/_temp/d0caa73f-caee-48d1-b626-f49093a0fb14/coverage.cobertura.xml Results File: /azp/_work/_temp/_rancher-ubuntu-on-prem-agents-nhpsb_2024-11-18_15_05_30.trx Attachments: /azp/_work/_temp/1c8c6bf9-96be-405d-b0b5-b852eb474a1b/_rancher-ubuntu-on-prem-agents-nhpsb_2024-11-18.15_05_31.cobertura.xml /azp/_work/_temp/1c8c6bf9-96be-405d-b0b5-b852eb474a1b/coverage.cobertura.xml Results File: /azp/_work/_temp/_rancher-ubuntu-on-prem-agents-nhpsb_2024-11-18_15_05_35.trx Attachments: /azp/_work/_temp/6bb84b94-f726-44b0-94ce-3047f7af5c91/_rancher-ubuntu-on-prem-agents-nhpsb_2024-11-18.15_05_36.cobertura.xml /azp/_work/_temp/6bb84b94-f726-44b0-94ce-3047f7af5c91/coverage.cobertura.xml Async Command Start: Publish test results Publishing test results to test run '911742'. TestResults To Publish 55, Test run id:911742 Test results publishing 55, remaining: 0. Test run id: 911742 Publishing test results to test run '911744'. TestResults To Publish 50, Test run id:911744 Test results publishing 50, remaining: 0. Test run id: 911744 Publishing test results to test run '911743'. TestResults To Publish 71, Test run id:911743 Test results publishing 71, remaining: 0. Test run id: 911743 Published Test Run : https://dev.azure.com/xxxxx/Runs?runId=911742&_a=runCharts Published Test Run : https://dev.azure.com/xxxxx/Runs?runId=911744&_a=runCharts Published Test Run : https://dev.azure.com/xxxxx/Runs?runId=911743&_a=runCharts
解决方案
需要使用reportgenerator工具将多份Cobertura格式的覆盖率报告合并为一份,再提交给后续任务,步骤如下:
1. 安装ReportGenerator工具
在测试任务后添加任务安装全局工具:
- task: DotNetCoreCLI@2 displayName: Install ReportGenerator inputs: command: custom custom: tool arguments: install --global dotnet-reportgenerator-globaltool
2. 合并覆盖率报告
添加脚本任务收集所有报告并合并:
- task: Bash@3 displayName: Merge coverage reports inputs: targetType: 'inline' script: | reportgenerator -reports:$(Agent.TempDirectory)/**/coverage.cobertura.xml -targetdir:$(Build.SourcesDirectory)/coverage -reporttypes:Cobertura
3. 更新发布覆盖率报告任务
将目标指向合并后的报告:
- task: PublishCodeCoverageResults@1 displayName: 'Publish merged code coverage report' inputs: codeCoverageTool: 'Cobertura' summaryFileLocation: '$(Build.SourcesDirectory)/coverage/Cobertura.xml'
完整修改后的管道配置
- task: DotNetCoreCLI@2 displayName: dotnet test $(buildConfiguration) inputs: command: test publishTestResults: true projects: '$(unitTestsDirs)/**/*.csproj' arguments: '--configuration $(buildConfiguration) --no-build --collect:"XPlat Code Coverage" --settings "./coverage.runsettings" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura' - task: DotNetCoreCLI@2 displayName: Install ReportGenerator inputs: command: custom custom: tool arguments: install --global dotnet-reportgenerator-globaltool - task: Bash@3 displayName: Merge coverage reports inputs: targetType: 'inline' script: | reportgenerator -reports:$(Agent.TempDirectory)/**/coverage.cobertura.xml -targetdir:$(Build.SourcesDirectory)/coverage -reporttypes:Cobertura - task: PublishCodeCoverageResults@1 displayName: 'Publish merged code coverage report' inputs: codeCoverageTool: 'Cobertura' summaryFileLocation: '$(Build.SourcesDirectory)/coverage/Cobertura.xml' - task: BuildQualityChecks@9 displayName: 'Check build quality' inputs: checkCoverage: true coverageFailOption: fixed coverageType: lines coverageThreshold: $(CoverageThreashold) buildPlatform: $(BuildPlatform)
说明
ReportGenerator会将所有分散的覆盖率报告合并为一份完整的Cobertura格式报告,确保PublishCodeCoverageResults和BuildQualityChecks任务都能基于完整的覆盖率数据运行,合并后的报告路径可根据需求自行调整。
内容的提问来源于stack exchange,提问作者Dimuth Ruwantha
相关产品推荐
相关产品推荐

