You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure DevOps Pipeline:C# .NET 9代码覆盖率结果无法发布问题排查

Azure DevOps Pipeline 代码覆盖率文件定位问题解决指南

核心问题分析

VsTest任务执行单元测试后,coverage.cobertura.xml文件生成路径不明确,导致后续PublishCodeCoverageResults@2和PowerShell任务无法定位到目标文件。以下是针对性的修复步骤:


1. 修正VsTest任务,明确结果输出目录

在VsTest任务中添加resultsFolder参数,将测试结果(含覆盖率文件)统一输出到可控目录:

steps:
- task: VSTest@2
  displayName: 'VsTest - testAssemblies'
  inputs:
    testAssemblyVer2: |
     **\$(BuildConfiguration)\**test*.dll
     !**\obj\**
    runSettingsFile: '$/B3API/Main/B3API.Tests/codecoverage.runsettings'
    runInParallel: true
    runTestsInIsolation: false
    codeCoverageEnabled: true
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    failOnMinTestsNotRun: true
    resultsFolder: '$(Build.ArtifactStagingDirectory)/TestResults' # 指定统一输出目录

2. 完善codecoverage.runsettings,指定覆盖率文件路径

在runsettings中添加Output节点,直接定义覆盖率文件的生成路径和文件名:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
  <DataCollectionRunSettings>
    <DataCollectors>
      <DataCollector friendlyName="Code Coverage">
        <Configuration>
          <Format>cobertura</Format>
          <Output>$(Build.ArtifactStagingDirectory)/TestResults/coverage.cobertura.xml</Output> <!-- 明确输出路径 -->
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>

3. 调整PublishCodeCoverageResults任务路径

使用绝对路径替代通配符,确保精准匹配目标文件:

steps:
- task: PublishCodeCoverageResults@2
  displayName: 'Publish code coverage results'
  inputs:
    summaryFileLocation: '$(Build.ArtifactStagingDirectory)/TestResults/coverage.cobertura.xml'
    pathToSources: '$(System.DefaultWorkingDirectory)' # 指向源代码根目录

4. 修复PowerShell任务的文件读取逻辑

移除通配符(Get-Content不支持**通配符直接读取文件),添加文件存在性检查:

steps:
- powershell: |
   $coverageFile = "$(Build.ArtifactStagingDirectory)/TestResults/coverage.cobertura.xml"
   if (-not (Test-Path $coverageFile)) {
       throw "Coverage file not found at path: $coverageFile"
   }
   [xml]$coverageData = Get-Content $coverageFile
   $coveragePercentage = [math]::Round($coverageData.coverage.@line-rate * 100, 2) # 转换为百分比格式
   
   Write-Host "##vso[task.setvariable variable=coveragePercentage]$coveragePercentage"
   
  displayName: 'Store Coverage in variable'

5. 验证文件生成情况(可选)

在VsTest任务后添加文件列表任务,确认覆盖率文件是否生成:

steps:
- powershell: |
   Get-ChildItem -Path "$(Build.ArtifactStagingDirectory)/TestResults" -Recurse
  displayName: 'List Test Results Files'

内容的提问来源于stack exchange,提问作者Dennis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:08:16