Golang模糊测试(Fuzz Testing)实战指南:Packagemain第23期

Golang模糊测试(Fuzz Testing)实战指南:Packagemain第23期 模糊测试(Fuzzing)是一种向程序提供随机、意外输入的方法,用以测试可能的崩溃或边界情况。模糊测试可以揭示一些逻辑错误或性能问题,因此在稳定性和性能至关重要的代码中,添加模糊测试总是值得的。本视频我们将回顾 Go 1.18 中最新添加的模糊测试支持。

packagemain #23: Fuzz Testing in Go


更多关于Golang模糊测试(Fuzz Testing)实战指南:Packagemain第23期的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang模糊测试(Fuzz Testing)实战指南:Packagemain第23期的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go 1.18 引入的模糊测试功能确实是一个重要的增强,它让开发者能够更轻松地发现代码中的边界情况和潜在错误。以下是一个简单的模糊测试示例,展示了如何为字符串反转函数编写模糊测试:

package main

import (
    "testing"
    "unicode/utf8"
)

func Reverse(s string) string {
    b := []byte(s)
    for i, j := 0, len(b)-1; i < len(b)/2; i, j = i+1, j-1 {
        b[i], b[j] = b[j], b[i]
    }
    return string(b)
}

func FuzzReverse(f *testing.F) {
    testcases := []string{"Hello, world", " ", "!12345"}
    for _, tc := range testcases {
        f.Add(tc)
    }
    
    f.Fuzz(func(t *testing.T, orig string) {
        rev := Reverse(orig)
        doubleRev := Reverse(rev)
        
        if orig != doubleRev {
            t.Errorf("Before: %q, after: %q", orig, doubleRev)
        }
        
        if utf8.ValidString(orig) && !utf8.ValidString(rev) {
            t.Errorf("Reverse produced invalid UTF-8 string %q", rev)
        }
    })
}

这个模糊测试会随机生成字符串输入,测试反转函数是否满足以下条件:

  1. 双重反转后应该得到原始字符串
  2. 反转后的字符串应该是有效的UTF-8编码

运行模糊测试:

go test -fuzz=Fuzz

模糊测试会自动生成测试用例,当发现失败时会保存导致失败的输入到testdata/fuzz/目录中,方便后续调试和修复。

对于更复杂的场景,可以结合种子语料库和自定义的变异策略:

func FuzzComplex(f *testing.F) {
    // 添加种子语料库
    f.Add([]byte{1, 2, 3})
    f.Add([]byte{255, 0, 128})
    
    f.Fuzz(func(t *testing.T, data []byte) {
        // 测试处理二进制数据的函数
        if len(data) > 1000 {
            t.Skip() // 跳过过大的输入
        }
        
        result := ProcessData(data)
        if result == nil {
            t.Error("ProcessData returned nil for valid input")
        }
    })
}

模糊测试特别适合测试解析器、编解码器、验证函数等处理外部输入的代码。通过持续运行模糊测试,可以显著提高代码的健壮性。

回到顶部