文章目录TestifyGo 测试这件事它帮你省掉一半代码四个包各管一件事assert断言不用再写 ifrequire不通过就停mock替身演员suite面向对象风格的测试安装值不值得用TestifyGo 测试这件事它帮你省掉一半代码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 替代手写 ifmock 替代手搓替身suite 提供组织结构。每个都是 Go 写测试时的常见痛点。项目本身也在 Go 社区沉淀了很久文档和示例都比较完善遇到问题搜一下基本能找到答案。唯一的限制是 suite 包不支持并行测试如果你的测试重度依赖并行执行这部分用不上。但 assert 和 mock 两个包单独拿出来就已经很有价值了。2.6 万 Star 不是靠宣传堆出来的是 Go 社区用脚投票的结果。如果你在写 Go 项目还没用过花五分钟装一个试试不合适删掉就是一行命令的事。的事。[外链图片转存中…(img-xbDzCHbV-1782202226061)]