← 中文资源

简体中文版本

用属性测试对 JSON 解析器做模糊测试

生成随机与对抗性输入,断言 JSON 处理永不崩溃,且对合法文档始终可往返。

阅读英文原文

目标

自定义解析器在深层嵌套或异常输入下崩溃,而单元测试从未生成这类输入。本配方用属性测试库对合法值断言序列化再解析后完全相等,对随机字符串断言遇到畸形输入会抛出受控错误而非导致进程崩溃;提醒收缩出的反例应固化为回归用例。

步骤要点

  1. 对随机合法值断言往返相等。
  2. 对随机字符串断言畸形输入抛受控错误。
  3. 把收缩出的反例固化为回归用例。
  4. 约束生成器到真实输入空间以发现有效 bug。
fc.assert(fc.property(fc.jsonValue(), (value) => {
  expect(parse(serialize(value))).toEqual(value);
}));

排错提示

  • 收缩结果可能难懂,需固化为用例。
  • 生成器过宽会浪费时间。
  • 属性测试是随机探索而非穷举。

适用边界

  • 发现的缺陷需固化成回归。
  • 属性过慢会拖长 CI。