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

Testify:Go 测试这件事,它帮你省掉一半代码

文章目录

  • 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)]

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

相关文章:

  • knowhere | 第九课:认证、额度、计费与限流
  • qsort :超级打包工
  • python psycopg2库 操作postgresql
  • ByteArrayInputStream和DataInputStream的源码分析和使用方法详细分析前言)UTF-8 编码规则合集 - 【Java—JDK源码】IO的使用和IO相关的源码(14)1
  • 【硬核拆解】飞利浦 THE TINA (TAV9000F/93) 评测:复古外壳下的现代嵌入式系统逻辑
  • Spree Commerce:开源无头电商平台,B2B 和跨境都能用
  • AI价值:理性评估三维度
  • 3步构建AI投研框架:用Serenity-skill提升你的投资研究效率
  • 技术深度解析:1Panel批量操作架构设计与多服务器并行管理实战
  • Neural Amp Modeler终极指南:从零开始打造专业级吉他音箱模拟
  • AGI时代,万物趋于免费,真正稀缺的只剩这5样东西
  • AI写论文工具深度测评:通用大模型与专业工具的真实表
  • 浏览器AI助手终极指南:5分钟搭建本地智能浏览体验
  • 小程序商城做的比较好的品牌有哪些?要看是否适合当前经营节奏
  • BK4819射频芯片架构深度解析:如何实现低成本对讲机的高性能集成
  • AI电商工具测评!商品图片AI味太重怎么办?试试这些工具
  • 外包工日常管理合规指南:从合同到结算,SaaS系统如何嵌入控制点
  • 西门子 CU240E-2 PN 控制单元专业维修服务
  • macOS 下 OVFTool 传输报错深度排错:根治 “Failed to Send File” 间歇性上传失败
  • PG 日报|实时湖仓引擎发布,数据分层存储新方案
  • 源代码加密有什么靠谱手段?分享 6 套源代码加密方法
  • 后厨遇到恶意索赔怎么办?明厨亮灶盲区解析与AI溯源防讹技术方案
  • C++ 利用Clock类和Date类定义一个带日期的时钟类ClockWithDate,且对该对象能进行增加秒数的操作
  • SGLang:重新定义大模型服务的高性能推理框架
  • 课时10:C 语言循环跳转语句详解:break、continue 与 goto
  • Strix Halo 笔记本跑大模型,Ollama 和 LM Studio 谁更顺手
  • 光伏数据库核心三张表结构汇总表
  • [STM32 HAL库][定时器]PWM实验笔记
  • 五眼联盟警告:AI网络攻击或在数月内成真
  • 古韵楚风,诗意天成——探寻《诗经》《楚辞》中的绝美名字