登录
首页 >  Golang >  Go问答

模糊测试布尔检查

来源:stackoverflow

时间:2024-02-15 08:09:22 501浏览 收藏

本篇文章向大家介绍《模糊测试布尔检查》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

我有一个函数可以检查字符串是否是十六进制数的有效表示(“0xdeadbeef”和此类字符串)。现在我可以检查 ishexastring(string),它返回一个 bool,当它为 false 时,该 bool 为 false。不是。但是用一堆种子运行 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)
        }
    })
}

模糊测试此类单元测试的最佳方法是什么?

哦,在一个包上运行只会触发运行整个单元测试(一定是 go 想要首先运行单元测试的行为?)


正确答案


我认为这个模糊测试不正确。这个条件 result := ishexastring(orig);当 orig 不是有效的十六进制字符串时,!result 计算结果为 true。所以你基本上是在说“当输入字符串不是十六进制字符串时失败”。但为什么测试会失败呢?如果 orig 确实不是十六进制字符串,则您的函数会产生正确的结果:false

重点是您无法控制模糊输入(它是模糊的!),因此您不应单独依赖被测试函数的输出来确定通过或失败.

fuzz tutorial 建议了字符串反转函数的示例:

rev := Reverse(orig)
doubleRev := Reverse(rev)
if orig != doubleRev {
    t.Errorf("Before: %q, after: %q", orig, doubleRev)
}

在这种特殊情况下,reverse 应该是 involution,即其自身的反转。您的函数 ishexastring 不是对合,它甚至没有逆(它只是满射),但您可以根据黄金标准检查其输出,例如已知一些其他函数始终可以正确识别有效的十六进制字符串。

或者,您可以继续使用条件 result := ishexastring(orig); !result 查找非十六进制字符串的有趣边缘情况,并将其包含到您的非模糊单元测试中。

今天关于《模糊测试布尔检查》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>