一、Go 1.18新特性一览
0.官方博客:跳转
1.支持泛型
2.模糊测试
3.工作空间
4.性能提升
二、模糊测试介绍
模糊测试 (fuzz testing, fuzzing)是一种软件测试技术。其核心思想是將自动或半自动生成的随机数据输入到一个程序中,并监视程序异常,如崩溃,断言(assertion)失败,以发现可能的程序错误,比如内存泄漏。模糊测试常常用于检测软件或计算机系统的安全漏洞。——维基百科
三、模糊测试使用
1.测试函数: reverse(实现字符串的反转)
func Reverse(str string) string {
data := []byte(str)
for i, j := 0, len(data)-1; i < len(data)/2; i, j = i+1, j-1 {
data[i], data[j] = data[j], data[i]
}
return string(data)
}
2.单元测试:go test -run=TestReverse
func TestReverse(t *testing.T) {
type TeseCase struct {
Input string
Expected string
}
testcases := []TeseCase{
{"hello", "olleh"},
{"world", "dlrow"},
{"earth", "htrae"},
}
for _, testcase := range testcases {
actual := Reverse(testcase.Input)
assert.Equal(t, testcase.Expected, actual)
}
}
3.模糊测试
func FuzzReverse(f *testing.F) {
var seeds = []string{"hello", "world", "earth"}
for i := range seeds {
f.Add(seeds[i])
}
f.Fuzz(func(t *testing.T, input string) {
str1 := Reverse(input)
str2 := Reverse(str1)
if strings.EqualFold(input, str2) {
t.Errorf("reverse failed! input: %s", input)
}
})
}
4.模糊测试开始:go test -fuzz=Fuzz -run=FuzzReverse
四、注意事项
1.模糊测试失败会在当前测试的文件地方生成testdata目录,里面记录了输入项。
我们可以将代码修改如下:对输入hello、world、earth 跳过,其余全部不通过!
func FuzzReverse(f *testing.F) {
var seeds = []string{"hello", "world", "earth"}
for i := range seeds {
f.Add(seeds[i])
}
f.Fuzz(func(t *testing.T, input string) {
if input == "hello" || input == "world" || input == "earth" {
return
}
str1 := Reverse(input)
str2 := Reverse(str1)
if strings.EqualFold(input, str2) {
t.Errorf("reverse failed! input: %s", input)
}
})
}
则现象如下: 此处显示模糊测试产生的输入项。
在testdata/fuzz/FuzzReverse/771e938e4458e983中可以看到输入项。其中v1是当前golang的 fuzz版本。
2.如代码所示:我们进行模糊测试只需要两步:
第一步制造种子,根据测试函数的参数列表放入即可,add函数的调用不限于1次。
第二步,用Fuzz调用一个函数,这个函数第一个参数是*testing.T,其余就是测试函数的参数列表了,函数体中就按单元测试写即可,出错就报错。
3.单元测试与模糊测试是相互补全的关系。
参考资料:官方教程:Go fuzzing模糊测试 - 掘金