我最近使用 C# .NET 8.0 项目从头开始创建了一个解决方案。
该项目仅涉及单元测试和隔离类,我打算将其作为算法练习的文件夹。
该项目使用 mstest 作为测试运行程序,使用 coverlet 作为覆盖率收集器。
我设置了项目的属性,以便它生成 lcov.info 格式的覆盖率输出:
<!-- Coverage -->
<CollectCoverage>true</CollectCoverage>
<CoverletOutputFormat>lcov</CoverletOutputFormat>
<CoverletOutput>./lcov.info</CoverletOutput>
<IncludeTestAssembly>true</IncludeTestAssembly>
该项目只有一个类,只有一行方法。 另外,只有一个测试类和一种测试方法。
测试运行中涵盖了该行,但在 shell 摘要中我得到了:
+----------------------------+--------+--------+--------+
| Module | Line | Branch | Method |
+----------------------------+--------+--------+--------+
| algorithm-exercises-csharp | 88.88% | 100% | 66.66% |
+----------------------------+--------+--------+--------+
+---------+--------+--------+--------+
| | Line | Branch | Method |
+---------+--------+--------+--------+
| Total | 88.88% | 100% | 66.66% |
+---------+--------+--------+--------+
| Average | 88.88% | 100% | 66.66% |
+---------+--------+--------+--------+
然后尝试验证哪一部分不会被覆盖。
通过 Visual Studio Code 中的 Coverage-gutters,我能够验证所有代码是否都已被覆盖。
然后将 lcov.info 的输出传送到 codecov。这里服务告诉我我的覆盖率是 100%。
为什么cli的结果不一样? 如何将 CLI 中的覆盖率提高到 100%?
使用的命令(在.sln级别):
dotnet test --verbosity normal
运行时和 SDK:
dotnet --version
8.0.204
依赖关系:
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="coverlet.msbuild" Version="6.0.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.3.1" />
<PackageReference Include="MSTest.TestFramework" Version="3.3.1" />
</ItemGroup>
IDE:
Visual Studio Code + C# 开发工具包
您似乎正在为
C:\Users\runneradmin\.nuget\packages\microsoft.net.test.sdk\17.9.0\build\netcoreapp3.1\Microsoft.NET.Test.Sdk.Program.cs
处的文件生成覆盖范围,该文件未被覆盖。如果删除这个文件再运行coverage,是不是显示为1005?