文章目录
测试的一个痛点
单元测试,既然称之单元,那就说明是细粒度的测试,例如测试一个函数,而不是整个系统。而测试,顾名思义,就是给函数一个输入,看输出是否符合预期。但是:
输入、输出的分类
输入,不仅包括了函数的参数,还会包含外部依赖,例如读取文件或网络、读取环境变量、全局变量等,我们暂称之隐式输入。输出,不仅包括了函数的返回值,也和输入一样包含了外部依赖,例如文件写入、网络写入等,暂称之隐式输出。
因此,为一个函数编写单元测试,需要考虑这四个问题:
- 显示输入
- 显示输出
- 隐式输入
- 隐式输出
分类后的解决方案
显示的输入、输出都是容易解决的。而对于隐式输入输出,我们要做的就是封装IO然后隔离。
- 隐式输入的隔离:对于这类外部依赖函数,我们关注的是它的返回,因此使用Mock。
- 隐式输出的隔离:对于这类外部依赖函数,我们关注的是它的参数,因此使用Stub。
运用
拿到一个待测试函数,不妨先在纸上将这四项列出来,然后对隐式的输入、输出执行相应的Mock或Stub。当然,这些技巧只是解一时之急,更重要的是代码良好的设计,写出可测的代码。