Go语言工程实践之测试 | 青训营笔记
测试类型
包括回归测试、集成测试和单元测试,三者的关系是从上到下,覆盖率增大,测试成本较小。
单元测试
单元测试指对软件中的最小可测试单元进行检查和验证。至于“单元”的大小或范围,并没有一个明确的标准,“单元”可以是一个函数、方法、类、功能模块或者子系统。
命名规则
- 测试文件命名规则:以_test.go结尾
- 测试函数命名规则:func TestXxx(* testing.T)
- 初始化逻辑放到TestMain中
覆盖率的一些小tips
- 一般覆盖率:50~60%,较高的80%
- 测试分支相互独立,全面覆盖(划分)
- 测试单元单元粒度足够小,设计时尽量使函数单一指责。
【补充内容】
分类
单元测试可以分为了两种:
- 对于无第三方依赖的纯逻辑代码,我们只需要验证相关逻辑即可,只需要使用
assert(断言) ,通过控制输入输出比对结果即可。 - 对于有第三方依赖的代码,在验证相关代码逻辑之前,需要将相关的依赖
mock(模拟) ,之后才能通过断言验证逻辑。
桩代码在单测中是如何执行的
对于函数以及方法的 mock,由于本身代码逻辑已经声明好(go 是静态强类型语言),我们很难通过编码的方式将其 mock 掉,这对我们做单元测试提供了很大的挑战。实际上 gomonkey 提供了让我们在运行时替换原函数/方法的能力。虽然说我们在语言层面很难去替换运行中的函数体,但是本身代码最终都会转换成机器可以理解的汇编指令,我们可以通过创建指令来改写函数。
monkey
monkey是一个mock的包,可以为一个函数、方法打桩,所谓的“桩”,也叫做“桩代码”,是指用来代替关联代码或者未实现代码的代码。 大概就是用一个函数替换另一个函数。
基准测试
基准测试测试一个程序运行性能和cpu的损耗,测试代码的瓶颈问题。
需求设计
需求描述
- 展示话题(标题和文字描述)和回贴列表
- 暂不考虑前端页面实现,今实现本地web服务
- 话题和回贴数据用文件存储
用户分析
设计用户的视图。
ER图
设计模型时可以使用ER图,描述实体关系和属性,ER图可以帮助我们在实现时思路更清晰。
通用的分层结构
对架构进行分层可以提高模型的可读性,方便后期维护。