GO工程实践之测试 | 青训营

65 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第3天

测试类型

从上至下,覆盖率逐层变大,成本逐层减小 image.png

单元测试

image.png 测试单元可以是一个函数,一个模块等等,通过校对期望值和得到的输出,就可以保证代码质量(新代码不会破坏旧代码的正常运行),提升debug效率

GO的单元测试

规则

  • 测试文件以_test.go结尾
  • 测试函数为func TestXxx(t *testing.T){}
  • 初始化逻辑写在TestMain中

image.png

覆盖率

函数中有if-else分支,run一次测试不会执行所有代码,覆盖率就是测试中运行的代码在总代码中的占比。 针对对函数中的分支写输入和测试函数,可以提高覆盖率

tips

  • 一般覆盖率在50% ~ 60%,较高覆盖率在80%
  • 测试分支相互独立、全面覆盖
  • 测试单元粒度够小,函数单一职责

Mock

作用

  • 支持io类型的测试,如:数据库、网络API请求、文件访问
  • 为未开发服务的模拟、服务压力测试支持、对未知复杂的服务进行模拟

适合mock的场景

  1. IO类型的,本地文件,数据库,网络API,RPC等
  2. 依赖的服务还没有开发好,这时候我们自己可以模拟一个服务,加快开发进度提升开发效率
  3. 压力性能测试的时候屏蔽外部依赖,专注测试本模块
  4. 依赖的内部函数非常复杂,要构造数据非常不方便,这也是一种

基准测试

除了mock,go还提供基准测试,可以分析代码的性能

注意: 在并发场景下,测试的性能会劣化,因为要测试的函数中若使用reand函数,而为了保证全局随机性和并发安全,会用一把全局锁,这就会降低并发性能。为了解决随机函数的性能问题,可以使用FastRand函数,github地址github.com/bytedance/g…

参考

# golang单元测试之mock