Table-driven tests is an idiomatic pattern for testing in Go.
1// Simple example2func TestAdd(t *testing.T) {3 tests := []struct {4 name string5 a, b int6 expected int7 }{8 {"positive", 2, 3, 5},9 {"zero", 0, 0, 0},10 {"negative", -1, -2, -3},11 {"mixed", -1, 1, 0},12 }1314 for _, tt := range tests {15 t.Run(tt.name, func(t *testing.T) {16 result := Add(tt.a, tt.b)17 if result != tt.expected {18 t.Errorf("Add(%d, %d) = %d, want %d", tt.a, tt.b, result, tt.expected)19 }20 })21 }22}2324// With errors25func TestDivide(t *testing.T) {26 tests := []struct {27 name string28 a, b float6429 want float6430 wantErr bool31 }{32 {"normal", 10, 2, 5, false},33 {"by zero", 10, 0, 0, true},34 {"negative", -10, 2, -5, false},35 }3637 for _, tt := range tests {38 t.Run(tt.name, func(t *testing.T) {39 got, err := Divide(tt.a, tt.b)40 if (err != nil) != tt.wantErr {41 t.Errorf("error = %v, wantErr %v", err, tt.wantErr)42 return43 }44 if got != tt.want {45 t.Errorf("Divide(%f, %f) = %f, want %f", tt.a, tt.b, got, tt.want)46 }47 })48 }49}5051// With setup/teardown52func TestWithDB(t *testing.T) {53 tests := []struct {54 name string55 query string56 want int57 }{58 {"count users", "SELECT COUNT(*) FROM users", 10},59 {"count orders", "SELECT COUNT(*) FROM orders", 5},60 }6162 for _, tt := range tests {63 t.Run(tt.name, func(t *testing.T) {64 db := setupTestDB(t)65 defer db.Close()6667 var count int68 err := db.QueryRow(tt.query).Scan(&count)69 if err != nil {70 t.Fatal(err)71 }72 if count != tt.want {73 t.Errorf("got %d, want %d", count, tt.want)74 }75 })76 }77}
Advantages: