传统测试
★测试数据和测试逻辑混在一起
★出错信息不明确
★一旦一个数据出错测试全部结束
表格驱动测试
★分离测试数据和测试逻辑
★明确的出错信息
★可以部分失败
★go语言的语法使得我们更加容易实践表格驱动测试
testing.T 的使用
func lengthOfNonRepeatingSubStr(s string) int {

lastOccurred := make(map[rune]int)
start := 0
maxLength := 0
for i, ch := range []rune(s) {

if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
start = lastI + 1
}
if i-start+1 > maxLength {
maxLength = i - start + 1
}
lastOccurred[ch] = i
}
return maxLength
}


func TestNonrepeating(t *testing.T) {
tests := []struct {
s string
ans int
}{
//normal cases
{"abc", 3},
{"qwedew", 4},

//Edge cases
{"", 0},
{"b", 1},
{"abcabcabcd", 4},

//chinese cases
{"小茂博客欢迎您", 7},
{"欢迎您欢迎您世界", 5},
{"一个人的真正价值,在于提升自己和他人的时间品质。", 20},
}

for _, tt := range tests {
if actual := lengthOfNonRepeatingSubStr(tt.s); actual != tt.ans {
t.Errorf("lengthOfNonrepertingSubStr(%s); got %d; expect %d", tt.s, actual, tt.ans)
}
}
}
benchmark 性能测试的使用
func BenchmarkSubStr(b *testing.B) {
s := "一个人的真正价值,在于提升自己和他人的时间品质。"
ans := 20
for i := 0; i < b.N; i++ {
if actual := lengthOfNonRepeatingSubStr(s); actual != ans {
b.Errorf("lengthOfNonrepeatingSubStr(%s); got %d; expected %d", s, actual, ans)
}
}
}
Terminal
go test (测试)
go test -coverprofile=c.out
go tool cover -html=c.out (代码覆盖率)
go test -bench (性能)