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新特性模糊测试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang内置net/http包的使用详解

    golang内置net/http包的使用详解

    在Go语言中,内置的net/http包提供了一种出色的方式来处理HTTP请求和响应,不仅功能强大,而且易于使用,本文将带大家深入了解Go语言内置的net/http包,揭示其强大的功能和用法,希望对大家有所帮助
    2023-11-11
  • Go语言使用AES加密解密的示例代码

    Go语言使用AES加密解密的示例代码

    这篇文章主要介绍了Go语言使用AES加密解密的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 使用Go语言实现敏感词过滤功能

    使用Go语言实现敏感词过滤功能

    敏感词过滤,算是一个比较常见的功能,尤其是在内容、社交类应用中更是如此,本文介绍如何使用Go语言实现简单的敏感词过滤功能,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 详解Go语言中的内存对齐

    详解Go语言中的内存对齐

    前面我们学习了Go语言空结构体详解,最近又在看unsafe包的知识,在查阅相关资料时不免会看到内存对齐相关的内容。虽然不会,但可以学呀,那么这篇文章,我们就一起来看下什么是内存对齐吧
    2022-10-10
  • Golang中对json的优雅处理方式

    Golang中对json的优雅处理方式

    这篇文章主要给大家介绍了关于Golang中对json的优雅处理方式,解析JSON在golang中很麻烦,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • golang协程设计及调度原理

    golang协程设计及调度原理

    这篇文章主要介绍了golang协程设计及调度原理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06
  • Go中sync.Mutex 加锁失效的问题解决

    Go中sync.Mutex 加锁失效的问题解决

    sync.Mutex是Go标准库中常用的一个排外锁,本文主要介绍了Go中sync.Mutex 加锁失效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • 详解Golang如何使用Debug库优化代码

    详解Golang如何使用Debug库优化代码

    这篇文章将针对Golang的debug库进行全面解读,涵盖其核心组件、高级功能和实战技巧,文中的示例代码讲解详细,有需要的小伙伴可以参考下
    2024-02-02
  • 关于golang中平行赋值浅析

    关于golang中平行赋值浅析

    这篇文章主要给大家介绍了关于golang中平行赋值的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用golang具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • Golang中时间相关操作合集

    Golang中时间相关操作合集

    这篇文章主要为大家介绍了Golang中的各种时间相关操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09

最新评论