Go 1.18 新增三大功能之一“模糊测试”使用方式

简介: Go 1.18 新增三大功能之一“模糊测试”使用方式

介绍

在 Go 1.18 之前,Go 语言支持功能测试、基准测试和示例测试,在 Go 项目开发中,使用最多的是功能测试,读者朋友们应该都比较熟悉功能测试的使用方式了。

在 Go 1.18 中,Go 语言新增模糊测试,本文我们介绍模糊测试的使用方式。

使用方式

Go 语言的模糊测试,与其他三种测试方式相同,测试文件的文件名以 _test.go 结尾,测试文件中必须导入 testing 包。

模糊测试与其他三种测试方式的不同点是,函数名和函数签名不同。

我们在之前关于 Go 测试的文章中介绍过,功能测试的函数名以 Test 开头,函数签名是 t testing.T

性能测试的函数名以 Benchmark 开头,函数签名是 b testing.B

模糊测试的函数名以 Fuzz 开头,函数签名是 f testing.F

与功能测试和性能测试相同,运行模糊测试也是使用 go test 命令,读者朋友们可以运行 go help testgo help testflag 了解更多。

03

模糊测试示例

Go 语言功能测试需要我们预定义测试值和与之对应的期望得到的值,如果测试输出结果值与预先定义的期望值相同,则认为通过测试,反之,则认为未通过测试。

示例代码:

func Reverse(s string) string {
 b := []byte(s)
 for i, j := 0, len(b)-1; i < len(b)/2; i, j = i+1, j-1 {
  b[i], b[j] = b[j], b[i]
 }
 return string(b)
}

功能测试代码:

func TestReverse(t *testing.T) {
 testcases := []struct {
  in, want string
 }{
  {"Hello, world", "dlrow ,olleH"},
  {" ", " "},
  {"!12345", "54321!"},
 }
 for _, tc := range testcases {
  rev := Reverse(tc.in)
  if rev != tc.want {
   t.Errorf("Reverse: %q, want %q", rev, tc.want)
  }
 }
}

阅读上面这段代码,我们定义一个反转字符串的函数 Reverse,并定义一个功能测试函数 TestReverse,读者朋友们应该非常熟悉类似的功能测试代码。

但是,在实际项目开发中,我们很难考虑到所有测试用例,比如上面这段代码运行结果是通过测试,我们一般就会认为定义的反转字符串函数 Reverse 功能正常。

实际结果并非如此,我们在测试用例中加入一组中文字符串,{"我爱学编程", "程编学爱我"},,我们再运行功能测试代码,得到的结果就是未通过。

聪明的读者朋友们,应该已经发现问题在哪,修复该问题也很简单,只需将 []byte 改为 []rune,当然,这不是本文的重点,我们也就不深入解释问题的原因了。

模糊测试,就是 Go 自动为我们的代码提供输入的测试用例,并可以测出相比我们自己提供测试用例所考虑不到的边缘情况。

模糊测试代码:

func FuzzReverse(f *testing.F) {
 testcases := []string{"Hello, world", " ", "!12345"}
 for _, tc := range testcases {
  f.Add(tc) // Use f.Add to provide a seed corpus
 }
 f.Fuzz(func(t *testing.T, orig string) {
  rev := Reverse(orig)
  doubleRev := Reverse(rev)
  if orig != doubleRev {
   t.Errorf("Before: %q, after: %q", orig, doubleRev)
  }
 })
}

阅读上面这段代码,我们将功能测试代码转换为模糊测试代码,仔细分析这段代码,我们可以发现,我们将功能测试中的输入测试用例,通过 f.Add 将其作为模糊测是的种子语料库。

在功能测试代码的函数签名中,新增一个字符串类型的参数 orig,将 orig 原值经过两次反转,如果最终结果与 orig 不同,则为未通过测试,并将该代码作为 f.Fuzz 的参数,这里的 orig 称为模糊参数。

640.png

需要注意的是,运行模糊测试函数时,首次先不要使用 -fuzz,以确保种子输入可以通过。

然后,在运行 go test -fuzz=Fuzz(也可以使用完整模糊测试函数名),运行失败时,将导致运行失败的输入写入种子语料库。

接着,就是调式代码,直到通过模糊测试,限于篇幅,我们不讲述调试过程。

需要注意的时,当模糊测试可以通过时,模糊测试将一直运行,我们需要使用 ctrl-C 结束程序。或者使用 -fuzztime 30s,代表如果模糊测试通过,运行 30s 将自动停止。

04

总结

本文我们介绍 Go 模糊测试的使用方式,它可以很好地解决功能测试无法考虑到所有边界问题的情况。

关于模糊测是的更多内容,感兴趣的读者朋友们可以阅读官方教程。

推荐阅读:

参考资料:

  1. https://go.dev/doc/tutorial/fuzz
  2. https://go.dev/security/fuzz/


目录
相关文章
|
17天前
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
115 56
|
26天前
|
测试技术
Appscan手工探索、手工测试功能实战
Appscan手工探索、手工测试功能实战
|
2月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
197 3
快速上手|HTTP 接口功能自动化测试
|
3月前
|
XML Web App开发 数据挖掘
Postman接口测试工具全解析:功能、脚本编写及优缺点探讨
文章详细分析了Postman接口测试工具的功能、脚本编写、使用场景以及优缺点,强调了其在接口自动化测试中的强大能力,同时指出了其在性能分析方面的不足,并建议根据项目需求和个人偏好选择合适的接口测试工具。
99 1
|
3月前
|
SQL 安全 测试技术
[go 面试] 接口测试的方法与技巧
[go 面试] 接口测试的方法与技巧
|
3月前
|
算法 搜索推荐 Unix
快速指南: Go 1.19功能
快速指南: Go 1.19功能
|
3月前
|
Web App开发 敏捷开发 测试技术
自动化测试之美:使用Selenium WebDriver进行网页功能验证
【8月更文挑战第29天】在数字时代,软件质量是企业竞争力的关键。本文将深入探讨如何通过Selenium WebDriver实现自动化测试,确保网页应用的可靠性和性能。我们将从基础设置到编写测试用例,逐步引导读者掌握这一强大的测试工具,同时分享实战经验,让测试不再是开发的负担,而是质量保证的利器。
|
3月前
|
测试技术
一款功能完善的智能匹配1V1视频聊天App应该通过的测试CASE
文章列举了一系列针对1V1视频聊天App的测试用例,包括UI样式、权限请求、登录流程、匹配逻辑、消息处理、充值功能等多个方面的测试点,并标注了每个测试用例的执行状态,如通过(PASS)、失败(FAIL)或需要进一步处理(延期修改、待定、方案再定等)。
60 0
|
3月前
|
缓存 算法 Java
非功能需求的测试
非功能需求的测试
37 2
|
3月前
|
算法 安全 测试技术
Go - 常用签名算法的基准测试
Go - 常用签名算法的基准测试
29 2