什么是单元测试
单元测试是代码层面的测试,由研发自己来编写,用于测试“自己”编写的代码逻辑的正确性。
单元测试主要测试范围:
- 类
- 函数
单元测试有别于集成测试。
集成测试主要测试范围:
- 模块
- 系统
- 功能块
tip: 单元测试是粒度小的测试。考验程序员思维的缜密程度。
为什么要写单元测试
- 单元测试能有效地帮你发现代码中的BUG
- 写代码的最高境界就是 bug free 的状态。
- 避免低级 bug 的出现。
- 保证每一行代码运行良好,逻辑正确。
- 写单元测试能帮你发现代码设计上的问题
- 如果我很难为其编写单元测试,或者单元测试写起来很吃力,那往往就意味着代码设计得不够合理。
- 如没有使用依赖注入,大量使用静态函数,全局变量,代码调试耦合等情况。
- 单元测试是对集成测试的有力补充
- 集成测试无法覆盖得很全面,复杂系统往往很多模块。需要单元测试加持。
- 如果我们能保证每个类,每个函数能按照我们的预期来执行,底层bug少了。组装起来的整个系统,bug也相应减少。
- 写单元测试的过程本身就是代码重构的过程
- 单元测试实际上就是落地执行持续重构的一个有效途径。
- 编写单元测试就相当于对代码的一次自我Code Review。
- 阅读单元测试能帮助你快速熟悉代码
- 单元测试用例就是用户用例,反映了代码的功能和如何使用。
- 单元测试是TDD可落地执行的改进方案
- 单元测试正好是对TDD测试驱动开发的一种改进方案。
如何编写单元测试
每个语言都有不同的写法。如 Golang 只需要以下划线加 test 命名,函数以 Test 开头就是单元测试。
func TestFunc(t *testing.T) {
// todo
}
还可以使用第三方提供的单元测试框架。如 GoConvey 。
- 写单元测试真的是件很耗时的事情。单元测试代码量一般是被测代码本身的1~2倍
- 单元测试不会在生产上运行,而且每个类的测试代码比较独立,基本不互相依赖。
- 单元测试覆盖率做到 60 ~ 70% 之间算合格。GoConvey 也有提供覆盖率的报告。
- 单元测试不依赖被测试函数的具体实现逻辑,它只关心被测函数实现了什么功能。
tip: 对于函数写不写单元测试,工程师要有足够的主人翁意识(ownership)。 也是拉开与其它人差距的“杀手锏“。
测试不友好的代码
- 代码中包含未决行为逻辑
- 滥用可变全局变量
- 滥用静态方法
- 使用复杂的继承关系
- 高度耦合的代码
关于我
我的博客:https://yezihack.github.io
欢迎关注我的微信公众号【空树之空】,共同学习,一起进步~