表驱动测试
使用子测试编写参数化测试
表驱动测试 是 CoddyKit 上的免费 Go Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。
什么是表格驱动测试
表格驱动测试定义一个测试用例切片(包含输入和预期输出),并使用单个测试主体遍历这些用例。这样可以减少重复,并让添加用例变得非常简单。
基本模式
为每个用例定义一个结构体,使用 t.Run 遍历,并通过用例名称报告失败:
tests := []struct {
name string
input int
want int
}{
{"zero", 0, 0},
{"positive", 3, 9},
{"negative", -2, 4},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := Square(tt.input)
if got != tt.want {
t.Errorf("Square(%d) = %d; want %d", tt.input, got, tt.want)
}
})
}匿名结构体切片
为测试用例类型使用匿名结构体——这样可以让用例定义靠近测试代码,并避免为只使用一次的类型命名。
包含错误场景
添加 wantErr bool 字段,以测试函数是否在预期场景中返回错误:
{"invalid input", -1, 0, true},
// in the loop:
if (err != nil) != tt.wantErr {
t.Errorf("wantErr %v, got err %v", tt.wantErr, err)
}命名子测试
描述性名称字段可以让失败原因一目了然。您可以使用 -run TestFunc/case_name 运行特定用例。
t.Run 并行子测试
将每个子测试标记为并行,并捕获循环变量,以便并发运行各个用例(对于受输入输出限制的测试尤其重要)。
for _, tt := range tests {
tt := tt // capture
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
// ...
})
}每个用例共享准备工作
使用 tt.setup 函数字段支持每个用例单独准备,而无需重复样板代码:
type tc struct {
setup func() *DB
input string
want int
}保持用例可读
如果用例变得很大,请将其定义为具名变量,或从测试数据文件中加载。保持表格紧凑——尽可能每个用例占一行。
测试多个输出
为每个输出添加一个字段,以测试返回多个值的函数:
type tc struct {
input string
wantVal int
wantErr bool
}在表格测试中使用 Testify 断言
在表格测试中使用 github.com/stretchr/testify/assert,获得清晰易读的断言,避免编写冗长的 if/t.Errorf 代码块。
assert.Equal(t, tt.want, got, tt.name)使用用例编写文档
用例表本身就是持续更新的文档。未来的开发者可以通过阅读它,快速了解所有受支持的输入和边界情况。
快速检查
在表格驱动测试中,为什么要在 t.Parallel 之前捕获循环变量(tt := tt)?
回顾:表格驱动测试
要点:
- 结构体切片涵盖输入、预期输出和错误标志
- 使用 t.Run 循环创建具名且相互独立的子测试
- 在 t.Parallel 之前捕获循环变量(tt := tt)
- 用例可以作为受支持行为的持续更新文档
常见问题解答
「表驱动测试」课时是免费的吗?
是的 — 「表驱动测试」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。
「表驱动测试」这节课中我会学到什么?
使用子测试编写参数化测试 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Go Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「表驱动测试」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Go Academy 课中编写并运行代码吗?
能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。