写好单元测试,让你的 Go 代码固若金汤
叶剑峰

大家好,我是轩脉刃。
在专栏第 34 章,完成问答系统的开发后,我们使用 GoConvey、SQLite 写了一些单元测试,对问答系统进行测试验证。当时,我们主要聚焦于专栏中开发的系统,详细描述了如何开发单测,并且展示了单测的代码。但单元测试是一套完整的方法论,不是如此简单就能描述完备的。
因此在这里,我想和你系统地讨论 Golang 业务中的单元测试,包括它的重要性、设计思路,以及编写单测的方法技巧。
在正常开发过程中,我发现一个很有意思的现象,所有开发同学都会说单元测试有用,但鲜少见到有人在开发过程中编写单元测试。究其原因,大致会是如下几种:
我是来写功能的,不是来写测试的
我写的代码不会出错,用不着单元测试
后面的集成测试会帮我测试出问题的
写单元测试太浪费时间了
我不知道怎么写单元测试
这些问题,我希望能在今天给出完美的解答。
为单元测试“正名”
业务代码对单元测试的接纳,首先必须是思想上的接纳。即思想上必须要想清楚一件事:为什么要有单元测试。
单元测试是将 Bug 控制在编码阶段的唯一手段

图片来自网络
上图出自 Capers Jones 在 1996 年出版的 《Applied Software Measurement》,它是一张经典图表,展示了软件开发生命周期中的缺陷发现和修复成本。这张图在软件工程领域非常有影响力,经常被用来说明“尽早测试、尽早发现问题”的重要性。那接下来,我们就一起来分析这张图上的重要信息。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结

1. 单元测试是在代码编写阶段发现并控制 Bug 的最有效手段,有助于避免后期成本增加。 2. 编写可测试的代码需要遵循一系列最佳实践,如避免全局状态、保持函数输入输出的稳定性、采用依赖注入、以及遵循单一职责原则编写精简的函数。 3. 将代码拆分成小函数,每个函数只做一件事,有助于提高代码的可测试性和测试覆盖率。 4. 使用GoConvey测试框架可以提高测试用例代码的可读性,提供丰富的断言函数,并提供Web界面实时显示测试结果,极大地提高了开发效率。 5. 在编写单元测试时,使用内存类型的SQLite来替换MySQL,可以提高测试速度、简化设置,并使测试具有独立性,不依赖于外部数据库服务。 6. 对于Redis缓存存储的替换库,使用miniredis来模拟Redis服务器,轻松进行各种操作,并在测试结束后关闭它,以实现单元测试。 7. 对于外部RPC服务的测试,建议将RPC服务接口化,使用Mock的方式伪造这些RPC服务的行为,并使用Mock库生成Mock实现,编写测试用例来测试RPC服务的行为。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 Web 框架》,新⼈⾸单¥59
《手把手带你写一个 Web 框架》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论