Go1.18 模糊测试分析

290 阅读2分钟

Go1.18 模糊测试分析

模糊测试是什么?

通过指定的规则, 使用模糊参数变异作为输入去测试模糊目标在各种边界条件下的状况的一种测试方式。

按我的理解, 就是一种有限自动测试的方法, 可以一定程度上自动的检查被测函数的边界条件下的鲁棒性问题。

几个关键词

模糊目标 测试种子语料库 模糊参数

关键词含义不做多余说明, 有疑问阅读:术语说明

模糊测试规则

  • 函数命名: FuzzXxxx

  • 函数入参:有且仅有 *testing.F

  • 参数出参:无

  • 测试文件命名: *_test.go (和原来的测试文件命名一样)

  • 模糊测试函数体的规则,通过一个例子讲解更易理解

  • 模糊参数只能是如下类型:


string, []byte

int, int8, int16, int32/rune, int64

uint, uint8/byte, uint16, uint32, uint64

float32, float64

bool

例子

example.png

例子分析

  • 首先例子遵循模糊测试规则, 函数名是以Fuzz开头

  • 测试函数入参只有 *testing.F, 没有出参

  • f.Add 是指定自定义种子语料库, 需要和 f.Fuzz(func(*testing.T, []byte, int64) {}) 中的 func(*testing.T, []byte, int64) 除 *testing.T 之外的参数顺序和类型保持一致。

  • 必须有一个被测试对象, 即函数体中的 Foo 函数

  • 被测试函数 Foo 使用了除 *testing.T 之外的参数

  • 具体的测试过程定义在 Fuzz 函数中

相关命令

  • 全局测试: go test

  • 指定模糊测试: go test -fuzz={FuzzTestName}

  • 模糊测试, 可以指定一些参数

  • -fuzztime: 执行模糊测试的超时时间或迭代次数, 默认无限制

  • -fuzzminimizetime: 在每次最小化尝试中,模糊目标将被执行的时间或迭代次数,默认为 60 秒。你可以通过 -fuzzminimizetime 0 完全禁用最小化设置

  • -parallel: 同时运行的模糊处理进程的数量,默认为$GOMAXPROCS。目前,在模糊摸索过程中设置 -cpu 没有作用

  • 命令行指定语料库编码版本和自定义语料库模糊参数:

  • 第一行是指定语料库编码版本

  • 后面几行是输入自定义语料库模糊参数


go test fuzz v1

[]byte("hello\\xbd\\xb2=\\xbc ⌘")

int64(572293)