[GoLang避坑实战-14] 写得爽,跑得快:表格驱动测试的工程级避坑实战
大家好,我是极客老墨! 刚转 Go 的时候,我还在找"Go 版的 JUnit 在哪"。结果发现,Go 根本不需要第三方测试框架,go test 命令 + testing 包就够了。 写测试不只是为了完成 KPI,更是为了**“让自己晚上能睡个好觉”**。这篇我们不仅聊基础,更要聊聊在大厂工程实践中,如何写出既稳健又专业的测试。 Go中的测试,不是"一等公民",是"超等公民"。Go 编译器自带 go test 工具,标准库提供 testing 包,写测试简单到爆。 1. 单元测试:从入门到专业 Go 的测试文件规则很简单:以 _test.go 结尾,函数名以 Test 开头。 1.1 基础写法 1func TestAdd(t *testing.T) { 2 if got := Add(1, 2); got != 3 { 3 t.Errorf("Add(1, 2) = %d; want 3", got) 4 } 5} 跑一下: 1$ go test -v 2=== RUN TestAdd 3--- PASS: TestAdd (0.00s) 4PASS 5ok example.com/math 0.392s 就这么简单。不需要装任何库,不需要配置文件。 1.2 进阶:表格驱动(标配) 这是 Go 社区的灵魂写法。把数据和逻辑分离,增加测试用例只需在切片里加一行,这就是“表格驱动”。 1func TestAddTableDriven(t *testing.T) { 2 // 1. 定义测试用例 3 tests := []struct { 4 name string // 用例名称 5 a, b int // 输入 6 want int // 期望结果 7 }{ 8 {"正数", 1, 2, 3}, 9 {"负数", -1, -2, -3}, 10 {"混合", -1, 1, 0}, 11 {"零", 0, 0, 0}, 12 } 13 14 // 2. 遍历执行 15 for _, tt := range tests { 16 // t.Run 启动子测试,方便定位错误 17 t.Run(tt.name, func(t *testing.T) { 18 got := Add(tt.a, tt.b) 19 if got != tt.want { 20 t.Errorf("Add(%d, %d) = %d; want %d", tt.a, tt.b, got, tt.want) 21 } 22 }) 23 } 24} 为什么推荐表格驱动? ...