表驱动测试
约 487 字大约 2 分钟
2025-09-04
当测试逻辑是重复的时候,通过 subtests 使用 table 驱动的方式编写 case 代码看上去会更简洁。
| Bad | Good |
|---|---|
| |
很明显,使用 test table 的方式在代码逻辑扩展的时候,比如新增 test case,都会显得更加的清晰。
我们遵循这样的约定:将结构体切片称为tests。每个测试用例称为tt。此外,我们鼓励使用give和want前缀说明每个测试用例的输入和输出值。
tests := []struct{
give string
wantHost string
wantPort string
}{
// ...
}
for _, tt := range tests {
// ...
}并行测试,比如一些专门的循环(例如,生成 goroutine 或捕获引用作为循环体的一部分的那些循环) 必须注意在循环的范围内显式地分配循环变量,以确保它们保持预期的值。
tests := []struct{
give string
// ...
}{
// ...
}
for _, tt := range tests {
tt := tt // for t.Parallel
t.Run(tt.give, func(t *testing.T) {
t.Parallel()
// ...
})
}在上面的例子中,由于下面使用了t.Parallel(),我们必须声明一个作用域为循环迭代的tt变量。 如果我们不这样做,大多数或所有测试都会收到一个意外的tt值,或者一个在运行时发生变化的值。
更新日志
2025/9/4 15:48
查看所有更新日志
a059b-新增Uber的Go语言规范于
