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

 更新时间:2023年05月21日 10:58:51   作者: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新特性模糊测试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言中的数据竞争模式详解

    Go语言中的数据竞争模式详解

    这篇文章主要介绍了Go语言中的数据竞争模式详解,主要基于在Uber的Go monorepo中发现的各种数据竞争模式,分析了其背后的原因与分类,需要的朋友可以参考一下
    2022-07-07
  • 一文带你了解Go语言fmt标准库输入函数的使用

    一文带你了解Go语言fmt标准库输入函数的使用

    这篇文章主要为大家详细介绍了Go语言中 fmt 标准库输入函数的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-01-01
  • Golang中String,rune和byte的相互转换

    Golang中String,rune和byte的相互转换

    Go语言中,string就是只读的采用utf8编码的字节切片,rune是int32的别名,代表字符的Unicode编码,这篇文章主要介绍了Golang中String,rune和byte的相互转换,感兴趣的小伙伴可以了解一下
    2023-10-10
  • Go语言中Select语句用法实例

    Go语言中Select语句用法实例

    这篇文章主要介绍了Go语言中Select语句用法,实例分析了select语句的原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Go语言学习otns示例分析

    Go语言学习otns示例分析

    这篇文章主要为大家介绍了Go语言学习otns示例分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Goland的设置与配置全过程

    Goland的设置与配置全过程

    这篇文章主要介绍了Goland的设置与配置全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Go素数筛选分析详解

    Go素数筛选分析详解

    学习Go语言的过程中,遇到素数筛选的问题。这是一个经典的并发编程问题,是某大佬的代码,短短几行代码就实现了素数筛选,这篇文章主要介绍了Go素数筛选分析,需要的朋友可以参考下
    2022-10-10
  • Go container包的介绍

    Go container包的介绍

    这篇文章主要介绍了Go container包,go语言container包中有List和Element容器ist和Element都是结构体类型。结构体类型有一个特点,那就是它们的零值都会是拥有其特定结构,但没有任何定制化内容的值,相当于一个空壳,下面一起进文章来了解具体内容吧
    2021-12-12
  • 详解如何利用GORM实现MySQL事务

    详解如何利用GORM实现MySQL事务

    为了确保数据一致性,在项目中会经常用到事务处理,对于MySQL事务相信大家应该都不陌生。这篇文章主要总结一下在Go语言中Gorm是如何实现事务的;感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助
    2022-09-09
  • Go Slice进行参数传递如何实现详解

    Go Slice进行参数传递如何实现详解

    这篇文章主要为大家介绍了Go Slice进行参数传递如何实现的过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论