Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
67 lines (41 sloc) 2.64 KB
permalink display title tags emotag date comment layout component
/posts/test-coverage-in-dotnet
normal
计算dotnet项目的测试覆盖率
dotnet csharp
2019-08-16 12:19:26 UTC
true
post

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类排除。

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

You can’t perform that action at this time.