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

如何解决Azure YAML流水线VSTest@3任务代码覆盖率无法显示问题

问题:Azure DevOps VSTest任务无法收集代码覆盖率

当前配置Azure YAML流水线的测试执行任务,测试DLL存放在自定义文件夹,测试任务可正常执行但代码覆盖率数据不显示,任务日志提示找不到"Code Coverage"数据收集器。


现有配置

测试任务YAML

- task: VisualStudioTestPlatformInstaller@1
  inputs:
    packageFeedSelector: 'nugetOrg'
    versionSelector: 'latestStable'

- task: VSTest@3
  inputs:
    testSelector: 'testAssemblies'
    testAssemblyVer2: |
      **\References\Client\Debug\**\*test.dll
    searchFolder: '$(Agent.BuildDirectory)'
    runInParallel: false
    codeCoverageEnabled: true
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    diagnosticsEnabled: true
    pathtoCustomTestAdapters: '$(Agent.BuildDirectory)\References\Client\Debug\'

测试项目.csproj

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>net48</TargetFramework>
        <ImplicitUsings>disable</ImplicitUsings>
        <Nullable>disable</Nullable>
    </PropertyGroup>

    <ItemGroup>
      <PackageReference Include="NUnit" Version="4.0.1" />
      <PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
      <PackageReference Include="coverlet.msbuild" Version="6.0.0" />
    </ItemGroup>

    <ItemGroup>
      <ProjectReference Include="..\path\to\project.csproj" />
    </ItemGroup>

</Project>

错误日志片段

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
Blame: Attaching crash dump utility to process testhost.net48 (6444).
Data collection : Unable to find a datacollector with a friendly name 'Code Coverage'.
Data collection : Could not find the data collector 'Code Coverage'
NUnit Adapter 4.5.0.0: Test execution started
...

解决方案

提供两种可行方案,可根据环境需求选择:

方案1:使用Coverlet生成并上传覆盖率报告

已在项目中引用coverlet.msbuild,可通过VSTest任务传递参数生成覆盖率报告,再上传至Azure DevOps展示。

修改后的测试流水线配置

- task: VisualStudioTestPlatformInstaller@1
  inputs:
    packageFeedSelector: 'nugetOrg'
    versionSelector: 'latestStable'

- task: VSTest@3
  inputs:
    testSelector: 'testAssemblies'
    testAssemblyVer2: |
      **\References\Client\Debug\**\*test.dll
    searchFolder: '$(Agent.BuildDirectory)'
    runInParallel: false
    codeCoverageEnabled: false  # 关闭内置覆盖率,改用Coverlet
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    diagnosticsEnabled: true
    pathtoCustomTestAdapters: '$(Agent.BuildDirectory)\References\Client\Debug\'
    # 指定Coverlet收集器及结果目录
    otherConsoleOptions: '/collect:"XPlat Code Coverage" /ResultsDirectory:$(Agent.TempDirectory)\CoverageResults'

# 添加发布覆盖率报告任务
- task: PublishCodeCoverageResults@2
  inputs:
    summaryFileLocation: '$(Agent.TempDirectory)\CoverageResults\**\coverage.cobertura.xml'
    failIfCoverageEmpty: false

说明:XPlat Code Coverage是Coverlet支持的跨平台收集器,生成标准cobertura格式报告,上传后可直接在Azure DevOps流水线页面查看覆盖率统计。


方案2:使用微软官方代码覆盖率工具(适用于.NET Framework)

若需使用微软内置的Code Coverage收集器,需确保代理环境有对应组件,并通过配置文件指定收集规则。

步骤1:确保代理环境包含测试组件

使用托管代理(如windows-latest)或安装Visual Studio测试工作负载:

# 替代VisualStudioTestPlatformInstaller,安装完整的测试工作负载
- task: InstallVisualStudioComponents@1
  inputs:
    packageSelector: 'Microsoft.VisualStudio.Workload.ManagedTest'
    vsVersion: 'latest'

步骤2:添加覆盖率配置文件

在代码仓库根目录创建coveragerunsettings.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=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
        <Configuration>
          <CodeCoverage>
            <ModulePaths>
              <Include>
                <ModulePath>.*\.dll$</ModulePath>
              </Include>
              <Exclude>
                <ModulePath>.*test\.dll$</ModulePath>
              </Exclude>
            </ModulePaths>
          </CodeCoverage>
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>

步骤3:更新VSTest任务引用配置文件

- task: VSTest@3
  inputs:
    testSelector: 'testAssemblies'
    testAssemblyVer2: |
      **\References\Client\Debug\**\*test.dll
    searchFolder: '$(Agent.BuildDirectory)'
    runInParallel: false
    codeCoverageEnabled: true
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    diagnosticsEnabled: true
    pathtoCustomTestAdapters: '$(Agent.BuildDirectory)\References\Client\Debug\'
    runSettingsFile: '$(Build.SourcesDirectory)\coveragerunsettings.runsettings'

说明:该方案依赖Visual Studio内置的代码覆盖率组件,自托管代理需确保已安装Visual Studio测试工作负载;托管代理(如windows-latest)默认包含该组件。


关键注意事项

  • 确保被测试的业务DLL与测试DLL在同一目录,或在配置文件中指定正确的业务DLL路径,否则覆盖率收集会不准确。
  • Coverlet方案无需依赖Visual Studio组件,跨平台兼容性更强,同时支持.NET Framework和.NET Core/.NET 5+项目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:03:24