在 go 函數(shù)單元測(cè)試中,錯(cuò)誤處理有兩種主要策略:1. 將錯(cuò)誤表示為 error 類型的具體值,用于斷言預(yù)期值;2. 使用通道向測(cè)試函數(shù)傳遞錯(cuò)誤,適用于測(cè)試并發(fā)代碼。實(shí)戰(zhàn)案例中,使用錯(cuò)誤值策略確保函數(shù)對(duì)負(fù)數(shù)輸入返回 0。
Go 函數(shù)單元測(cè)試的錯(cuò)誤處理策略
單元測(cè)試是確保代碼健壯性和可靠性的重要步驟。在 Go 中,可以使用 testing
包來(lái)執(zhí)行單元測(cè)試,其中包含處理錯(cuò)誤的幾種策略。
錯(cuò)誤處理策略
Go 中有兩種處理錯(cuò)誤的主要策略:
1. 錯(cuò)誤值
將錯(cuò)誤表示為 error
類型的具體值。要在單元測(cè)試中使用此方法,可以將錯(cuò)誤斷言為預(yù)期的值:
func TestMyFunction(t *testing.T) { err := myFunction() if err != nil { t.Errorf("myFunction returned an unexpected error: %v", err) } }
登錄后復(fù)制
2. 錯(cuò)誤通道
使用通道向測(cè)試函數(shù)傳遞錯(cuò)誤。這對(duì)于測(cè)試并發(fā)代碼很有用,因?yàn)榭梢酝瑫r(shí)觀察多個(gè)錯(cuò)誤:
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") } }
登錄后復(fù)制
實(shí)戰(zhàn)案例
考慮以下函數(shù),它將切片中的數(shù)字相加:
func sum(numbers []int) int { total := 0 for _, num := range numbers { if num < 0 { return 0 } total += num } return total }
登錄后復(fù)制
使用錯(cuò)誤值策略進(jìn)行單元測(cè)試,可以確保函數(shù)對(duì)負(fù)數(shù)輸入返回 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) } } }
登錄后復(fù)制