GO 1.18 新特性 (一) — 模糊测试 (Fuzzing Test)| 云端技能包

2022年3月31日 311点热度 0人点赞 0条评论

近日,Go 团队官宣 Go 1.18 正式发布!新版本有何值得关注的特性?快跟随汇量科技 Mobvista 技术 VP 兼首席工程架构师蔡超,一起感受全新升级的 Go——


文/汇量科技技术 VP 兼首席工程架构师 蔡超


Go 1.17 发布七个月后,Go 1.18 正式发布了!Go 1.18 是一个包含大量新功能及新特性的版本,包括对语言本身做了有史以来最大的改变。其中最值得关注的新特性包括:泛型、Fuzzing Test 和 Workspace


接下来我会带大家一起来快速感受一下 GO 1.18 的新特性。


什么是模糊测试?

模糊测试是对 Go 原有测试包的一个扩充,它是一种自动化测试。通过随机生成输入数据来测试程序,用于尝试被程序员忽略的测试条件。通过模糊测试,甚至可以找到一些漏洞示例,包括 SQL 注入、缓冲区溢出、拒绝服务和跨站点脚本攻击。


直接上例子

这里,我们直接借用 Go 官方文章中的例子(https://go.dev/doc/tutorial/fuzz)

图片


模糊测试程序编写要点

  • 测试函数以 Fuzz 开头 ,  参数为 testing.F

  • f.Add 为添加种子测试数据,Fuzz 测试将通过对种子测试数据进行随机变化而产生新的测试数据(可以没有种子测试数据,直接生成随机测试数据)。

  • f.Fuzz 的来运行 fuzz 测试,这个函数的参数是 func (t testing.T, … /* 测数据类型列表 */) 。


运行测试程序

通过命令行 go test -fuzz=. 来运行,这里与运行 benchmark 测试十分类似。

测试程序会一直运行下去,直到产生错误(触发测试失败的条件)或者运行时间超时,可以通过-fuzztime 参数来指定超时时长。

导致测试失败的随机数据会被记录到 testdata/fuzz/FuzzReverse/ 路径下的文件中,并且该数据在我们再次运行测试时会被自动加入到种子测试数据中。

另,go test 也可以运行 Fuzz 开头的测试函数,但是仅仅只会运行种子测试数据 (包括我们上面提到的加入到种子数据中的失败 case 的数据)


注意事项

1. 目前模糊测试支持的随机测试数据类型:

  • string, []byte

  • int, int8, int16, int32/rune, int64

  • uint, uint8/byte, uint16, uint32, uint64

  • float32, float64

  • bool

2. 要保证 Fuzz 测试快速且具有确定性,以便测试引擎可以高效工作及轻松重现故障。

3. 为了加快测试的速度,fuzz 测试会通过并发的方式来执行,所以测试的实现中不应该依赖于任何共享状态(测试执行的并发度 / 工作协程数可以通过 命令行参数-parallel 来设置,默认值为 $GOMAXPROCS)。


思考

可以说,验证断言是测试的灵魂。但由于测试数据是随机生成的,所以编写模糊测试时的验证断言并不像普通单元测试这样中容易写。

例如,在上面的例子中:

对于普通测试,如果输入数据是给定的,如:“hello”, 我们可以断言 Reverse (input) == “olleh”。而对于模糊测试,我们就无法这样简单断言了,上面的测试中采用了 Reverse(Reverse(input)) == input 这样的巧妙方式。

很多时候,这样的测试验证断言是很难设计的,当然,我们可以判断是否产生错误。

以上为该特性的简单介绍。如需了解更多细节,可参考官方文档进行学习。

关注蔡超谈软件,了解更多内容?

————————————

不想再错过你的云端干货?点击“阅读原文”,或关注“云上说禅”吧!

相关阅读

图片

关于云上说禅

· 云上说禅作为Mobvista汇量科技云计算品牌官方账号,致力于为技术人打造云计算知识分享平台,并为用云企业提供深度行业洞察。
· 在这里,你将看到:

- 最实用的云计算知识科普及实践教学

- 最具洞见的行业趋势解读

- 最新鲜的产品动态

- 最有趣的技术人日常

73510GO 1.18 新特性 (一) — 模糊测试 (Fuzzing Test)| 云端技能包

这个人很懒,什么都没留下

文章评论