这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
对课程中学到的重要知识点做了笔记,方便后续的回顾
1. 并发编程
2. 依赖管理
2.1 背景
管理依赖库
2.2 Go 依赖管理演进
主要要解决的问题: 不同环境(项目)依赖的版本不同 控制依赖库的版本
2.2.1 GOPATH
- 环境变量 $GOPATH
- 项目的文件关系,需要放成以下的形式
- bin——项目编译的二进制文件
- pkg——项目编译的中间产物,加速编译
- src——项目源码
- 项目代码直接依赖src下的代码
- go get下载最新版本的包到src目录下
弊端: 无法实现package的多版本控制
2.2.2 Go Vendor
go model vendor
- 项目目录下增加了vendor文件,所有依赖以副本形式存放在 $ProjectRoot/vendor
- 依赖寻址方式:vendor=>GOPATH
- 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。
弊端:
- 无法控制依赖的版本。
- 更新项目又可能出现依赖冲突,导致编译出
原因: 依赖项目的源码,没法标识版本的这一个概念
2.2.3 Go Module
通过go.mod文件管理依赖包版本 通过go get/go mod指令工具管理依赖包 终极目标:定义版本规则和管理项目依赖关系 go 1.11初始引入 go 1.16默认开启
go mod init # 初始化go.mod
go mod tidy # 更新go.mod文件
依赖管理三要素 1.配置文件,描述依赖——go.mod 2.中心仓库管理依赖库——Proxy 3.本地工具——go get/ mod
2.3 Go Module实践
3. 单元测试
- 测试的重要性:测试是避免事故的最后一道屏障
- 测试所处的位置: 避免 开发------>测试----->事故
- 测试的分类: 回归测试 集成测试 单元测试 从上到下,覆盖率逐层变大,成本却逐层降低
3.1 单元测试
- 单元测试流程
- go中的单元测试
- 所有测试文件以_test.go 结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中
- go test HelloWorld_test.go
- go test [flags] [packages]
- 可以使用开源的包来检测返回是否正常,比如assert
- assert.Equal
- 如何评估单元测试
- 如何衡量代码是否经过了足够的测试?
- 如何评价项目的测试水准?
- 如何评估项目是否达到了高水准测试等级?
- 使用代码覆盖率
- go test HelloWorld_test.go --cover,增加cover就可以显示测试覆盖率
- 小技巧
- 一般覆盖率:50%~60%,较高覆盖率80%+
- 测试分支相互独立、全面覆盖
- 测试单元粒度足够小,函数单一职责。
3.2 Mock测试
- 依赖 --->FIle 单元------->DB ----> 幂等----> Mock --->cache 稳定----> 有时候单元测试会受到外部依赖的限制,比如依赖文件数据库,cache等等,比如网络波动,文件不存在,都会影响测试的效果,所以需要通过mock测试来尽量消除这些影响
- 快速mock函数
- 为一个函数打桩
- 为一个方法打桩
- 比如:对读取文件的函数打桩,使得其不依赖本地文件
3.3 基准测试
- 概念
- 优化代码,需要对当前代码分析
- 内置的测试框架提供了基准测试的能力
- 举例
- 对服务器进行负载均衡处理,优化rand随机数分配函数
4. 项目实战
课后个人总结
- 之前只是会用go get来拉取model包,通过课程的学习,对依赖管理的认识更加深刻了
- 了解到了常用的测试方法和测试技术,可以用在后面的大项目中
参考资料
[mock测试]github.com/bouk/monkey