Go语言进阶(工程进阶02测试)| 青训营笔记

79 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天。今天主要学习了测试工程初步实践的内容,做一个简单梳理。

测试分为以下方式,从上到下,覆盖率逐层变大,成本却逐层降低。

  1. 回归测试:(直接使用测试)
  2. 集成测试:(自动化对功能)
  3. 单元测试:(开发过程中对函数、模块)

单元测试

输入,测试单元(函数,模块),输出,与期望校对。

保证代码质量,提升效率(短周期定位问题)。

规则

  1. 所有测试文件以_test.go结尾。
  2. 函数命名,func TestXxx(t *testing.T)。
  3. 初始化逻辑放到TestMain中。m.run()跑package下所有单测。初始化,收尾。

例子

t.Errorf()

运行

go test [flag] [package]

assert

可以引用第三方assert包,进行输入输出对比校验

代码覆盖率

go test xxx_test.go xxx.go --cover --cover 可以计算测试的覆盖率,(是计算的测试中经历的代码行数占总行数比例)

Tips

  • 一般覆盖率:50%~60%(保证主流程),较高覆盖率80%+(异常分支)
  • 测试分支相互独立、全面覆盖
  • 测试单元粒度足够小,函数单一职责(够小)

依赖

测试单元依赖File,DB,Cache(强依赖)

幂等(重复进行某一测试,结果是相同的)、稳定(单元测试相互隔离,任何函数,任何时间独立运行)

外部依赖会导致不稳定(文件删除,网络不稳定等),mock机制使之稳定。

mock:以工具monkey为例。快速mock打桩,为一个函数打桩(用B函数,替换原A函数),为一个方法打桩

实现原理:运行时,通过go的unseek包,将内存中函数地址,替换成运行时函数地址

基准测试

类似单元测试,以Benchmark开头,func Benchmarkxxx (b *testing.B)

提到go中,并行中rand函数性能劣化,因为锁。所以用fastrand。

项目实践

(Go 语言工程实践之测试 - 掘金 (juejin.cn))24:38

分析需求

需求描述->需求用例(实体,实体之间的联系)->ER图(模型)

分层结构

  • 数据层:数据Model,外部数据的增删改查(逻辑层就可以不关心底层的数据存储,只获取数据)
  • 逻辑层:业务Entity,处理核心业务逻辑输出
  • 视图层:视图view,处理与外部的交互逻辑

组件工具

Gin 高性能go web框架。

实践部分后续补充。