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

Azure Pipeline生成.NET Core代码覆盖率报告失败,求原因及解决方法

问题

尝试使用Azure Pipeline为.NET Core项目生成代码覆盖率结果,pipeline.yml配置如下:

trigger:
- sonar-analysis

pool:
  vmImage: 'ubuntu-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:

- checkout: self
  persistCredentials: true
  submodules: true

- task: UseDotNet@2
  inputs:
    version: '6.x'
- task: DotNetCoreCLI@2
  inputs:
    command: 'build'
    projects: '**/**/*.csproj'
    arguments: '--verbosity n'

- task: DotNetCoreCLI@2
  displayName: 'dotnet test'
  inputs:
    command: 'test'
    projects: '**/*Tests/*.csproj'
    arguments: '--configuration $(buildConfiguration) --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura'
  
- task: PublishCodeCoverageResults@1
  displayName: 'Publish code coverage report'
  inputs:
    codeCoverageTool: 'Cobertura'
    summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'

测试可成功运行并在Tests标签页显示结果,但无法生成代码覆盖率报告,相关错误如下:

dotnet test任务错误:

Data collector 'XPlat code coverage' message:
[coverlet]System.TypeLoadException: Could not load type
'Microsoft.Extensions.DependencyInjection.ServiceCollection' from
assembly 'Microsoft.Extensions.DependencyInjection, Version=6.0.0.0,
Culture=neutral, PublicKeyToken=xyz'. at
Coverlet.Collector.DataCollection.CoverletCoverageCollector.GetDefaultServiceCollection(TestPlatformEqtTrace
eqtTrace, TestPlatformLogger logger, String testModule) at
Coverlet.Collector.DataCollection.CoverletCoverageCollector.OnSessionStart(Object
sender, SessionStartEventArgs sessionStartEventArgs) in
/_/src/coverlet.collector/DataCollection/CoverletCoverageCollector.cs:line
132.

Publish Code Coverage Results任务警告:

##[warning]No code coverage results were found to publish.

相同流水线在其他项目可正常运行,请问该问题的原因及解决方法是什么?

原因分析

该错误由coverlet.collector与项目依赖的Microsoft.Extensions.DependencyInjection组件版本不匹配导致。当coverlet尝试加载.NET 6版本的ServiceCollection类型时,项目中可能引用了该组件的其他版本(如更低版本),或测试项目依赖项存在版本冲突,导致类型加载失败,进而无法生成覆盖率报告文件。

解决方法
  • 更新coverlet.collector版本:在测试项目的.csproj文件中,明确指定与.NET 6兼容的稳定版本,替换原有引用:
    <PackageReference Include="coverlet.collector" Version="3.2.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    
  • 统一依赖版本:确保项目中所有Microsoft.Extensions.DependencyInjection相关依赖的版本与.NET 6(6.0.x)保持一致,避免冲突。可在解决方案的Directory.Packages.props文件中统一管理版本:
    <Project>
      <PropertyGroup>
        <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
      </PropertyGroup>
      <ItemGroup>
        <PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
      </ItemGroup>
    </Project>
    
  • 清理并重新构建:在流水线的build步骤前添加清理命令,清除残留的旧版本依赖文件:
    - task: DotNetCoreCLI@2
      inputs:
        command: 'clean'
        projects: '**/**/*.csproj'
        arguments: '--configuration $(buildConfiguration)'
    
  • 改用coverlet.msbuild方式:若collector方式仍有问题,可切换为msbuild集成方式,直接在测试命令中指定覆盖率参数:
    - task: DotNetCoreCLI@2
      displayName: 'dotnet test with coverage'
      inputs:
        command: 'test'
        projects: '**/*Tests/*.csproj'
        arguments: '--configuration $(buildConfiguration) /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=$(Agent.TempDirectory)/coverage.cobertura.xml'
    
    同时确保测试项目引用coverlet.msbuild包:
    <PackageReference Include="coverlet.msbuild" Version="3.2.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:20:34