.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包和构建输出缓存,减少重复构建时间
- 切换到更高规格的代理实例(如Microsoft-hosted的
改用coverlet.msbuild集成方式
放弃collector模式,改用msbuild集成方式收集覆盖数据,部分场景下性能更优:- 添加coverlet.msbuild包引用:
<PackageReference Include="coverlet.msbuild" Version="6.0.0" PrivateAssets="all" /> - 执行测试命令:
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
- 添加coverlet.msbuild包引用:
内容的提问来源于stack exchange,提问作者San Jaisy
相关产品推荐
相关产品推荐

