C#单元测试相关的开源软件中,NUnit及XUnit星级排名靠前,MsTest是微软公司开发的集成在Visual Studio中的C#单元测试工具。
既然微软文档中将XUnit列在第一个,那就用他吧,别在选择上过于纠结。
为代码编写测试会自然地解耦代码,因为采用其他方法测试会更困难。
需要了解的大概包括:
1、单元测试语法
2、运行测试的多种方式(vs软件,命令行)
3、选择性运行单元测试
4、统计覆盖率
5、对已发布的输出进行单元测试
优美的单元测试犹如以下诗句:
轻轻的他走了, 正如他轻轻的来; 他轻轻的招手, 不留下一丝足迹。
单元测试测试什么:
开发人员控件内的代码
单元测试不测试什么:
与数据库、文件系统和网络资源的交互
附上参考资料:
https://chsakell.com/2015/05/10/asp-net-web-api-unit-testing/ 翻译后 https://blog.51cto.com/lybing/1856224
https://learn.microsoft.com/zh-cn/dotnet/core/testing/unit-testing-with-nunit
https://www.cnblogs.com/leoninew/p/practice-for-unit-test.html
单元测试的常见误解
- 单元测试浪费了太多的时间
- 虽然不进行单元测试可以更快的交付到后续测试阶段,但是在后续集成测试阶段、系统测试阶段会发现更多的缺陷甚至软件无法运行的致命缺陷,这些缺陷修复的时间远超过单元测试的时间。另外没有单元测试的代码后期软件进行重构或者改进时花费的时间也比有单元测试的所花费的时间要多很多。所以说完整计划下的单元测试是对时间的更高效的利用。
- 已经有接口集成测试、系统功能测试进行质量保证了,集成测试阶段对接口进行全面测试就可以达到单元测试的要求,没必要做重复工作在进行单元测试。
- 接口测试和功能测试无法覆盖所有的代码,这样如果缺陷存在则将被遗漏,并且Bug将被带到生产上去。一旦用户使用过程中触发了这些没有测试的代码就会带来严重的经济后果。
- 跑通一个业务主流程等价于做过单元测试
- 目前有很多开发人员认为,开发完代码之后,写个main方法,从入口调完所有的模块,最后验证下返回结果,就认为做过单元测试了,这种想法是及其错误的,这充其量算一种不全面的冒烟测试,是对单元测试概念的错误认知。
用例设计指导
- 1.必须遵守 AIR 原则
- 【说明】单元测试在线上运行时,感觉像空气(AIR)一样并不存在,但在测试质量的保障上,却是非常关键的。好的单元测试宏观上来说,具有自动化、独立性、可重复执行的特点。 A:Automatic(自动化) I:Independent(独立性) R:Repeatable(可重复)
- 2.单元测试应该是全自动执行的,并且非交互式的
- 【说明】测试框架通常是定期执行的,执行过程必须完全自动化才有意义。输出结果需要人工检查的测试不是一个好的单元测试。单元测试中不准使用 System.out 来进行人肉验证,必须使用 assert 来验证。
- 3.保持单元测试的独立性
- 【说明】为了保证单元测试稳定可靠且便于维护,单元测试用例之间决不能互相调用,也不能依赖执行的先后次序。反例:method2 需要依赖 method1 的执行,将执行结果做为 method2 的输入
- 4.单元测试是可以重复执行的,不能受到外界环境的影响
- 【说明】单元测试通常会被放到持续集成中,每次有代码 check in时单元测试都会被执行。如果单测对外部环境(网络、服务、中间件等)有依赖,容易导致持续集成机制的不可用。
- 5.对于单元测试,要保证测试粒度足够小,有助于精确定位问题。单测粒度至多是类级别,一般是方法级别
- 【说明】只有测试粒度小才能在出错时尽快定位到出错位置。单测不负责检查跨类或者跨系统的交互逻辑,那是集成测试的领域
- 6.核心业务、核心应用、核心模块的增量代码确保单元测试通过
- 【说明】新增代码及时补充单元测试,如果新增代码影响了原有单元测试,请及时修正
- 7.单元测试代码必须独立项目:不允许写在业务代码目录下
- 【说明】源码构建时会跳过此目录,而单元测试框架默认是扫描此目录