近日,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 这样的巧妙方式。
很多时候,这样的测试验证断言是很难设计的,当然,我们可以判断是否产生错误。
以上为该特性的简单介绍。如需了解更多细节,可参考官方文档进行学习。
关注蔡超谈软件,了解更多内容?
————————————
不想再错过你的云端干货?点击“阅读原文”,或关注“云上说禅”吧!
相关阅读
- 最实用的云计算知识科普及实践教学
- 最具洞见的行业趋势解读
- 最新鲜的产品动态
- 最有趣的技术人日常
文章评论