Go 的内置测试框架、代码规范与工程化实践
一、单元测试 1.1 测试文件命名 // 测试文件以 _test.go 结尾 math.go → math_test.go user.go → user_test.go utils/string.go → utils/string_test.go 1.2 基本测试函数 // math.go package math func Add(a, b int) int { return a + b } // math_test.go package math import "testing" func TestAdd(t *testing.T) { result := Add(1, 2) if result != 3 { t.Errorf("Add(1, 2) = %d; want 3", result) } } // 运行测试 // go test ./... // go test -v ./...(详细输出) 1.3 Table-Driven Tests(表驱动测试) Go 社区最推崇的测试模式:
func TestAdd(t *testing.T) { tests := []struct { name string a, b int expected int }{ {"positive numbers", 1, 2, 3}, {"negative numbers", -1, -2, -3}, {"zero", 0, 0, 0}, {"mixed", -1, 1, 0}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result := Add(tt.a, tt.b) if result != tt.expected { t.Errorf("Add(%d, %d) = %d; want %d", tt.a, tt.b, result, tt.expected) } }) } } // 运行特定子测试 // go test -run TestAdd/positive_numbers 1.4 测试辅助函数 // 断言辅助函数(Go 标准库没有内置 assert,但可以自己写) func assertEqual(t *testing.T, got, want interface{}) { t.Helper() // 标记为辅助函数,错误信息显示调用者行号 if got != want { t.Errorf("got %v, want %v", got, want) } } func TestAdd(t *testing.T) { assertEqual(t, Add(1, 2), 3) } t.Helper():标记辅助函数,错误时显示调用方的行号而非辅助函数内部行号。
...