Go 语言进阶 2 | 青训营笔记

72 阅读5分钟

Go 语言进阶

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

3 测试

测试关系系统的质量,质量则决定线上系统的稳定性,一但出现bug漏洞,就会造成事故。

  1. 营销配置错误,导致非预期用户享受权益,资金损失10w+
  2. 用户提现,幂等失效,短时间可以多次提现,资金损失20w+
  3. 代码逻辑错误,广告位被占,无法出广告,收入损失500w+
  4. 代码指针使用错误,导致APP不可用,损失kw+

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

image.png

测试一般分为,回归测试-般是QA同学手 动通过终端回归一些固定的主流程场景,集成测试是对系统功能维度做测试验证,而单元测试测试开发阶段,开发者对单独的函数、模块做功能验证,层级从上至下,测试成本逐渐减低,而测试覆盖率确逐步上升,所以单元测试的覆盖率一-定程度上决定这代码的质量。

image.png

3.1 单元测试

单元测试主要包括,输入,测试单元,输出,以及校对,单元的概念比较广,包括接口,函数,模块等;用最后的校对来保证代码的功能与我们的预期相符;单侧一方面可以保证质量,在整体覆盖率足够的情况下,一定程度上既保证了新功能本身的正确性,又未破坏原有代码的正确性。另一方面可以提升效率,在代码有bug的情况下,通过编写单测,可以在一个较短周期内定位和修复问题。

image.png

3.2 单元测试 - 依赖

工程中复杂的项目,我们的单测需要保证稳定性和幂等性,稳定是指相互隔离,能在任何时间,任何环境,运行测试。幂等是指每一次测试运行都应该产生与 之前一样的结果。而要实现这一目的就要用到 mock 机制。

image.png

3.3 单元测试 - Mock

这里我们用了 Monkey, monkey 是一个开源的 mock 测试库, 可以对method,或者实例的方法进行 mock,反射,指针赋值 Mockey Patch 的作用域在 Runtime,在运行时通过通过 Go 的 unsafe 包,能够将内存中函数的地址替换为运行时函数的地址。将待打桩函数或方法的实现跳转到。 image.png

3.4 基准测试

Go 语言还提供了基准测试框架,基准测试是指测试一段程序的运行性能及耗费 CPU 的程度。而我们在实际项目开发中,经常会遇到代码性能瓶颈,为了定位问题经常要对代码做性能分析,这就用到了基准测试。使用方法类似于单元测试,

image.png

4 项目实践

4.1 需求描述

社区话题页面

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

4.2 ER 图

下面是个 ER 图,用来描述现实世界的概念模型。有了模型实体,属性以及之间的联系,对我们后续做开发就提供了比较清晰的思路。回到需求。两个个实体主要包括,实体的属性,实体的联系;有了实体模型,下一步就是思考代码结构设计。我们采用典型的分层结构设计。

image.png

4.3 分层结构

整体分为三层,repository 数据层, service 逻辑层, controller 视图层, 数据层关联底层数据模型,也就是这里的model,封装外部数据的增删改查,我们的数据存储在本地文件,通过文件操作拉取话题,帖子数据;数据层面向逻辑层,对 service 层透明, 屏蔽下游数据差异,也就是不管下游是文件,还是数据库,还是微服务等,对 service 层的接口模型是不变的。

Servcie 逻辑层处理核心业务逻辑,计算打包业务实体 entiy,对应我们的需求,就是话题页面,包括话题和回帖列表,并上送给视图层;

Controller 视图层负责处理和外部的交互逻辑,以 view 视图的形式返回给客户端,对于我们需求,我们封装 json 格式化的请求结果,api 形式访问就好。

image.png

4.4 组件工具

下面介绍下开发涉及的基础组件和工具,首先是 gin, 高性能开源的 go web框架,我们基于 gin 搭建 web 服务器,在课程手册应该提到了,这里我们只是简单的使用,主要涉及路由分发,不会涉及其他复杂的概念。

因为我们引入了web框架,所以就涉及go module依赖管理,如前面依赖管理课程内容讲解,我们首先通过go mod是初始化go mod管理配置文件,然后go get下载gin依赖,这里显示用了V1.3.0版本。有了框架依赖,我们只需要关注业务本身的实现,从reposity-service-controller,我们一步步实现。

4.5 小结

好的,以上就是对社区话题页面需求的整个实现流程,这样我们从项目拆解,代码设计落地,最后测试运行就跑通了整个的项目流程,为大家后期实现项目提供了一定的开发思路。当然实际项目较我们实现的需求会复杂很多,不过大家也不必担心,可以通过大拆小的思路,将大需求拆解为小需求的思路来分析解决,遇到问题,各个击破,同时做好充分的测试。

image.png