本文正参与 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
- 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
- 📢本文作者:由webmote 原创,首发于 【掘金】
- 📢作者格言: 生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起加油!💪💪💪
1. 什么是单元测试
单元测试是对程序设计的最小单元(函数)进行正确性检验的测试工作。
为了保障代码的质量稳定性,一般建议采用单元测试来对代码进行测试,并配合CI/CD进行自动化的工作。
2.什么时候写单元测试
- 如果你要写一个新的功能,
- 如果你要在没有经过测试的代码上写新的功能
- 如果你要Fix一个Bug
- 如果你要Refactor没有测试过的代码
- 如果你发现一个边缘例外值
3.怎么写单元测试
- 检查入参
- 检查出参
- 检查边界值
- 外部依赖状态(打开/关闭/文件指针/文件属性/权限)
- 数据类型、初始值有无、默认值、上溢、下溢
- 异常测试
- 错误信息的可理解性
- 分支、条件、路径
4.怎么写可测试的代码
- 单一职责原则:一个类只负责一项职责
- 开放封闭 : 对扩展开放,对修改关闭
- 接口分离:使用多个隔离的接口,比使用单个接口要好
- 依赖反转:依赖于抽象而不依赖于具体
- 里氏替换:任何基类可以出现的地方,子类一定可以出现
静态类、静态方法很难单元测试 ,一般需要改造为接口类或包装类
5.什么是好的单元测试
- 快速 对成熟项目进行数千次单元测试,很常见。 应花非常少的时间来运行单元测试。 几毫秒。
- 独立 单元测试是独立的,可以单独运行,并且不依赖文件系统或数据库等任何外部因素。
- 可重复 运行单元测试的结果应该保持一致,也就是说,如果在运行期间不更改任何内容,总是返回相同的结果。
- 自检查 测试应该能够在没有任何人工交互的情况下,自动检测测试是否通过。
- 简单及时 与要测试的代码相比,编写单元测试不应花费过多不必要的时间。 如果发现测试代码与编写代码相比需要花费大量的时间,请考虑一种更易测试的设计。
6.哪些不用写单元测试
服务、粘合代码和存储一般都是严格的访问代码(其特征是简单的顺序调用),这些不需要做单元测试。
而恰恰是这些代码,需要和很多的环境相关的上下文打交道来交换数据,所以也很难做单元测试,需要Mock很多接口。
比如存储上下文、缓存上下文、网络上下文,模仿的维护成本也非常高,最终导致不能快速产生单元测试,甚至让整个单元测试的推行失败!
需要单元测试的代码始终聚焦到开发人员自己写的逻辑,而不是依赖环境的正常与否。
因此可以简单得出代码的测试覆盖率不需要达到 100%。
7. CI 构建
像dotnet、java、vue、react等,现在都支持单元测试的集成。
例如dotnet可以利用
dotnet test --collect:"XPlat Code Coverage" 输出测试结果。
配合Azure或 gitlab等,可以方便的输出测试结果。
8. 小结
单元测试重在动手,开始,不需要追求100%代码覆盖率,一旦超过50%,代码的健壮性和可维护性都大大提高。
👓都看到这了,还在乎点个赞吗?
👓都点赞了,还在乎一个收藏吗?
👓都收藏了,还在乎一个评论吗?