如何使用Golang fuzz生成随机字符串_测试文本处理函数
技术百科
P粉602998670
发布时间:2025-12-30
浏览: 次 Go 1.18 引入内置模糊测试,需定义 func(*testing.F) 测试函数并调用 f.Fuzz 传入接受基本类型的闭包;可过滤无效输入、添加 seed corpus 提升效率;失败时自动生成最小复现用例。
Go 1.18 引入了内置的模糊测试(fuzzing)支持,它能自动为函数生成大量随机输入,帮你发现边界情况和潜在 panic。对文本处理函数(比如字符串截取、正则匹配、编码转换等)特别有用——你不用手动构造奇怪的 Unicode 组合、超长字符串或含 NUL 字节的输入,fuzz 会替你“暴力试探”。
1. 基础:写一个可 fuzz 的测试函数
必须满足两个条件:函数签名是 func(*testing.F),且在函数内调用 f.Fuzz 并传入一个只接受基本类型(string, int, bool, []byte 等)的闭包。
例如,测试一个安全截取前 N 个字符的函数:
func TestTruncateFuzz(t *testing.T) {
f := testing.Fuzz(t)
f.Fuzz(func(t *testing.T, s string, n int) {
// 避免负数或过大 n 导致 panic,fuzz 会自动生成各种值
if n < 0 {
n = 0
}
if n > 1000 {
n = 1000
}
_ = Truncate(s, n) // 你的待测函数
})
}
2. 控制输入范围:过滤无效组合
fuzz 生成的 string 可能包含控制字符、代理对不完整 UTF-8、空字符串等。若你的函数对某些输入有明确前提(如“只处理非空 ASCII 字符串”),可在 fuzz 闭包开头加简单校验跳过:
- 用
if len(s) == 0 { t.Skip() }跳过空字符串 - 用
if !utf8.ValidString(s) { t.Skip() }过滤非法 UTF-8 - 用
if strings.Contains(s, "\x00") { t.Skip() }排除含 NUL 的字符串(适合 C 交互场景)
注意:不要在被测函数内部 panic 或返回错误来“防御”,fuzz 的目标就是暴露那些没处理好的 case。
3. 添加 seed corpus 提高效率
默认 fuzz 从纯随机开始,但你可以提供一些典型/边界样例(seed corpus),帮助引擎更快探索关键路径。在测试文件同目录下新建 fuzz/Truncate/corpus 文件夹,放入几个 .txt 文件:
-
empty.txt:内容为空 -
emoji.txt:内容为"Hello ? ??"(含 emoji 和 ZWJ 序列) -
long.txt:10000 个a拼接的字符串 -
surrogate.txt:包含不完整代理对的字节序列(可用[]byte{0xed, 0xa0, 0x80}写入)
运行时 Go 会自动加载这些样本作为 fuzz 起点。
4. 运行与调试失败案例
执行命令启动 fuzz:
go test -fuzz=FuzzTruncate -fuzztime=30s
如果触发 panic 或断言失败,Go 会自动保存复现该问题的最小输入到 test/fuzz/ 下(如
shers/0016a7...txt)。直接复制文件内容,就能在普通单元测试里复现并修复:
func TestTruncateCrashCase(t *testing.T) {
s := "" // 从 crasher 文件里复制的字符串
got := Truncate(s, 1)
// 断言期望行为
}
修复后重新跑 fuzz,确认不再崩溃。
不复杂但容易忽略:fuzz 不是替代单元测试,而是补充——它帮你找到你没想到的 case;而单元测试确保你明确设计的逻辑始终正确。
# ai
# 几个
# 帮你
# 能在
# 更快
# 自动生成
# 可在
# 跳过
# go
# golang
# String
# if
# int
# 编码
# 字节
# 字符串
# gate
# len
# ASCII
# 空字符串
# gate.
# 闭包
# 你没
# bool
# 单元测试
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- PHP主流架构如何处理会话管理_Session与C
- Windows10怎么查看系统激活状态_Windo
- Windows蓝屏错误0x00000023怎么修复
- c++如何使用std::bind绑定函数参数_c+
- 如何提升Golang JSON序列化性能_Gola
- Win11怎么关闭透明效果_Windows11辅助
- 如何在 Go 同包不同文件中正确引用结构体
- VSC怎么快速定位PHP错误行_错误追踪设置法【方
- Windows 11如何开启文件夹加密(EFS)_
- Windows10系统怎么查看CPU温度_Win1
- 如何使用Golang管理跨项目依赖_Golang多
- Win11怎么更改系统语言_Win11中文语言包下
- Win11时间不对怎么同步_Win11自动校准互联
- c++协程和线程的区别 c++异步编程模型对比【核
- Mac上的iMovie如何剪辑视频?(新手入门教程
- Win11怎么设置桌面图标间距_Windows11
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- Win11怎么清理C盘系统错误报告_Win11清理
- 如何在 Go 中可靠地测试含 time.Time
- MAC如何修改默认应用程序_MAC文件后缀关联设置
- Win11怎么关闭VBS安全性_Windows11
- Win11视频默认播放器怎么改_Win11关联第三
- Win11怎么关闭自动调节亮度 Win11禁用内容
- php怎么下载安装并配置环境变量_命令行调用PHP
- Win11怎么关闭自动维护 Win11禁用系统自动
- Linux怎么设置磁盘配额_Linux系统Quot
- PythonPandas数据分析教程_数据清洗与处
- Win11怎么开启远程桌面_Win11系统远程桌面
- Golang如何避免指针逃逸_Golang逃逸分析
- Go 中的 := 运算符:类型推导机制与使用边界详
- 如何在Golang中优化文件读写性能_使用缓冲和并
- php下载安装包怎么选_threadsafe与nt
- Python高性能计算项目教程_NumPyCyth
- php与c语言在嵌入式中有何区别_对比两者在硬件控
- php本地部署后session无法保存_sessi
- Win11如何更改用户账户文件夹名称 Win11修
- php怎么下载安装后测试是否成功_简单脚本验证方法
- Win10怎样清理C盘Steam游戏缓存_Win1
- Windows10如何查看保存的WiFi密码_Wi
- 如何在Golang中使用replace替换模块_指
- Golang如何实现基本的用户注册_Golang用
- 如何在 Windows 11 中使用 AlomWa
- Python对象比较与排序_集合使用说明【指导】
- Windows Defender扫描失败怎么办_安
- Windows10如何查看蓝屏日志_Win10使用
- 如何高效获取循环末次生成的 NumPy 数组最后一
- 如何使用Golang defer优化性能_减少不必
- Dapper的Execute方法的返回值是什么意思
- Python异步网络编程_aiohttp说明【指导
- C#如何序列化对象为XML XmlSerializ

QQ客服