Go的并发、依赖管理、测试| 青训营笔记

78 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

掘金字节内部课:Go 语言进阶与依赖管理, Go 语言工程实践之测试

一、本堂课重点内容:

  1. 语言进阶
  2. 依赖管理
  3. 测试
  4. 项目实战

二、详细知识点介绍:

  • 本堂课介绍了哪些知识点?

1. 语言进阶:并发vs并行

Goroutine, Channel, Sync

image.png

1.1 协程(Goroutine) image.png

  • 协程:用户态,轻量级线程,栈KB级别。(go语言中调用函数前加go关键字)
  • 线程:内核态,线程可跑多个协程(并发),栈MB级别。

1.2 协程间通信 CSP(Communicating Seqential Processes)

image.png

协程之间的通信:提倡通过通信共享内存而不是通过共享内存实现通信。

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

image.png

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 分层结构

image.png

4.5 组件工具

go mod init
go get gopkg.in/gin-gonic/gin.v1@v1.3.0

后续:

接下来的内容为实际示例项目,需求模型来源:forum.juejin.cn/youthcamp/p… ,项目查看github.com/Moonlight-Z… 另有部分内容

三、实践练习例子:

参考juejin.cn/post/718822…

四、课后个人总结:

暂无

五、引用参考: