上手go语言之测试 | 青训营笔记

69 阅读2分钟

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

课上内容摘要:

测试

测试是避免事故的最后一道屏障

  • 回归测试 :手动通过终端回归一些固定场景(如手动发评论)
  • 集成测试 :从功能维度做验证,比如对服务暴露的某个接口做自动化的集成测试
  • 单元测试 :测试开发阶段,开发者对单独的函数、模块做验证。

从上到下,测试覆盖率逐渐变大,成本逐渐降低,单元测试覆盖率一定程度上决定着代码的质量。

单元测试:向测试单元输入并运行,将实际输出与期望的输出做校对。单元测试的覆盖率是 为基本单位进行计算的。

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

通过Mock移除强依赖

单元测试的需要满足两个条件:幂等、稳定(相互隔离)。可以使用Mock来保证。为函数、方法打桩(编写一个函数替换原来的函数的输出,)。比如使用开源的Monkey。他的原理是,在运行时,使用go的unsafe包,在运行时替换了函数的地址。 image-20230116141221445

go内置的基准测试框架

对热点代码,常常需要测试性能,我们就借助基准测试。

我们编写的函数需要以BenchMark开头

demo实战

需求如下

  • 展示话题(标题,文字描述) 和回帖列表
  • 暂不考虑前端页面实现,仅仅实现一个本地web服务
  • 话题和回帖数据用文件存储

需求分析:

两个实体,Topic话题和Post帖子。 考虑常见的分层设计。

  • 数据层:关注底层的数据模型,对外提供统一的CRUD接口,屏蔽下游数据来源的差异,比如本地文件、微服务、外部服务。
  • 逻辑层:关心核心的业务逻辑,接受数据层的数据并做一些封装。
  • 视图层:对上游负责,包装数据(比如序列化),提供API接口。

课后实践

  • 支持发布帖子
  • 本地id生成需要保证不重复
  • 注意并发安全问题

挖坑:下篇帖子记录用gin+redis+gorm完成本需求。本篇先到此为止吧。