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

.NET6项目执行dotnet test采集代码覆盖耗时过长求助

解决.NET6测试代码覆盖收集耗时过长的问题

我的.NET6应用依赖项如下:

<ItemGroup>
  <PackageReference Include="Abp.MemoryDb" Version="6.4.0" />
  <PackageReference Include="Microsoft.Data.Sqlite" Version="5.0.8" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="6.0.10" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.10" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
  <PackageReference Include="xunit" Version="2.4.1" />
  <PackageReference Include="xunit.extensibility.execution" Version="2.4.1" />
  <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
    <PrivateAssets>all</PrivateAssets>
    <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
  </PackageReference>
  <PackageReference Include="Shouldly" Version="4.1.0" />
  <PackageReference Include="NSubstitute" Version="3.1.0" />
  <PackageReference Include="coverlet.collector" Version="3.2.0">
    <PrivateAssets>all</PrivateAssets>
    <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
  </PackageReference>
</ItemGroup>

执行dotnet test时耗时正常,但执行dotnet test --collect:"XPlat Code Coverage"时,本地和Azure Pipeline中耗时都长达30-40分钟,以下是可行的解决思路:

  • 升级coverlet.collector版本
    当前使用的3.2.0版本存在已知性能瓶颈,后续6.x及以上版本针对代码覆盖收集逻辑做了大量优化。更新包引用到最新稳定版:

    <PackageReference Include="coverlet.collector" Version="6.0.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    

    升级后重新执行测试命令验证耗时变化。

  • 排除无需统计的程序集
    代码覆盖收集会扫描所有关联程序集,可通过配置排除第三方库、测试项目自身或非业务核心程序集,减少扫描范围。在项目根目录创建coverlet.runsettings文件:

    <RunSettings>
      <DataCollectionRunSettings>
        <DataCollectors>
          <DataCollector friendlyName="XPlat Code Coverage">
            <Configuration>
              <Exclude>[*Tests.dll],[Abp.MemoryDb.dll],[Microsoft.*.dll]</Exclude>
            </Configuration>
          </DataCollector>
        </DataCollectors>
      </DataCollectionRunSettings>
    </RunSettings>
    

    执行测试时指定配置文件:dotnet test --collect:"XPlat Code Coverage" --settings coverlet.runsettings

  • 启用测试并行执行
    xunit原生支持并行测试,在测试项目中添加xunit.runner.json文件,开启并行并调整线程数:

    {
      "parallelizeTestCollections": true,
      "maxParallelThreads": -1
    }
    

    注意确保测试用例之间无共享状态,避免并行导致的测试失败。

  • 优化测试用例逻辑
    排查是否存在耗时过长的测试用例,针对性优化:

    • 复用测试上下文或数据库连接,避免重复初始化
    • 用NSubstituteMock替代真实数据库操作,减少IO耗时
    • 拆分大型测试用例为多个独立小用例
  • 调整Azure Pipeline资源配置
    在Azure Pipeline中可通过以下方式提速:

    • 切换到更高规格的代理实例(如Microsoft-hosted的ubuntu-latest大内存版本)
    • 给dotnet test命令添加--parallel参数,强制开启并行
    • 配置NuGet包和构建输出缓存,减少重复构建时间
  • 改用coverlet.msbuild集成方式
    放弃collector模式,改用msbuild集成方式收集覆盖数据,部分场景下性能更优:

    1. 添加coverlet.msbuild包引用:
      <PackageReference Include="coverlet.msbuild" Version="6.0.0" PrivateAssets="all" />
      
    2. 执行测试命令:
      dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:55:31