編寫測試代碼時,一個較好的辦法是把測試的輸入數(shù)據(jù)和期望的結(jié)果寫在一起組成一個數(shù)據(jù)表:表中的每條記錄都是一個含有輸入和期望值的完整測試用例,有時還可以結(jié)合像測試名字這樣的額外信息來讓測試輸出更多的信息。
實(shí)際測試時簡單迭代表中的每條記錄,并執(zhí)行必要的測試。這在練習(xí) 13.4 中有具體的應(yīng)用。
可以抽象為下面的代碼段:
var tests = []struct{ // Test table
in string
out string
}{
{"in1", "exp1"},
{"in2", "exp2"},
{"in3", "exp3"},
...
}
func TestFunction(t *testing.T) {
for i, tt := range tests {
s := FuncToBeTested(tt.in)
if s != tt.out {
t.Errorf("%d. %q => %q, wanted: %q", i, tt.in, s, tt.out)
}
}
}
如果大部分函數(shù)都可以寫成這種形式,那么寫一個幫助函數(shù) verify 對實(shí)際測試會很有幫助:
func verify(t *testing.T, testnum int, testcase, input, output, expected string) {
if expected != output {
t.Errorf("%d. %s with input = %s: output %s != %s", testnum, testcase, input, output, expected)
}
}
TestFunction 則變?yōu)椋?/p>
func TestFunction(t *testing.T) {
for i, tt := range tests {
s := FuncToBeTested(tt.in)
verify(t, i, “FuncToBeTested: “, tt.in, s, tt.out)
}
}