news 2026/6/9 7:46:08

26k Star的Go测试库Testify:断言、Mock、Suite一站搞定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
26k Star的Go测试库Testify:断言、Mock、Suite一站搞定

文章目录

  • 26k Star的Go测试库Testify:断言、Mock、Suite一站搞定
    • assert:断言不再是体力活
    • require:失败就停
    • mock:别手写假对象了
    • suite:setup/teardown回到Go
    • 安装和版本
    • 一句话总结
  • 一句话总结

26k Star的Go测试库Testify:断言、Mock、Suite一站搞定

写Go代码的人都经历过:标准库的testing包只给了t.Errort.Fatal,没有断言、没有mock、没有suite。一个简单的判断要写四五行if err != nil,测试代码量经常超过业务代码。

Testify就是为了填这个坑而出现的。GitHub上26,002个Star,几乎所有Go项目都在用它写测试。它把Go测试中缺失的三个能力一次性补齐了。

assert:断言不再是体力活

assert包封装了Go标准库没有的断言方法,把测试代码从手工检查中解放出来:

assert.Equal(t,123,123,"they should be equal")assert.NotEqual(t,123,456,"they should not be equal")assert.Nil(t,err)assert.NotNil(t,result)

每个断言接受testing.T作为第一个参数,失败信息通过标准go test输出。每个方法返回bool值,可以在条件满足时继续后续断言:

ifassert.NotNil(t,object){assert.Equal(t,"Something",object.Value)}

断言多的时候,创建assert实例省掉每次传t

assert:=assert.New(t)assert.Equal(123,123,"they should be equal")assert.NotEqual(123,456,"they should not be equal")

require:失败就停

require的API和assert完全一致,只差一个行为:assert失败后继续执行,require失败后立刻终止当前测试。适合"这个不成立后面就全没意义了"的场景。

mock:别手写假对象了

单元测试最绕不开的就是mock。Go标准库没给mock能力,手写假对象结构体又耗时又容易漏。Testify的mock包把这件事拉平了:

typeMyMockedObjectstruct{mock.Mock}func(m*MyMockedObject)DoSomething(numberint)(bool,error){args:=m.Called(number)returnargs.Bool(0),args.Error(1)}funcTestSomething(t*testing.T){testObj:=new(MyMockedObject)testObj.On("DoSomething",123).Return(true,nil)targetFuncThatDoesSomethingWithObj(testObj)testObj.AssertExpectations(t)}

On().Return()声明期望调用,AssertExpectations验证是否按预期执行。支持mock.Anything作为占位符,参数值不确定时也能写断言。

如果觉得手写mock结构体还是麻烦,配合mockery工具可以根据interface自动生成mock代码。

suite:setup/teardown回到Go

写过Java或Python测试的人会怀念setUp/tearDown。Testify的suite包把这种组织方式搬到了Go:

typeExampleTestSuitestruct{suite.Suite VariableThatShouldStartAtFiveint}func(suite*ExampleTestSuite)SetupTest(){suite.VariableThatShouldStartAtFive=5}func(suite*ExampleTestSuite)TestExample(){suite.Equal(suite.VariableThatShouldStartAtFive,5)}funcTestExampleTestSuite(t*testing.T){suite.Run(t,new(ExampleTestSuite))}

定义结构体嵌入suite.Suite,写SetupTestTearDownTestTest开头的方法自动成为测试用例。suite.Suite内置了断言方法,连assert包也不用单独导入了。

suite包不支持并行测试,如果需要并行跑用例,用assertrequire包自己组织。

安装和版本

一行命令安装:

go get github.com/stretchr/testify

更新到最新版:

go get-ugithub.com/stretchr/testify

支持Go 1.19及以上版本。目前维护在v1,不再接收破坏性变更。

一句话总结

Go的标准库测试太底层,Testify补上了断言、mock和suite三个缺口。26k的Star数不是白来的,如果你的Go项目测试代码里还全是if err != nil,换Testify会让代码精简不少。

一句话总结

Go的标准库测试太底层,Testify补上了断言、mock和suite三个缺口。26k的Star数不是白来的,如果你的Go项目测试代码里还全是if err != nil,换Testify会让代码精简不少。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 7:45:35

基于RDMA的全双工文件传输:一个InfiniBand Verbs与MAD实践

摘要 InfiniBand(IB)以其高带宽、低延迟和内核旁路特性,在现代数据中心和高性能计算领域占据重要地位。本文基于一个完整的C语言程序,深入剖析如何利用InfiniBand Verbs接口和MAD(Management Datagram)管理数据报,在两台直连的IB节点之间实现全双工文件传输。程序实现了…

作者头像 李华
网站建设 2026/6/9 7:43:43

NSK紧凑型FA系列超高速精密丝杠

型号 W1501FA-3PG-C5Z20 属于 the sources 中 NSK 推出的紧凑型 FA 系列(Compact FA Series)高速精密滚珠丝杠。 | 编码 | 属性 | 数据 | 内容 | |------|------|--------|------| | A | 联 | 133 | 许 | | B | 系 | 2798 | 经 | …

作者头像 李华
网站建设 2026/6/9 7:42:05

面向对象的三大特性(封装、继承、多态)

面向对象的三大特性(封装、继承、多态) 一、封装1. 修饰符:◦ private,代表私有的,被private修饰的内容只能在本类中使用。◦ public,代表公开的,公共的2. 封装的要求: (1) 属性私有…

作者头像 李华
网站建设 2026/6/9 7:40:35

告别调参玄学:Halcon图像分割从binary_threshold到dyn_threshold的实战选择

工业视觉实战:Halcon阈值分割算子的科学选择与性能优化在工业视觉检测领域,图像分割的质量直接决定了后续特征提取和缺陷识别的准确性。面对复杂多变的工业场景,如何选择合适的阈值分割方法成为工程师们必须掌握的核心技能。本文将深入剖析Ha…

作者头像 李华
网站建设 2026/6/9 7:40:31

Ubuntu Wayland 环境下 CopyQ 剪贴板失效及改用 GPaste 的解决方案

摘要 在 Ubuntu 24.04(GNOME 46)从 Xorg 会话切换到 Wayland 会话后,CopyQ 剪贴板管理器无法再记录复制内容。本文分析其根本原因,并给出两种解决方案,重点说明在保留 Wayland 会话的前提下改用 GNOME 原生剪贴板工具 …

作者头像 李华