Go 从语言层面内置了测试框架,无需第三方库即可编写单元测试、基准测试和示例测试。这种"电池已包含"的设计极大地降低了编写测试的门槛。

表驱动测试

表驱动测试是 Go 社区最推崇的测试模式——将测试用例组织为结构体切片,用一个循环驱动所有用例:

func TestAdd(t *testing.T) {
    tests := []struct {
        name string
        a, b int
        want int
    }{
        {"positive", 1, 2, 3},
        {"negative", -1, -2, -3},
        {"zero", 0, 0, 0},
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            if got := Add(tt.a, tt.b); got != tt.want {
                t.Errorf("Add(%d,%d)=%d,want %d", tt.a, tt.b, got, tt.want)
            }
        })
    }
}

Mock 与测试辅助

通过接口可以轻松实现 mock。Go 社区的 testify 库提供了丰富的断言,mockgen 则能自动生成 mock 代码。

Benchmark

func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add(1, 2)
    }
}
// go test -bench=. -benchmem

关键参数:-benchmem 显示内存分配,-count 控制重复次数,-benchtime 控制测试时间。

测试不是负担,而是对代码质量的信心投资。