计算dotnet项目的测试覆盖率
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类排除。
文档在这里,就不赘述了。