文章目录
- Testify:Go 测试这件事,它帮你省掉一半代码
- 四个包,各管一件事
- assert:断言不用再写 if
- require:不通过就停
- mock:替身演员
- suite:面向对象风格的测试
- 安装
- 值不值得用
Testify:Go 测试这件事,它帮你省掉一半代码
Go 自带的 testing 包能写测试,但用起来总差点意思。断言要自己写 if 判断,Mock 对象要手搓,测试一多,代码又长又难看。Testify 就是专门解决这些问题的。
Star 2.6 万,Go 测试库里排名第一。这个项目稳定维护在 v1 版本,官方明确说了不会接受破坏性变更,用着踏实。
四个包,各管一件事
Testify 不是一个大而全的库,拆成四个独立包,各解决一个测试痛点。
assert:断言不用再写 if
这是用得最多的包。原来写if got != want { t.Errorf(...) },现在一行assert.Equal(t, got, want)搞定。失败时输出清晰的错误描述,不用自己拼字符串。连续写多个断言的场景,可以先创建一个实例,省掉每次都传 t 参数。断言函数都返回 bool 值,表示断言是否成功,这个返回值可以用来做条件判断,避免在前置断言失败时触发空指针。
require:不通过就停
接口和 assert 完全一样,区别在于断言失败后直接终止当前测试。有些测试的前置条件不满足,后面写了也白写,用 require 就不用再加 if 保护。这个函数只能在测试 goroutine 内部调用,否则会有竞态问题。
mock:替身演员
写单元测试经常要 Mock 外部依赖。Testify 的 mock 包提供了一套机制:定义结构体嵌入 mock.Mock,用 On 设置调用期望,用 Return 定义返回值,最后 AssertExpectations 验证是否按预期执行。参数匹配支持 mock.Anything 这类占位符,不用关心具体传了什么值。配合 mockery 工具还能从接口自动生成 Mock 代码,基本不用手写。测试执行完还可以用 Unset 移除旧的期望,重新设置新的行为,一个测试函数里验证多种分支逻辑很方便。
suite:面向对象风格的测试
习惯把测试组织成一个类的开发者,suite 就是对口的。定义一个结构体嵌入 suite.Suite,挂上 SetupTest 做初始化,所有 Test 开头的方法自动成为测试用例。适合测试之间有共享状态的场景。不过 suite 不支持并行测试,官方在 GitHub issue 里有说明。
安装
一行搞定:
go get github.com/stretchr/testify四个包都会装上,代码里按需 import。支持 Go 1.19 及以上版本。
值不值得用
Testify 解决的问题很明确:减少测试代码的重复量,提升可读性。assert 替代手写 if,mock 替代手搓替身,suite 提供组织结构。每个都是 Go 写测试时的常见痛点。
项目本身也在 Go 社区沉淀了很久,文档和示例都比较完善,遇到问题搜一下基本能找到答案。唯一的限制是 suite 包不支持并行测试,如果你的测试重度依赖并行执行,这部分用不上。但 assert 和 mock 两个包单独拿出来就已经很有价值了。
2.6 万 Star 不是靠宣传堆出来的,是 Go 社区用脚投票的结果。如果你在写 Go 项目还没用过,花五分钟装一个试试,不合适删掉就是一行命令的事。
的事。
[外链图片转存中…(img-xbDzCHbV-1782202226061)]