[ Go 语言工程实践之测试 | 青训营笔记 ]

91 阅读2分钟

Day 3 Go 语言工程实践之测试

一、测试

测试:避免事故的一道屏障

回归测试:终端回归主流场景
集成测试:系统功能测试验证
单元测试:开发模块功能验证 image.png

1.1 单元测试:期望与输出的校对

保证质量(新功能的正常运行)、提升效率(定位纠错) image.png

1.1.1 单元测试-覆盖率:保证测试的完备性

go test xxxxx --cover image.png image.png 一般覆盖率:50% - 60% (保证主流程)
较高的覆盖率:80%
测试要求:测试分支相互独立、全面覆盖
开发要求:单元粒度足够小、函数单一职责

1.1.2 单元测试-依赖

image.png 幂等:重复运行结果是相同的
稳定:单元测试相互隔离、独立运行

1.1.3 单元测试-Mock

monkey: github.com/bouk/monkey
为一个函数(或方法)打桩,测试时调用打桩函数,不再依赖本地文件 image.png

1.1.4 基准测试(类似单元测试)

rand函数保证全局随机性和并发安全有意降低了全局速度和并发性能 image.png
image.png fastrand函数 牺牲了随机数列的移植性,运行速度较快(建议image.png
image.png

二、项目实践

2.1 需求描述:社区话题页面

2.2 需求用例:浏览消费用户(实体:话题 + 帖子)

2.3 ER图:概念模型(实体+属性+相互关系)

image.png

2.4 分层结构:

数据层:数据model
逻辑层:业务entity
视图层:视图view image.png

2.5 组件工具:Gin / Go Mod

image.png

2.6 Repository-index

数据行 映射成 内存map image.png

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 的过程也不会很轻松。这个时候写好测试就显得尤为重要了,对于一些逻辑较为复杂的函数,同时添加一些测试用例,即时确保准确度