VS的测试覆盖率功能需要Enterprise版本才有,不过也是有开源免费的工具来帮助我们查看代码覆盖情况的。

coverlet https://github.com/tonerdo/coverlet

ReportGenerator https://github.com/danielpalme/ReportGenerator

coverlet用于计算,并将结果导出为json或xml。ReportGenerator可以将结果转换成漂亮的网页供我们查看。

安装

dotnet如何装就不说了,装好dotnet后,运行下面两行命令安装这两个工具:

dotnet tool install -g dotnet-reportgenerator-globaltool

dotnet tool install --global coverlet.console

这里都是采用了全局安装的方式。

coverlet是支持nuget方式安装的,在测试项目中添加coverlet.msbuild包,之后测试时运行命令 dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput="analysis.xml" 就会将结果保存到analysis.xml中。
不过我没发现如何将这条命令添加到vs中,让vs在运行测试的同时生成分析文件,所以这个方式就先作罢了。

使用

假设你的测试项目名字是TEST_PROJ,工作目录是解决方案根目录,并且生成的结果全部保存到.coverage文件夹。

目录结构如下:
.coverage/
TEST_PROJ/
solution.sln

首先编译项目:

dotnet build TEST_PROJ -o "../.coverage"

这里build命令会进入TEST_PROJ文件夹,所以用../来返回上层目录。

然后使用coverlet来测试并生成结果:

coverlet ".coverage/TEST_PROJ.dll" --target "dotnet" --targetargs "vstest .coverage/TEST_PROJ.dll" --format "opencover" --output "./.coverage/analysis.xml"

第一个参数是编译好的测试文件,coverlet会执行target和targetargs中的值进行测试(并计算覆盖率)。coverlet支持导出多种格式,这里使用ReportGenerator支持的opencover格式。

最后来生成网页报告:

reportgenerator "-reports:.coverage/analysis.xml" "-targetdir:.coverage"

你可以把以上命令保存到一个bat文件中,并在最后运行start .coverage/index.htm来打开网页,这样一个全自动的覆盖率生成脚本就完成了。

更多

coverlet可以使用–exclude和–include手动排除或添加类。

以排除举例,在命令行后添加--exclude "[Assembly]ClassName"即可将Assembly项目中的ClassName类排除。

文档在这里,就不赘述了。