0Pricing
Go Academy · 课时

表驱动测试

使用子测试编写参数化测试

表驱动测试 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 testing 编写单元测试
  2. 表驱动测试
  3. 测试替身:模拟对象与存根
  4. 测试覆盖率与 testify
← 返回 Go Academy