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 控制测试时间。
测试不是负担,而是对代码质量的信心投资。