配置Runsettings仅统计Adaptive项目代码覆盖率却生成空结果排查
问题:Runsettings配置代码覆盖率为空的排查与修复
需求说明
需要配置Runsettings文件,实现:
- 仅输出名称包含Adaptive的项目的代码覆盖率
- 排除所有测试项目
- 仅扫描当前解决方案本地的src目录
当前配置与文件夹结构
现有Runsettings配置
<CodeCoverage> <ModulePaths> <Include> <ModulePath>.*Adaptive.*\.dll</ModulePath> </Include> <Exclude> <ModulePath>.*Tests.*</ModulePath> </Exclude> </ModulePaths> <Attributes> <Exclude> <Attribute>^System\.Diagnostics\.CodeAnalysis\.ExcludeFromCodeCoverageAttribute$</Attribute> </Exclude> </Attributes> </CodeCoverage>
本地文件夹结构
Adaptive.sln src\Adaptive.Something\Adaptive.Something.csproj src\Adaptive.Nested\Adaptive.SomethingOtherThing\Adaptive.SomethingOtherThing.csproj src\UnitTests.Adaptive.Something.csproj tests\UnitTests.Adaptive.Something.csproj
配置错误分析
- 未限定源代码目录:现有配置仅过滤dll名称,未限定仅扫描src目录下的项目代码,可能导致漏扫或匹配非目标文件。
- 测试项目排除逻辑不足:src目录下的测试项目编译后dll同时包含
Adaptive和Tests,现有Exclude规则可能因正则覆盖范围问题,无法完全排除这类测试dll。 - 缺少源代码路径过滤:仅靠ModulePath(dll路径)过滤不够,需配合Sources节点限定源代码所在目录,确保仅统计目标范围内的代码。
修正后的Runsettings配置
<CodeCoverage> <!-- 限定仅扫描src目录下的源代码 --> <Sources> <Include> <Source>$(SolutionDir)src\**\*.cs</Source> </Include> <Exclude> <Source>$(SolutionDir)src\**\*Tests*.cs</Source> <Source>$(SolutionDir)tests\**\*.cs</Source> </Exclude> </Sources> <!-- 过滤要统计的dll:包含Adaptive且排除测试项目dll --> <ModulePaths> <Include> <ModulePath>.*Adaptive[^Tests]*\.dll$</ModulePath> </Include> <Exclude> <ModulePath>.*Tests.*\.dll$</ModulePath> <ModulePath>.*Test.*\.dll$</ModulePath> </Exclude> </ModulePaths> <Attributes> <Exclude> <Attribute>^System\.Diagnostics\.CodeAnalysis\.ExcludeFromCodeCoverageAttribute$</Attribute> </Exclude> </Attributes> <!-- 可选:排除测试框架相关特性方法 --> <Functions> <Exclude> <Function>^Microsoft\.VisualStudio\.TestTools\.Testing\.TestCleanupAttribute$</Function> <Function>^Microsoft\.VisualStudio\.TestTools\.Testing\.TestInitializeAttribute$</Function> <Function>^Microsoft\.VisualStudio\.TestTools\.Testing\.TestMethodAttribute$</Function> </Exclude> </Functions> </CodeCoverage>
关键修正点说明
- Sources节点:通过
$(SolutionDir)src\**\*.cs锁定src目录下的所有C#代码,同时排除src和tests目录内的测试文件,从源代码层面缩小统计范围。 - ModulePaths优化:
- Include规则改为
.*Adaptive[^Tests]*\.dll$,确保匹配包含Adaptive但不含Tests的dll,避免误匹配测试项目的输出文件。 - Exclude补充
.*Test.*\.dll$,覆盖更多测试dll的命名场景。
- Include规则改为
- Functions节点:可选配置,排除测试框架的特性方法,避免统计测试代码本身。
额外验证步骤
- 确认测试项目的csproj文件中已添加
<IsTestProject>true</IsTestProject>标记,让覆盖率工具自动识别并排除测试项目。 - 运行覆盖率统计时,指定正确的Runsettings文件,示例命令:
dotnet test --settings ./YourSettings.runsettings --collect:"XPlat Code Coverage"
- 检查编译输出的dll路径(通常在
bin/Debug/netX/目录),确认正则规则能正确匹配到src下Adaptive项目的dll文件。
内容的提问来源于stack exchange,提问作者Nicholas Mayne
相关产品推荐
相关产品推荐

