go语言工程进阶 | 青训营笔记

106 阅读2分钟

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

质量就是生命

1. 测试分类

image.png

从上到下,覆盖率逐层变大,成本逐层降低

2.单元测试

成大事者,不拘小节,bug就要从小修起

image.png

(1)规则

✨ 所有测试文件以 _test.go 结尾

✨ func TestXxx(*testing.T)

func TestMain(m *testing.M) {
//测试前: 数据装载、配置初始化等前置工作
code := m.Run(0
//测试后: 释放资源等收尾工作
os.Exit(code)
}

✨ 初始化逻辑放到 TestMain 中

(2)开源测试包 assert

✨ assert.Equal(t,期望输出,实际输出)

(3)覆盖率

✨ 测试数据 经过测试函数的代码行数 占总代码行数 的比例

✨ 一般覆盖率:50%-60%,较高覆盖率80%+

✨ 测试分支相互独立、全面覆盖

✨ 测试单元粒度足够小,函数单一职责

(4)依赖

image.png

2. Mock

✨ 开源Mock包:monkey

✨ 用函数a 替换函数b ,a是打桩函数,b是原函数

3. 基准测试

✨ 优化代码,需要对当前代码分析

✨ 内置的测试框架提供了基准测试的能力

4. 项目实战

(1) 需求:社区话题页面

✨ 展示画图(标题,文字描述)和回帖列表

✨ 暂不考虑前端页面实现,仅仅实现一个本地web服务

✨ 话题和回帖数据用文件存储

(2) 定义结构体

image.png

(3) 分层结构经典的三层结构

✨ 数据层 Model:外部数据的增删改查 (DAO)

✨ 逻辑层 Entiy:业务层,处理核心业务逻辑输出 (Service)

✨ 视图层 View:处理和外部的交互逻辑 (Controller)

image.png

(4) 组件工具

✨ Gin 高性能 go web 框架 地址

✨ Go Mod

🌹 go mod init

🌹 go get gopkg.in/gin-gonic/gin.v1@v1.3.0

(5)Reposity(仓库)(DAO层)

✨ QueryTopicById:通过id查询话题

✨ QueryPostsByParentId:通过id查询所有帖子

(6) Repository-index(书的目录)

image.png

✨ 定义索引

var(
    topicIndexMap map[int64]*Topic
    postIndexMap map[int64][]*Post
)

✨ 初始化索引

(7)Service

✨ 定义实体

✨ 流程

🌹 参数校验

🌹 准备数据

🌹 组转实体

(8) Controller

✨ 构建 View 对象

✨ 业务错误码

(9) Router

✨ 初始化数据索引

✨ 初始化引擎配置

✨ 构建路由

✨ 启动服务