您现在的位置是:首页 >学无止境 >Golang 1.18 新特性模糊测试网站首页学无止境

Golang 1.18 新特性模糊测试

pakano 2024-06-17 11:19:32
简介Golang 1.18 新特性模糊测试

一、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模糊测试 - 掘金

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。