协程与测试| 青训营笔记

132 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记

协程

协程:用户态,轻量级线程,栈MB级别

线程:内核态,线程中可以运行多个协程,栈KB级别

协程主要通信方式

通过通信共享内存,类似生产者消费者模型

2022-05-08 19-45-09 的屏幕截图.png

Channel 通道

make(chan 元素类型, [缓冲大小])

无缓冲通道又称为同步通道

适当的缓冲大小可以弥补生产者消费者执行速度不均衡的问题

同步

可使用lock,WaitGroup实现同步。

Go的依赖管理

1. GoPath

结构

  • bin: 项目编译的二进制文件

  • pkg: 项目编译的中间产物,加速编译

  • src: 项目源码

    项目代码直接依赖于src下的源码

    缺陷:无法处理项目代码依赖不同版本的情况

2. GoVendor

项目目录下新增vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor

依赖寻址:有先到vendor下,再到GoPath下

问题:

  • 无法控制依赖版本
  • 更新项目又可能出现依赖冲突,导致编译出错。
  • 本质:仍旧依赖的是源码,无法通过版本分辨

3. Go Module

通过go.mod文件进行版本管理

依赖管理三要素

1. 配置文件,描述依赖    go.mod
1. 中心仓库管理依赖库       Proxy
1. 本地工具                         go get/mod

对于所需要的不同版本的依赖,go会采取最低兼容版本算法。

依赖分发-Proxy

在源站与目标之间加一层代理,代理缓存源站中的依赖

单元测试

1. 规则

所有测试文件以_test.go结尾

函数命名:func Testxx(*testing.T)

初始化逻辑放到TestMain中

2. mock

模仿真实对象行为的模拟对象

mock模拟的不是测试对象而是测试对象的依赖

Why?

  • (1)提高 A 的测试覆盖率。A 依赖 B,本质上依赖的是 B 的返回结果,也就是说 B 的返回结果会影响 A 的行为。通过 mock B 我们可以构造各种正常和异常的来自 B 的返回结果,从而更充分测试 A 的行为。
  • (2)避免 B 的因素从而对 A 产生影响。依赖真实的 B 去测试 A 可能有很多问题:B 的开发没有完成时无法测试 A;B 有阻塞性bug 时无法测试 A;B 的依赖 C 有阻塞性 bug 时无法测试 A;
  • (3)提高 A 的测试效率。B 的真实行为可能很慢,而 B 的模拟行为是非常快的,因此可以加快 A 的测试执行速度。