Like Share Discussion Bookmark Smile

J.J. Huang   2025-06-16   Getting Started Golang 07.套件   瀏覽次數:次   DMCA.com Protection Status

Go | 套件測試基本進階技巧

💬 簡介

寫得出功能固然重要,確保功能正確才是專業
Go 語言內建 testing 套件,支援單元測試、基準測試與範例測試,讓開發者能在套件層級進行精細把關。

本篇將介紹如何撰寫 *_test.go 測試檔,並說明常見測試技巧與規範,幫助你打造可靠的 Golang 套件程式。

圖片來源:Gophers


📂 測試檔案的命名與結構

在 Go 中,測試函式必須放在與被測套件相同目錄中,檔案名稱需以 _test.go 結尾:

1
2
3
mathutil/
├── math.go
└── math_test.go
  • math.go

    1
    2
    3
    4
    5
    package mathutil

    func Add(a, b int) int {
    return a + b
    }
  • math_test.go

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package mathutil

    import "testing"

    func TestAdd(t *testing.T) {
    result := Add(2, 3)
    if result != 5 {
    t.Errorf("Add(2, 3) = %d; want 5", result)
    }
    }

🧪 單元測試(Unit Test)

  • 測試函式規範

    • 命名必須以 Test 開頭
    • 函式簽章需為 func(t *testing.T)
    • 可以撰寫多個測試函式、子測試與表格驅動測試(Table-Driven)
  • 子測試與表格驅動範例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func TestAddCases(t *testing.T) {
    cases := []struct {
    a, b int
    want int
    }{
    {1, 1, 2},
    {2, -1, 1},
    {0, 0, 0},
    }

    for _, c := range cases {
    t.Run(fmt.Sprintf("%d+%d", c.a, c.b), func(t *testing.T) {
    got := Add(c.a, c.b)
    if got != c.want {
    t.Errorf("Add(%d, %d) = %d; want %d", c.a, c.b, got, c.want)
    }
    })
    }
    }

🚀 基準測試(Benchmark)

用來測量某段程式的效能與效能瓶頸。
函式需以 Benchmark 為開頭,簽章為 func(b *testing.B)

1
2
3
4
5
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(100, 200)
}
}

✨ 補充:外部 API 的測試策略

對於具有副作用(如 API 請求、檔案寫入等)的函式,建議:

  • 使用 interface 抽象依賴,並以 mock 實作進行測試
  • 或將副作用邏輯抽出,讓純邏輯能被單元測試覆蓋

📌 執行測試與選項說明

  • 基本執行:

    1
    go test
  • 顯示詳細資訊:

    1
    go test -v
  • 僅執行基準測試:

    1
    go test -bench=.
  • 跳過緩存:

    1
    go test -count=1
  • 執行特定函式:

    1
    go test -run ^TestAdd$

📊 顯示測試覆蓋率

1
go test -cover

或產生 HTML 報表:

1
2
go test -coverprofile=coverage.out
go tool cover -html=coverage.out

❓ 測試檔案放在哪?

類型 檔名規範 套件命名 說明
單元測試 xxx_test.go 與主程式相同 可存取未匯出的私有函式與變數
黑箱測試 xxx_test.go 使用 xxx_test 套件名 僅測試公開 API,模擬使用者角度

🎯 總結

測試是品質保證的最後一道防線,而 testing 套件是 Go 官方提供的可靠工具。
寫測試不只是為了找錯,更是幫助你釐清需求與邏輯邊界。

  • ✅ 使用 _test.go 撰寫單元與基準測試
  • ✅ 利用 t.Run() 撰寫子測試與表格測試
  • ✅ 搭配 go test 執行與分析效能瓶頸
  • ✅ 使用 interface 或抽象避免副作用阻礙測試

最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。


註:以上參考了
Go