[英]Fuzzing for boolean checks?
我有一个 function 检查字符串是否是十六进制数的有效表示('0xdEAdBEef' 和那种字符串。)现在我检查 isHexaString(string) 返回一个布尔值,当它不是时返回一个错误。 但是用一堆种子运行 go -fuzz=Fuzz 并且他们检查错误,我没有得到任何有意义的东西(没有恐慌)。 这是否意味着我的代码 ( isHexaString
) 没问题?
func FuzzIsHexAddress(f *testing.F) {
testcases := []string{
"0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed",
"5aaeb6053f3e94c9b9a09f33669435e7ef1beaed",
"0X5aaeb6053f3e94c9b9a09f33669435e7ef1beaed",
"0XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
}
for _, tc := range testcases {
f.Add(tc) // Use f.Add to provide a seed corpus
}
f.Fuzz(func(t *testing.T, orig string) {
if result := isHexaString(orig); !result {
t.Errorf("IsHexAddress(%s) == %v",
orig, result)
}
})
}
对此类单元测试进行模糊测试的最佳方法是什么?
哦,在一个 package 上运行只会触发要运行的整个单元测试(必须是 Go 的行为才能首先运行单元测试?)
我不认为这个模糊测试是正确的。 此条件result:= isHexaString(orig); !result
当orig
不是有效的十六进制字符串时, result:= isHexaString(orig); !result
的计算结果为 true。 所以你基本上是在说“当输入字符串不是十六进制字符串时失败”。 但是为什么测试会失败呢? 如果orig
确实不是十六进制字符串,则您的 function 产生了正确的结果: false
。
关键是你无法控制模糊输入(它是模糊的),因此你不应该单独依赖被测 function 的 output 来确定通过或失败。
fuzz 教程建议以字符串反转 function 为例:
rev := Reverse(orig)
doubleRev := Reverse(rev)
if orig != doubleRev {
t.Errorf("Before: %q, after: %q", orig, doubleRev)
}
在这种特殊情况下, Reverse
应该是一个involution ,即它自己的反面。 您的 function isHexaString
不是对合,它甚至没有逆(它只是满射)但您可以根据黄金标准检查其 output,例如其他一些 function 已知始终正确识别有效的十六进制字符串。
或者,您可以继续使用条件result:= isHexaString(orig); !result
result:= isHexaString(orig); !result
找到有趣的不是十六进制字符串的边缘情况,并将它们包含到您的非模糊单元测试中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.