当前位置: 首页 > news >正文

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会让代码精简不少。

http://www.jsqmd.com/news/979872/

相关文章:

  • 白山市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • 重庆主城六区黄金回收门店精选测评 - 润富黄金回收
  • 前程无忧岗位数据Spark清洗+ECharts动态大屏:含爬虫、坐标映射与10+可视化模块
  • 保姆级教程:拆解蓝牙调试器的数据包协议,用STC8单片机实现与手机App的稳定通信(附完整代码)
  • 粒子滤波器实战:轻量级目标跟踪的鲁棒性实现
  • G-Helper终极降温秘籍:3步让华硕游戏本CPU温度直降15℃
  • EF Core 8 + SQL Server:Contains() 突然报 “关键字 WITH 附近有语法错误“?一篇避坑指南
  • C# WinForm版开心消消乐完整工程:含源码、资源、存档与SQLite支持
  • 绵阳高新区卖黄金注意事项 靠谱回收门店推荐 - 润富黄金回收
  • BetterNCM插件管理器:3分钟搞定网易云音乐插件安装的终极方案
  • 白银市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • 英语六级真题备考最全攻略|刷题技巧及提分方法
  • 《代码整洁之道》——读书笔记(持续更新)
  • 百色市黄金回收本地靠谱店铺指南+白银回收+铂金回收+彩金回推荐收门店 及地联系方式址推荐 - 盛世金银回收
  • 从爬虫到官方导出:我的4000张语义分割数据‘解救’之路与飞桨EasyDL更新评测
  • AGI五年概率背后的四大技术支点与工程落地路径
  • 2026年Q2长沙K金回收技术要点及靠谱渠道解析:长沙钻石回收/长沙铂金回收/长沙银元回收/长沙首饰回收/长沙高档礼品回收/选择指南 - 优质品牌商家
  • C# WinForm 与 VP 二次开发
  • Python 3.9核心升级解析:GenericAlias、字典合并与zoneinfo迁移指南
  • 物业安保对讲机怎么选?稳定易用高性价比
  • 百色市黄金回收+白银回收+铂金回收+彩金回推荐收门店 本地靠谱店铺指南及地联系方式址和 - 大熊猫898989
  • sqli-labs解题思路(Less-12到Less-22)
  • ▲基于Qlearning强化学习的地下矿井OFDM自适应调制通信系统matlab仿真
  • 2026年度静压式液位计优选品牌TOP10 | 国产替代进程下的技术突围与实战选型指南 - 仪表品牌榜
  • 蚌埠市黄金回收本地靠谱店铺指南+白银回收+铂金回收+彩金回推荐收门店 及地联系方式址推荐 - 盛世金银回收
  • Kimai:开源时间追踪,个人到企业都能用
  • Zotero-Style:3个颠覆性改变如何重构你的文献管理方法论
  • DDPG训练总崩?TD3的三个‘延迟’技巧如何让你的智能体更稳定(附调参心得)
  • 绵阳游仙区黄金回收哪家靠谱 盘点正规回收门店 - 润富黄金回收
  • 从CenterPoint看3D目标检测演进:为什么“点”比“框”更适合自动驾驶?