.NET Core 覆盖率测试
项目搭建
首先执行命令 dotnet new classlib --name App 来创建一个类库程序作为测试的对象,该类库只包含一个 SumService 类:
1 | using System; |
然后创建一个基于 xunit 的单元测试项目来编写测试用例,并将 App 类库项目作为项目引用加入到 App.Tests 项目中:
1 | dotnet new xunit --name App.Tests |
并编写一个测试用例 SumServiceTest:
1 | using System; |
接着创建一个解决方案,并将 App 和 App.Tests 项目加入到该解决方案中:
1 | dotnet new sln --name App |
最后项目结构如下:
1 | ├── App |
覆盖率测试
覆盖率测试依赖 coverlet,在创建单元测试项目时已自动添加了该依赖,执行测试时添加 coverlet 相关的参数即可生成测试覆盖率报告:
1 | dotnet test --collect:"XPlat Code Coverage" |
执行成功后会在 App.Tests/TestResults/{random-string} 目录下生成名为 coverage.cobertura.xml 的测试覆盖率报告。
但是,自动创建的单元测试项目默认添加的 coverlet 依赖是 coverlet.collector,目前还不支持在控制台中打印测试覆盖率报告:
At the moment VSTest integration doesn’t support all features of msbuild and .NET tool, for instance show result on console, report merging and threshold validation. We’re working to fill the gaps.
如果希望在控制台中打印测试覆盖率报告可将 coverlet.collector 依赖改为 coverlet.msbuild:
1 | dotnet remove .\App.Tests package coverlet.collector |
然后执行测试命令:
1 | dotnet test /p:CollectCoverage=true |
即可在控制台打印测试覆盖率报告:
1 | Calculating coverage result... |
集成 codecov
coverlet.msbuild
集成 codecov 需要指定测试覆盖率报告文件的路径,暂不支持 coverlet.msbuild 默认生成的 json 格式的文件,可以在执行测试时添加 /p:CoverletOutputFormat=opencover 参数来生成 opencover 格式的文件,相应的 .appveyor.yml 文件内容如下:
1 | image: Visual Studio 2019 |
coverlet.collector
使用 coverlet.collector 时每次生成的测试覆盖率报告所在的路径是随机的,所以需要将测试覆盖率报告复制到一个固定的路径中,可以使用如下的 PowerShell 脚本:
1 | $source = "./App.Tests/TestResults" |
相应的 .appveyor.yml 文件内容如下:
1 | image: Visual Studio 2019 |
完整的代码可参考 dotnet-core-coverlet-msbuild-demo 及 dotnet-core-coverlet-collector-demo。