在程式設計的世界裡,單元測試像是你的程式碼的私人保鏢,每一個保鏢守護著各自一小區塊的程式碼,確保它不會在你不注意的時候崩潰。在這篇文章中,我們將深入探討 Go 語言的單元測試,並了解如何透過測試來提高程式碼的質量。不論你是剛接觸 Go 語言的新手,還是已經有經驗的開發者,希望你們都可以從中獲得一些實用的技巧。
簡單來說,單元測試就是針對程式中最小的可測試單位(通常是一個函式或方法)進行自動化測試。這就像是在驗證你的車子裡的每個零件是否正常運作(一個單元測試一般只測試一個零件),確保整台車不會在半路拋錨。
Go 語言內建了強大的測試框架,讓單元測試變得簡單易行。只需遵循以下步驟,你就可以開始編寫自己的單元測試。
Go 中的單元測試檔案以 _test.go
結尾,測試函式的命名通常以 Test
開頭。例如,如果我們有一個計算加法的函式 Add
,我們可以撰寫以下測試函式:
package main
import "testing"
func TestAdd(t *testing.T) {
result := Add(2, 3)
expected := 5
if result != expected {
t.Errorf("Add(2, 3) = %d; want %d", result, expected)
}
}
在終端中運行以下命令來執行測試:
go test
這將會執行專案中的所有測試,並顯示測試結果。
表驅動測試是一種常見的測試模式,特別適合於多組輸入和預期輸出相同的情況。以下是一個表驅動測試的範例:
func TestAddTableDriven(t *testing.T) {
tests := []struct {
a, b, expected int
}{
{1, 2, 3},
{2, 2, 4},
{10, 5, 15},
}
for _, tt := range tests {
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)
}
}
}
單元測試不僅應該測試正常情況,還應該測試異常情況和邊界情況。例如,當傳遞無效輸入時,函式應該返回錯誤:
func TestDivide(t *testing.T) {
_, err := Divide(4, 0)
if err == nil {
t.Error("Expected error for divide by zero, got nil")
}
}
go test -cover
來生成覆蓋率報告,了解測試覆蓋的程式碼範圍。儘量提高測試覆蓋率,但不要過於執著於 100%。單元測試是一個強大的工具,能夠顯著提高程式碼的質量和可靠性。對於 Go 語言開發者來說,充分利用 Go 的測試框架可以讓你的程式更加穩健。無論是為了修復錯誤還是重構程式碼,單元測試都應該成為開發流程中的一部分。希望這篇文章能幫助你更好地理解Go 語言的單元測試,並從此時此刻為你的專案或團隊添加單元測試吧!
更多Go語言相關的文章,歡迎參閱我的部落格: https://kaichiachen.github.io/2024/04/23/golang/go_unit_test/