首先我们来看为什么要写单元测试?
- A. 大牛都这么做
- B. 老板要求的
- C. 让项目看起来专业一点
- D. 达到评审规则的覆盖率
- E. 减少bug,提高代码质量,促进代码设计,降低测试成本,提升代码可扩展性
简单来说,无论函数如何实现,单测可以保证我们始终能得到预期的结果。 最近半年我们在提升我们项目的代码单测覆盖率,来提前发现代码中的问题。单元测试可以有效的提前发现问题,也可以很好的实现测试左移。
什么是测试左移呢 ?
说到测试左移,首先来看一下 ,一般系统开发的流程。
在经过一系列的 需求分析、概要设计、详细设计、编码开发、单元测试、集成测试、系统测试之后上线。
在这个过程中编码开发的时候同时写好自动化的单元测试,就是把测试的位置往左移了,就是测试左移。
写单元测试的时候要注意: 测试的对象是对代码中的一个函数、方法,它关注的是代码局部,而不是整个系统。
另外 ,单元测试是要隔绝对数据的依赖的,例如用mock覆盖函数内部的网络IO、db操作等重逻辑。
这里要提一个测试驱动开发,TDD , 现在我们没有采用这种形式,在我们看来,采用TDD开发go项目不是那么顺。
编写测试用例用到的库:
testing:golang自带的轻量级测试框架,可以方便快速的写出table-driven的用例,支持go test命令执行单测。
goconvey:github.com/smartystreets/goconvey,用来组织测试用例,提供了很多断言,兼容go test,有 web ui 。
gomock:github.com/golang/mock,用来给接口打桩的,通过mockgen可以自动生成对应的接口mock代码。
上手:
如何快速的编写测试用例呢 ?
这里就需要介绍一个库: https://github.com/cweill/gotests
为源文件中所有的函数和方法生成test方法: gotests -all -w -i XXX.go ,可以直接用命令行生成 这个文件的所有方法的测试用例,这也是我们没有采用 TDD的开发方式的原因,我们写出大的业务代码框架,之后用gotests来生成测试用例会非常方便,也非常迅速,会大大降低我们因为写测试用例而占用的开发时间。
所以没有采用TDD,先写测试用例,之后写业务代码。
当然也可以在 goland 和 vscode 使用
点击就生成了一个测试用例,而且自动是表格测试的方式,
这样就可以编写了,我前面也写了一篇如何写好测试用例的文章,这里不再赘述:
https://cloud.tencent.com/developer/article/1500525
总结:
坚持在开发过程中写单测是一件困难的事情,它的确会增加我们的开发量。甚至如果代码设计较差,单元测试也会随着每次的代码改动而失效,需要推翻重来。另外,把握好单测的范围、粒度、设计也不是一蹴而就的。
但是写单测也是一件正确的事情。