Go 語言系列(十):測試與部署
這是 Go 語言從零到 Web 應用系列的第十篇。前九篇我們從零開始建構了一個具備 CRUD、資料庫、認證的完整 Web 應用。這篇要學如何測試和部署它。 Go 的測試工具 Go 有一個內建的測試框架,不需要安裝任何第三方套件。這是 Go 「電池已附」哲學的體現。 基本規則 測試檔案以 _test.go 結尾 測試函式以 Test 開頭 接受一個 *testing.T 參數 用 go test 執行 單元測試 基本範例 假設有一個 math.go: package math func Add(a, b int) int { return a + b } func Divide(a, b float64) (float64, error) { if b == 0 { return 0, fmt.Errorf("division by zero") } return a / b, nil } 對應的 math_test.go: package math import "testing" func TestAdd(t *testing.T) { result := Add(2, 3) if result != 5 { t.Errorf("Add(2, 3) = %d, want 5", result) } } func TestDivide(t *testing.T) { result, err := Divide(10, 2) if err != nil { t.Fatalf("unexpected error: %v", err) } if result != 5.0 { t.Errorf("Divide(10, 2) = %f, want 5.0", result) } } func TestDivideByZero(t *testing.T) { _, err := Divide(10, 0) if err == nil { t.Fatal("expected error for division by zero") } } 常用的 testing.T 方法 t.Error("message") // 記錄錯誤但繼續執行 t.Errorf("format %d", val) // 格式化版本 t.Fatal("message") // 記錄錯誤並立即停止這個測試 t.Fatalf("format %d", val) // 格式化版本 t.Log("message") // 記錄訊息(只在 -v 模式顯示) t.Skip("reason") // 跳過這個測試 執行測試 # 執行當前目錄的測試 go test # 執行所有套件的測試 go test ./... # 詳細輸出 go test -v ./... # 執行特定測試 go test -run TestDivide ./... # 顯示覆蓋率 go test -cover ./... # 生成覆蓋率報告 go test -coverprofile=coverage.out ./... go tool cover -html=coverage.out 表格驅動測試 表格驅動測試是 Go 社群最推薦的測試風格。將測試案例定義為表格,用迴圈逐一測試: ...