Go 1.18 新特性:模糊测试

2022年2月28日 327点热度 0人点赞 0条评论

图片

什么是模糊测试?

        模糊测试是一种测试技术,其中测试基础结构使用随机生成的输入调用代码,以检查它是否生成正确的结果或合理的错误。模糊测试是对单元测试的补充,在单元测试中,在给定一组静态输入的情况下,您可以测试代码是否生成了正确的输出。单元测试是有限的,因为您只能使用预期的输入进行实际测试;模糊测试非常擅长发现暴露奇怪行为的意外输入。一个好的模糊测试系统还会检测正在测试的代码,以便它可以有效地生成扩展代码覆盖率的输入。

        模糊测试通常用于检查解析器和验证器,尤其是在安全上下文中使用的任何内容。模糊测试非常适合查找导致安全问题的错误,例如二进制编码中的长度无效、输入被截断、整数溢出、Unicode 无效等。

        还有其他方法可以使用模糊测试。例如,差分模糊测试通过向两个实现提供相同的随机输入并检查输出是否匹配来验证同一事物的两个实现是否具有相同的行为。你还可以使用模糊测试进行用户界面"猴子"测试:模糊测试引擎可以生成随机点击、击键和单击,并且测试会验证应用是否不会崩溃。


Go 的模糊测试

        fuzz 是一种自动化测试,通过不断的随机生成入参对方法进行调用,因为fuzz能够触及到开发人员自测覆盖不到的地方,所以 fuzz 就显得非常有价值。

图片

通过 go test -fuzz={FuzzTestName} 启用模糊测试,如下:

go test -fuzz=FuzzFoo

执行输出大致如下:

~ go test -fuzz FuzzFoofuzz: elapsed: 0s, gathering baseline coverage: 0/192 completedfuzz: elapsed: 0s, gathering baseline coverage: 192/192 completed, now fuzzing with 8 workersfuzz: elapsed: 3s, execs: 325017 (108336/sec), new interesting: 11 (total: 202)fuzz: elapsed: 6s, execs: 680218 (118402/sec), new interesting: 12 (total: 203)fuzz: elapsed: 9s, execs: 1039901 (119895/sec), new interesting: 19 (total: 210)fuzz: elapsed: 12s, execs: 1386684 (115594/sec), new interesting: 21 (total: 212)PASSok      foo 12.692s

失败输出Demo:

    Failing input written to testdata/fuzz/FuzzFoo/a878c3134fe0404d44eb1e662e5d8d4a24beb05c3d68354903670ff65513ff49    To re-run:    go test -run=FuzzFoo/a878c3134fe0404d44eb1e662e5d8d4a24beb05c3d68354903670ff65513ff49FAILexit status 1FAIL    foo 0.839s

73470Go 1.18 新特性:模糊测试

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

文章评论