在 go 函數單元測試中,錯誤處理有兩種主要策略:1. 將錯誤表示為 error 類型的具體值,用于斷言預期值;2. 使用通道向測試函數傳遞錯誤,適用于測試并發代碼。實戰案例中,使用錯誤值策略確保函數對負數輸入返回 0。
Go 函數單元測試的錯誤處理策略
單元測試是確保代碼健壯性和可靠性的重要步驟。在 Go 中,可以使用 testing 包來執行單元測試,其中包含處理錯誤的幾種策略。
錯誤處理策略
Go 中有兩種處理錯誤的主要策略:
1. 錯誤值
將錯誤表示為 error 類型的具體值。要在單元測試中使用此方法,可以將錯誤斷言為預期的值:
func TestMyFunction(t *testing.T) {
err := myFunction()
if err != nil {
t.Errorf("myFunction returned an unexpected error: %v", err)
}
}
登錄后復制
2. 錯誤通道
使用通道向測試函數傳遞錯誤。這對于測試并發代碼很有用,因為可以同時觀察多個錯誤:
func TestMyConcurrentFunction(t *testing.T) {
done := make(chan error)
go func() { done <- myConcurrentFunction() }()
select {
case err := <-done:
if err != nil {
t.Errorf("myConcurrentFunction returned an unexpected error: %v", err)
}
case <-time.After(time.Second):
t.Errorf("myConcurrentFunction did not complete within the timeout")
}
}
登錄后復制
實戰案例
考慮以下函數,它將切片中的數字相加:
func sum(numbers []int) int {
total := 0
for _, num := range numbers {
if num < 0 {
return 0
}
total += num
}
return total
}
登錄后復制
使用錯誤值策略進行單元測試,可以確保函數對負數輸入返回 0:
func TestSum(t *testing.T) {
tests := []struct {
input []int
result int
}{
{[]int{1, 2, 3}, 6},
{[]int{0, 0, 0}, 0},
{[]int{-1, 0, 1}, 0},
}
for _, test := range tests {
result := sum(test.input)
if result != test.result {
t.Errorf("sum(%v) returned %d, expected %d", test.input, result, test.result)
}
}
}
登錄后復制






