这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
质量就是生命
1. 测试分类
从上到下,覆盖率逐层变大,成本逐层降低
2.单元测试
成大事者,不拘小节,bug就要从小修起
(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)依赖
2. Mock
✨ 开源Mock包:monkey
✨ 用函数a 替换函数b ,a是打桩函数,b是原函数
3. 基准测试
✨ 优化代码,需要对当前代码分析
✨ 内置的测试框架提供了基准测试的能力
4. 项目实战
(1) 需求:社区话题页面
✨ 展示画图(标题,文字描述)和回帖列表
✨ 暂不考虑前端页面实现,仅仅实现一个本地web服务
✨ 话题和回帖数据用文件存储
(2) 定义结构体
(3) 分层结构经典的三层结构
✨ 数据层 Model:外部数据的增删改查 (DAO)
✨ 逻辑层 Entiy:业务层,处理核心业务逻辑输出 (Service)
✨ 视图层 View:处理和外部的交互逻辑 (Controller)
(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(书的目录)
✨ 定义索引
var(
topicIndexMap map[int64]*Topic
postIndexMap map[int64][]*Post
)
✨ 初始化索引
(7)Service
✨ 定义实体
✨ 流程
🌹 参数校验
🌹 准备数据
🌹 组转实体
(8) Controller
✨ 构建 View 对象
✨ 业务错误码
(9) Router
✨ 初始化数据索引
✨ 初始化引擎配置
✨ 构建路由
✨ 启动服务