手把手带你写一个 Web 框架
叶剑峰
腾讯高级工程师,前滴滴技术专家
23524 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
特别放送 (1讲)
手把手带你写一个 Web 框架
15
15
1.0x
00:00/00:00
登录|注册

写好单元测试,让你的 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
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部