.NET 5 Web API 基于Coverlet生成代码覆盖率避免测试重复拷贝方案咨询
解决方案
1. 清理冗余测试项目,统一单测试项目配置
- 删掉额外创建的Collector和MSBuild对应测试项目,仅保留原有基于Xunit编写的Tests项目即可,Coverlet的两种触发组件不需要拆分对应不同测试项目
- 在Tests项目的
.csproj文件中同时引入两个Coverlet依赖:
<PackageReference Include="xunit" Version="2.4.1" /> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="coverlet.collector" Version="3.1.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="coverlet.msbuild" Version="3.1.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference>
- 确保Tests项目引用所有需要统计覆盖率的业务项目:
<ProjectReference Include="..\你的主Web项目名.csproj" /> <ProjectReference Include="..\你的Infrastructure项目名.csproj" /> <ProjectReference Include="..\你的Models项目名.csproj" />
2. 配置覆盖率统计范围,覆盖全量业务代码
默认Coverlet仅统计和测试用例直接关联的程序集,这是你目前只有PrimeController有覆盖率数据的核心原因,手动指定统计范围即可解决,两种配置方式可选:
方式1:运行命令传参(临时调试用)
- Collector触发方式命令:
dotnet test --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Include="[你的主Web项目名]*,[你的Infrastructure项目名]*,[你的Models项目名]*" - MSBuild触发方式命令:
dotnet test /p:CollectCoverage=true /p:Include="[你的主Web项目名]*,[你的Infrastructure项目名]*,[你的Models项目名]*"
方式2:配置文件永久生效(推荐)
在Tests项目根目录新建coverlet.runsettings文件,内容如下,可灵活配置包含/排除规则:
<?xml version="1.0" encoding="utf-8" ?> <RunSettings> <DataCollectionRunSettings> <DataCollectors> <DataCollector friendlyName="XPlat Code Coverage"> <Configuration> <Include>[你的主Web项目名]*,[你的Infrastructure项目名]*,[你的Models项目名]*</Include> <Exclude>[*Tests*]*</Exclude> <ExcludeByFile>**/Migrations/**,**/Program.cs,**/Startup.cs</ExcludeByFile> </Configuration> </DataCollector> </DataCollectors> </DataCollectionRunSettings> </RunSettings>
后续运行测试时直接指定配置文件即可,无需每次传参:dotnet test --settings coverlet.runsettings
如果使用MSBuild触发,也可以直接把规则写到Tests项目的.csproj文件中:
<PropertyGroup> <CollectCoverage>true</CollectCoverage> <Include>[你的主Web项目名]*,[你的Infrastructure项目名]*,[你的Models项目名]*</Include> <Exclude>[*Tests*]*</Exclude> <ExcludeByFile>**/Migrations/**,**/Program.cs,**/Startup.cs</ExcludeByFile> </PropertyGroup>
配置完成后直接运行dotnet test就会自动生成全量代码覆盖率报告。
3. 配置验证
运行测试命令后检查生成的覆盖率报告,确认:
- 主Web项目所有控制器的覆盖率数据正常展示
- Infrastructure项目的服务、仓储逻辑覆盖率数据正常展示
- 测试项目本身、迁移文件、启动类等不需要统计的内容已被排除
内容的提问来源于stack exchange,提问作者Bharat
相关产品推荐
相关产品推荐

