这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
掘金字节内部课:Go 语言进阶与依赖管理, Go 语言工程实践之测试
一、本堂课重点内容:
- 语言进阶
- 依赖管理
- 测试
- 项目实战
二、详细知识点介绍:
- 本堂课介绍了哪些知识点?
1. 语言进阶:并发vs并行
Goroutine, Channel, Sync
1.1 协程(Goroutine)
- 协程:用户态,轻量级线程,栈KB级别。(go语言中调用函数前加
go关键字) - 线程:内核态,线程可跑多个协程(并发),栈MB级别。
1.2 协程间通信 CSP(Communicating Seqential Processes)
协程之间的通信:提倡通过通信共享内存而不是通过共享内存实现通信。
1.3 Channel 1.4 并发安全Lock 1.5 WaitGroup
这里推荐李文周的博客更详细,《Go语言基础之并发》
2. 依赖管理
Go 依赖管理演进, Go Module依赖管理方案
2.1 Go依赖管理演进:GOPATH->Go Vendor->GoModule
2.2 依赖管理三要素:
- 配置文件,描述以来——
go.mod - 中心仓库管理依赖库——
Proxy - 本地工具——
go get/mod
3. 测试
单元测试, Mock测试, 基准测试
3.1 单元测试
3.1.1 单元测试-规则
- 所有测试文件以
_test.go结尾 func TestXxx(*testing.T)- 初始化逻辑放到
TestMain中
3.1.5 单元测试-覆盖率 Tips:
- 一般覆盖率:50%~60%,较高覆盖率80%+
- 测试分支相互独立、全面覆盖
- 测试单元粒度足够小,函数单一职责
3.2 单元测试-依赖
外部依赖 => 稳定(单元测试隔离:任何时间任何函数独立运行)&幂等(重复运行case结果相同)
3.3 单元测试-文件处理
3.4 单元测试-Mock
eg.常用的测试包monkey : github.com/bouk/monkey
快速Mock函数
- 为一个函数打桩
- 为一个方法打桩
对ReadFirstLine(举例的函数)打桩测试,不再依赖本地文件
3.5 基准测试
- 优化代码,需要对当前代码分析
- 内置的测试框架提供了基准测试的能力
(使用方法类似于单元测试),命名:func BenchmarkXxx(*testing.B)
3.5.2 基准测试-运行
并发中存在随机操作可能为了安全会持有全局锁,多协程压力测试下会劣化。
3.5.3 基准测试-优化
开源的fastrand函数:github.com/bytedance/g…
4. 项目实践
需求设计(项目拆解), 代码设计, 测试运行
4.1 需求描述
4.2 需求用例
4.3 ER图-Entity Relationship Diagram
4.4 分层结构
4.5 组件工具
- √Gin高性能 go web 框架 github.com/gin-gonic/g…
- √Go Mod
go mod init
go get gopkg.in/gin-gonic/gin.v1@v1.3.0
后续:
接下来的内容为实际示例项目,需求模型来源:forum.juejin.cn/youthcamp/p… ,项目查看github.com/Moonlight-Z… 另有部分内容
三、实践练习例子:
四、课后个人总结:
暂无
五、引用参考:
无