表格驱动测试通过结构体切片组织多用例,如type testcase{input String, limit int, expected string, desc string},在Test函数中遍历并用t.Run执行子测试,确保每个用例独立运行、错误可定位;结合require断言和t.Cleanup实现清晰、安全的测试逻辑,适用于各类边界与业务场景。

go 语言的表格驱动测试(table-Driven Tests)是官方推荐、最常用也最清晰的多用例测试写法。它把输入、预期输出、描述等组织成结构体切片,用一个 for 循环统一执行断言,避免重复代码,提升可读性和可维护性。
定义测试用例结构体
为每个测试场景定义一个结构体,字段覆盖:输入参数、期望结果、可选错误预期、简短说明。名字建议用 testcase 或 tt,简洁直观。
例如测试一个字符串截断函数:
type testcase struct { input string limit int expected string desc string }
构造测试数据表并遍历
在 TestXXX 函数中,声明一个 []testcase 切片,逐条填入不同组合。用 for _, tc := range tests 遍历,每个循环内调用被测函数并比对结果。
立即学习“go语言免费学习笔记(深入)”;
关键点:
- 用
t.Run(tc.desc, func(t *testing.T) { ... })包裹单个用例,支持子测试、独立失败、精准定位 - 断言推荐用
require.Equal(来自github.com/stretchr/testify/require)或原生if got != want+t.Errorf - 避免在循环外提前 return,确保所有用例都跑完
处理错误和边界情况
如果函数可能返回 error,结构体里加 expectErr bool 字段,或更精细地加 expectErrMsg string。测试中检查 err != nil 是否符合预期。
常见边界用例包括:
进阶技巧:共享 setup / cleanup
若多个用例需共用资源(如临时文件、mock DB),可在 t.Run 外做一次 setup,或在每个子测试内用 t.Cleanup() 注册清理函数。
例如:
t.Cleanup(func() { os.Remove("test.db") })
这样即使某个用例 panic,清理逻辑仍会执行。
基本上就这些。表格驱动不是语法特性,而是一种组织习惯——结构清晰、扩展方便、一眼看全覆盖点。写多了你会发现,加新 case 就像填表格,不复杂但容易忽略。