子测试通过t.Run实现,支持命名、并发与过滤。使用t.Run定义子测试,注意变量捕获;通过-run标志运行指定子测试;调用t.Parallel()启用并发;共享setup/teardown逻辑提升效率。

在Go语言中,子测试(Subtests)是testing包从Go 1.7版本引入的重要特性,它允许你在单个测试函数内组织多个嵌套的测试用例。子测试不仅提升了测试的可读性和可维护性,还支持按名称运行特定测试、控制并发以及更清晰地管理测试上下文。以下是编写Golang子测试的常用方法和最佳实践。
最核心的方式是通过t.Run(string, func)来定义子测试。每个子测试都有独立的名字和生命周期,可以单独执行或失败。
示例:
func TestAdd(t *testing.T) {
cases := []struct {
name string
a, b int
expected int
}{
{"positive numbers", 2, 3, 5},
{"negative numbers", -2, -3, -5},
{"zero", 0, 0, 0},
}
<pre class='brush:php;toolbar:false;'>for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
if result := Add(tc.a, tc.b
); result != tc.expected {
t.Errorf("got %d, want %d", result, tc.expected)
}
})
}}
说明:每个t.Run创建一个子测试,名字唯一且具有描述性。循环中使用闭包时注意变量捕获问题,建议将测试用例结构体字段传入或在t.Run前复制变量。
子测试支持通过-run标志精确运行某个子集。
例如:
go test -run TestAdd/positive 只运行“positive numbers”测试go test -run TestAdd$ 运行整个测试但不进入子测试(仅当没有子测试匹配时)技巧:命名子测试时使用斜杠(/)分层,如"valid/input"、"invalid/empty",便于逻辑分组和过滤。
Musho
AI网页设计Figma插件
76
查看详情
若子测试彼此独立,可通过t.Parallel()并行运行以提升效率。
t.Run("group", func(t *testing.T) {
t.Run("sequential part", func(t *testing.T) {
// 不调用 Parallel,顺序执行
})
<pre class='brush:php;toolbar:false;'>t.Run("parallel part", func(t *testing.T) {
t.Parallel()
// 并发执行的测试逻辑
time.Sleep(100 * time.Millisecond)
if false {
t.Error("failed")
}
})})
注意:只有在t.Run内部调用t.Parallel()才会生效,且父测试函数必须等待所有子测试完成。
在多个子测试前执行公共设置或清理操作。
func TestWithSetup(t *testing.T) {
// 共享初始化
db, err := setupTestDB()
if err != nil {
t.Fatal("setup failed:", err)
}
defer teardown(db) // 所有子测试完成后清理
<pre class='brush:php;toolbar:false;'>t.Run("create user", func(t *testing.T) {
t.Parallel()
// 使用db进行测试
})
t.Run("list users", func(t *testing.T) {
t.Parallel()
// 使用db进行测试
})}
优势:避免重复代码,资源复用,提高测试性能。
基本上就这些。合理使用子测试能让Go单元测试更结构化、易调试、可扩展。关键是命名清晰、隔离良好,并善用并发与过滤机制。不复杂但容易忽略细节,比如变量捕获和并行控制。掌握这些模式后,测试代码会更加健壮和可维护。
以上就是如何在Golang中编写子测试_Golang子测试编写方法汇总的详细内容,更多请关注其它相关文章!
# 中文网
# 视频号SEO搜索引流
# 怎么优化网站对比软件
# 信阳关键词排名厂家直销
# 公明西田网站推广培训
# 咸宁搜狗竞价推广营销
# 通州网站平台建设
# 太仓推广平台汪子轩营销
# 郑州软文营销推广排名
# 青羊区网站建设方案公示
# 低价代刷网站推广
# 能让
# go
# 相关文章
# 你在
# 才会
# 都有
# 进行测试
# 移除
# 多个
# 如何在
# ai
# go语言
# golang
相关文章:
Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】
抓大鹅无需下载版 抓大鹅秒玩版入口
qq游戏跨平台入口_qq游戏多设备同步登录
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整
双系统安装时,如何设置默认启动系统? msconfig命令了解一下!
俄罗斯Yandex搜索引擎入口_Yandex官网免登录一键访问
小米汽车11月交付量突破40000台!雷军:将继续努力
Tailwind CSS line-clamp 布局问题解析与修复指南
Go语言HTML解析:利用Goquery精准获取指定元素内容
圆通快递查询实时追踪 圆通物流包裹状态快速查看
BetterDiscord插件中安全更新用户简介的实践指南
WooCommerce后台产品编辑页:获取分类ID并实现角色权限控制
AO3访问入口汇总 AO3网页版同人作品一键直达
QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录
DLsite中文平台入口 DLsite官网内容在线查看
韩小圈电脑版在线入口_网页版免费登录地址
优化HTML表单样式:解决输入框焦点跳动与元素间距问题
《刺客信条:影》PS5 Pro和Switch 2画面对比
12306选座如何查看座位示意图_12306座位示意图解读与使用
如何在 Windows 11 中启动游戏手柄设置
最新韩小圈网页版登录入口_官网在线观看官方链接
QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站
Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】
GemBox Document HTML转PDF垂直文本渲染问题及解决方案
iCloud登录入口网页版 苹果iCloud官网登录
QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用
深入理解Promise链:如何在catch后中断then的执行
PHP文件上传至S3:策略、考量与避免本地存储的挑战
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
微信网页版官方入口直达 微信网页版网页版登录使用方法
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践
汽水音乐在线解析 汽水音乐在线解析入口
J*aScript动态修改指定div内所有a标签样式指南
MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令
PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果
使用PHP从URL路径中提取倒数第二个片段
必由学官网入口 必由学教师登录入口
神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正
如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率
PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧
百度网盘网页版入口 百度网盘网页版官方登录网址
SteamMachine定价或为699美元 大家想入手吗?
微信聊天记录怎么加密_微信聊天记录加密方法
C++ map遍历方法大全_C++ map迭代器使用总结
*请认真填写需求信息,我们会在24小时内与您取得联系。