.net core 平台的测试框架有好几个可供选择,内置的MSTest框架、NUnit框架以及强大好用的xUnit框架,依托宇宙最强的编辑器Visual Studio,可以开展非常友好的测试以及快乐的展示测试的结果。如果仅限于此,那么这篇文章对你来说就是多余的,不妨看看其他的东东;但如果你想脱离VisualStudio的舒服圈,独立产生可以自由发布和查看的HTML报告,那么也许本篇文章能够帮你节约大量的尝试时间和彻底摆脱沮丧的心理,而体验一场快乐的旅程。
📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
📢本文作者:由webmote 原创,首发于 【CSDN】
📢作者格言:生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起加油!💪💪💪
1. 上手xUnit测试
利用向导,来生成一个新的xUnit测试项目即可。
当然,你也可以改造一个类库文件,只需要在Project文件内引用这些类库即可。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
</Project>
编写xUnit的测试用例超级简单,只需要在类函数增加声明[Fact]
即可。
有关怎么编写单元测试,可以参考《[关于单元测试,你不知道的那些事]。(https://blog.csdn.net/codeex/article/details/120476609)》
好了,一切就绪,开始我们的生成报告之旅。
2. 代码覆盖率(Code Coverage)
据微软的文档记载,数据采集功能是在测试平台的15.3增加支持的,其被集成在VS 2017 15.3+ 和dotnet-cli 2.0.0+ 上,而有了数据采集扩展后,就可以对会话和测试用例的一些事件就行分析了,在之上进行扩展就有了覆盖率、圈复杂度等其他指标的度量了。
使用如下命令收集覆盖率等的测试:
dotnet test --collect "Code Coverage"
在 Windows 上,可以使用 --collect “Code Coverage” 选项收集代码覆盖率。此选项将生成“.coverage”文件,该文件可在 Visual Studio 2019 Enterprise
中打开。
当然在Linux平台,这个命令的响应是:
数据收集器“Code Coverage”消息: 没有可用的代码覆盖率数据。代码覆盖率目前仅在 Windows 上受支持。。
若要在 .NET Core 支持的任何平台上收集代码覆盖率,请安装 Coverlet 并使用 --collect:“XPlat Code Coverage” 选项。
第一小节给出的例子中已经安装了Coverlet包支持。
因此我们可以执行下列命令,产生Coverage.cobertura.xml
dotnet test --collect:"XPlat Code Coverage"
正在启动测试执行,请稍候…
总共 1 个测试文件与指定模式相匹配。
附件:
/root/dotnet/TestResults/93b42aca-c0e7-4e39-9253-c176506b3be0/coverage.cobertura.xml
已通过! - 失败: 0,通过: 1,已跳过: 0,总计: 1,持续时间: < 1 ms
产生的结果存放在 TestResults文件夹的随机产生的GUID文件夹内。
此处应该是 dotnet-cli
的限制,收集的结果并不能指定为确切的文件夹,因此不要费劲巴拉的找参数了。
注意
: 如果需要集成到自动化工具内,需要考虑怎么从这个随机的文件夹把文件拷贝出来,一种方式是利用shell的find/grep等命令搜索命令输出的文本,找到完整的输出路径。
有了这个xml文件以及ReportGenerator工具,我们就可以产生测试覆盖率和圈复杂度的报告了。
reportgenerator -reports:coverage.cobertura.xml -targetdir:report
命令执行后产生一堆的html、css、js文件,看到这么多文件不要慌,让我们找到index.html
,打开它就可以了。
酷炫的报告就这么赤果果的呈现在你的面前。
3.测试结果报告(Test Result)
测试结果报告说容易也容易,说复杂,那就非常的复杂了。
为什么这么说呢?
主要是因为dotnet-cli已经自带了报告结果的输出。
例如,下面命令(在项目目录下),就输出了简单的统计结果:
dotnet test
Starting test execution, please wait…
A total of 1 test files matched the specified pattern.
Passed! - Failed: 0, Passed: 3, Skipped: 0, Total: 3, Duration: 3 ms - MyXunitTest.dll (net5.0)
是的,如果这样就够了,那么就非常简单,是不是?
当然如果你还想要稍微详细点的输出,也是支持的,我们利用console来收集信息,命令如下:
dotnet test -l "console;verbosity=detailed"
输出内容如下:
Starting test execution, please wait…
A total of 1 test files matched the specified pattern.
D:\github\xunit-xml2html\MyXunitTest\bin\Debug\net5.0\MyXunitTest.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.4.3+1b45f5407b (64-bit .NET 5.0.11)
[xUnit.net 00:00:00.24] Discovering: MyXunitTest
[xUnit.net 00:00:00.27] Discovered: MyXunitTest
[xUnit.net 00:00:00.27] Starting: MyXunitTest
[xUnit.net 00:00:00.32] Finished: MyXunitTest
Passed MyXunitTest.UnitTest1.Test2 [1 ms]
Passed MyXunitTest.UnitTest1.Test1 [< 1 ms]
Passed MyXunitTest.UnitTest1.Test3 [< 1 ms]
Test Run Successful.
Total tests: 3
Passed: 3
Total time: 1.1061 Seconds
嗯,到此为止,仍然是利用dotnet-cli就可以完成的,那如果非要一个html的报告,那么问题就来了。
3.1 TRX格式的价值
TRX测试结果,估计只有微软能看懂吧,因此输出的结果可以通过VisualStudio打开。
嗯,是的,可以分享给有VS安装的同事了。
命令:
dotnet test --logger trx
这个结果文件有一点值得称赞,它不需要企业版的VS。
GitHub网络上还有很多Trx转到html的工具,由于年老失修,都是残废之身了。
例如 TrxerConsole 和 trx2html,如果有喜欢折腾的朋友,可以下来瞧瞧, trx2html 还是可以生成半截html的,界面也很美观,只可惜兼容性已经非常差了,如果有达人维护下,应该仍是个好工具。
其他还有一些非主流,几乎都是无用的。
3.2 输出到xml文件
既然TRX的路已经是断头路了,那么我们只有重回xml这条大路上。
关键的一刻来了。
这里需要引入一个包 XunitXml.TestLogger
,可以去github地址。
它支持NUnit和Junit,是非常好的xml生成工具。
Xunit logger 产生的xml是xunit v2 format .
命令如下:
dotnet test --logger:"xunit;LogFilePath=result.xml"
输出的路径是指哪打哪。
由xml生成到html不是一个难事了,你可以自己写个转换工具。
当然了,这里有个现成的转换工具: xunit-xml2html。
利用工具,可以方便的把xml生成为html了。
嗯嗯,大功告成,一切都已经搞定了。
3.3 .net core 测试web时缺少 deps.json文件
有时候,项目会提示 threw exception: System.InvalidOperationException: Can’t find’[path removed]\TestRepro.Tests\bin\Debug\TestRepro.deps.json’.
这时候可能是缺少引用这个包导致的,这个错误很隐晦,CI的时候出现率极高。
Microsoft.AspNetCore.Mvc.Testing
4. 小结
.net core 测试的报告节讲完了,你应该可以拿给领导一份满意的答卷了吧?
👓都看到这了,还在乎点个赞吗?
👓都点赞了,还在乎一个收藏吗?
👓都收藏了,还在乎一个评论吗?