Day 3 Go 语言工程实践之测试
一、测试
测试:避免事故的一道屏障
回归测试:终端回归主流场景
集成测试:系统功能测试验证
单元测试:开发模块功能验证
1.1 单元测试:期望与输出的校对
保证质量(新功能的正常运行)、提升效率(定位纠错)
1.1.1 单元测试-覆盖率:保证测试的完备性
go test xxxxx --cover
一般覆盖率:50% - 60% (保证主流程)
较高的覆盖率:80%
测试要求:测试分支相互独立、全面覆盖
开发要求:单元粒度足够小、函数单一职责
1.1.2 单元测试-依赖
幂等:重复运行结果是相同的
稳定:单元测试相互隔离、独立运行
1.1.3 单元测试-Mock
monkey: github.com/bouk/monkey
为一个函数(或方法)打桩,测试时调用打桩函数,不再依赖本地文件
1.1.4 基准测试(类似单元测试)
rand函数保证全局随机性和并发安全有意降低了全局速度和并发性能
fastrand函数 牺牲了随机数列的移植性,运行速度较快(建议)
二、项目实践
2.1 需求描述:社区话题页面
2.2 需求用例:浏览消费用户(实体:话题 + 帖子)
2.3 ER图:概念模型(实体+属性+相互关系)
2.4 分层结构:
数据层:数据model
逻辑层:业务entity
视图层:视图view
2.5 组件工具:Gin / Go Mod
2.6 Repository-index
数据行 映射成 内存map
2.7 Service:
代码流程编排:通过err控制流程的退出,对ID进行严格的校验
func (f *QueryPageInfoFlow) Do() (*PageInfo, error) {
if err := f.checkParam(); err != nil {
return nil, err
}
if err := f.prepareInfo(); err != nil {
return nil, err
}
if err := f.packPageInfo(); err != nil {
return nil, err
}
return f.pageInfo, nil
}
可用性:通过topic ID获取话题信息和回帖信息(并行执行)
wg.Add(delta: 2)
//获取topic信息
var wg sync.WaitGroup
wg.Add(2)
var topicErr, postErr error
go func() {...
}()
//获取post列表
go func() {...
}()
wg.Wait()
2.8 Controller:
1、构建View对象(PageData)
2、string类型转换成int
3、service层对pagedata进行打包
2.9 Router
1、初始化数据索引(生成map索引)
2、初始化引擎配置(gin.default)
3、构建路由
4、启动服务
感悟:说实话,从最开始啥也不懂的时候,我就觉得单元测试这玩意没啥用,毕竟光是把需求搞定后,还要花时间在写测试上,想想就觉得难受。但是试想一下,如果你一口气就写完上千行代码,debug 的过程也不会很轻松。这个时候写好测试就显得尤为重要了,对于一些逻辑较为复杂的函数,同时添加一些测试用例,即时确保准确度