1.引言
Golang1.18 引入了一个模糊测试的功能。文本萌叔将会简单介绍下这个特性。
2.模糊测试
比如我们编写了一个工具包来做除法
package fuzz
func Div(a, b int) int {
return a / b
}
由于疏忽忽略了某些边界条件。显然在上面的代码中,b不能等于0,否则会发生运行时错误。
普通的单元测试
func TestDiv(t *testing.T) {
testcases := []struct {
a, b, want int
}{
{10, 2, 5},
{5, 3, 1},
{-6, 3, -2},
{-6, -3, 2},
}
for _, tc := range testcases {
result := Div(tc.a, tc.b)
if Div(tc.a, tc.b) != tc.want {
t.Errorf("Div: %q, want %q", result, tc.want)
}
}
}
由于对分支条件和异常情况考虑的不周全,自测的单元测试能够正常通过。但是一旦b=0,程序将会崩溃。
模糊测试 fuzz test
我们可以编写一个模糊测试的用例
func FuzzXxx(f *testing.F) { ... }