这是我参与「第五届青训营」伴学笔记创作活动的第3天
测试类型
从上至下,覆盖率逐层变大,成本逐层减小
单元测试
测试单元可以是一个函数,一个模块等等,通过校对期望值和得到的输出,就可以保证代码质量(新代码不会破坏旧代码的正常运行),提升debug效率
GO的单元测试
规则
- 测试文件以_test.go结尾
- 测试函数为func TestXxx(t *testing.T){}
- 初始化逻辑写在TestMain中
覆盖率
函数中有if-else分支,run一次测试不会执行所有代码,覆盖率就是测试中运行的代码在总代码中的占比。 针对对函数中的分支写输入和测试函数,可以提高覆盖率
tips
- 一般覆盖率在50% ~ 60%,较高覆盖率在80%
- 测试分支相互独立、全面覆盖
- 测试单元粒度够小,函数单一职责
Mock
作用
- 支持io类型的测试,如:数据库、网络API请求、文件访问
- 为未开发服务的模拟、服务压力测试支持、对未知复杂的服务进行模拟
适合mock的场景
- IO类型的,本地文件,数据库,网络API,RPC等
- 依赖的服务还没有开发好,这时候我们自己可以模拟一个服务,加快开发进度提升开发效率
- 压力性能测试的时候屏蔽外部依赖,专注测试本模块
- 依赖的内部函数非常复杂,要构造数据非常不方便,这也是一种
基准测试
除了mock,go还提供基准测试,可以分析代码的性能
注意: 在并发场景下,测试的性能会劣化,因为要测试的函数中若使用reand函数,而为了保证全局随机性和并发安全,会用一把全局锁,这就会降低并发性能。为了解决随机函数的性能问题,可以使用FastRand函数,github地址github.com/bytedance/g…