Go | 套件測試基本進階技巧
💬 簡介
寫得出功能固然重要,確保功能正確才是專業。
Go 語言內建 testing
套件,支援單元測試、基準測試與範例測試,讓開發者能在套件層級進行精細把關。
本篇將介紹如何撰寫
*_test.go
測試檔,並說明常見測試技巧與規範,幫助你打造可靠的 Golang 套件程式。
圖片來源:Gophers
📂 測試檔案的命名與結構
在 Go 中,測試函式必須放在與被測套件相同目錄中,檔案名稱需以 _test.go
結尾:
1 | mathutil/ |
math.go
1
2
3
4
5package mathutil
func Add(a, b int) int {
return a + b
}math_test.go
1
2
3
4
5
6
7
8
9
10package 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
19func 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 | func BenchmarkAdd(b *testing.B) { |
✨ 補充:外部 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 | go test -coverprofile=coverage.out |
❓ 測試檔案放在哪?
類型 | 檔名規範 | 套件命名 | 說明 |
---|---|---|---|
單元測試 | xxx_test.go |
與主程式相同 | 可存取未匯出的私有函式與變數 |
黑箱測試 | xxx_test.go |
使用 xxx_test 套件名 |
僅測試公開 API,模擬使用者角度 |
🎯 總結
測試是品質保證的最後一道防線,而 testing
套件是 Go 官方提供的可靠工具。
寫測試不只是為了找錯,更是幫助你釐清需求與邏輯邊界。
- ✅ 使用
_test.go
撰寫單元與基準測試 - ✅ 利用
t.Run()
撰寫子測試與表格測試 - ✅ 搭配
go test
執行與分析效能瓶頸 - ✅ 使用 interface 或抽象避免副作用阻礙測試
最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。
註:以上參考了
Go