Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Golang新特性模糊测试

Golang 1.18新特性模糊测试用法详解

作者:pakano

模糊测试是一种软件测试技术。其核心思想是將自动或半自动生成的随机数据输入到一个程序中,并监视程序异常,如崩溃,断言失败,以发现可能的程序错误,比如内存泄漏,本文给大家介绍了Golang 1.18 新特性模糊测试,感兴趣的同学可以参考阅读下

一、Go 1.18新特性一览

0.官方博客:Go 1.18 is released! - The Go Programming Language (google.cn)

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.单元测试与模糊测试是相互补全的关系。

到此这篇关于Golang 1.18新特性模糊测试用法详解的文章就介绍到这了,更多相关Golang新特性模糊测试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文