#json-schema #fuzz-testing #data #generate #typedef #string #aka

bin+lib jtd-fuzz

从 JSON 类型定义模式生成示例数据

5 个版本

0.2.0 2021年2月4日
0.1.21 2020年12月6日
0.1.20 2020年12月6日
0.1.19 2020年11月28日
0.1.0 2020年4月26日

#480测试

每月 28 次下载

MIT 许可证

37KB
513

jtd-fuzz Crates.io Docs.rs

jtd-fuzz 从 JSON 类型定义模式生成示例数据 (也称为 "fuzz 测试")

echo '{ "elements": { "type": "string" }}' | jtd-fuzz -n 5
["_","/+Z`","8o~5[7A"]
[]
["@(;","*+!YVz"]
["u4sv>Sp","Uc","o`"]
["","G","*ZJsc","","","\"RT,","l>l"]

安装

在 macOS 上,您可以通过 Homebrew 安装 jtd-fuzz

brew install jsontypedef/jsontypedef/jtd-fuzz

对于所有其他平台,您可以从 最新版本 下载并解压二进制文件。您也可以通过运行 cargo 来安装。

cargo install jtd_fuzz

用法

基本用法

要调用 jtd-fuzz,您可以选择以下方式之一:

  1. 让它从 STDIN 读取。这是默认行为。
  2. 让它从文件读取。为此,将文件名作为 jtd-fuzz 的最后一个参数传递。

jtd-fuzz 读取单个 JSON 类型定义模式,并将默认输出无限流示例。例如,这将输出无限序列的随机 JSON 数据

echo '{}' | jtd-fuzz

如果您想让 jtd-fuzz 输出确切数量的结果,请使用 -n

echo '{}' | jtd-fuzz -n 5

或者,要让 jtd-fuzz 从文件读取

echo '{ "type": "timestamp" }' > foo.jtd.json

jtd-fuzz -n 5 foo.jtd.json

使用 fuzzHint 生成电子邮件、姓名等

通常,对于 jtd-fuzz 生成特定类型的字符串是有用的,而不是默认情况下通过 {"type": "string"} 得到的通用无意义字符串。您可以使用 fuzzHint 元数据属性自定义 jtd-fuzz 的输出。例如,这个模式

{
  "metadata": {
    "fuzzHint": "en_us/internet/email"
  },
  "type": "string"
}

如果将其放入名为 example.jtd.json 的文件中,将生成如下数据

jtd-fuzz -n 5 example.jtd.json
"[email protected]"
"[email protected]"
"[email protected]"
"[email protected]"
"[email protected]"

fuzzHint 只会在 {"type": "string"} 的模式上工作。以下是 fuzzHint 常用的值

  • en_us/company/company_name 生成如 Hayes, Murray, and Kiehn 的字符串
  • en_us/internet/email 生成如 alainatorphy@johnson.com 的字符串
  • en_us/names/full_name 生成如 Alexa Wisozk 的字符串

有关 fuzzHint 可能的所有值的完整列表,请参阅 此处

高级用法:提供种子

默认情况下,jtd-fuzz 每次都会生成不同的输出

echo '{}' | jtd-fuzz -n 1 ; echo '{}' | jtd-fuzz -n 1
{"[jD|6W":null}
null

如果您想从 jtd-fuzz 获取一致的输出,或者能够重现其输出,您可以使用 -s 选项为其内部伪随机数生成器提供一个种子。对于相同的种子和模式,jtd-fuzz 每次都会输出相同的数据

echo '{}' | jtd-fuzz -n 1 -s 8927 ; echo '{}' | jtd-fuzz -n 1 -s 8927
48
48

-s 选项接受一个介于 0 和 2^64 - 1 之间的整数。

jtd-fuzz 提供种子如果使用 jtd-fuzz 对系统进行自动化测试时非常有用。您的自动化测试系统可以向 jtd-fuzz 传递随机生成的种子,如果自动化测试器发现一个种子可以揭示一个错误,它可以输出它使用的种子。这样,开发者就可以重新使用该种子,并尝试在本地重现问题。

请注意,只有当您使用相同的种子、模式和 jtd-fuzz 的版本时,jtd-fuzz 才能保证产生一致的输出。不同版本的 jtd-fuzz 可能会输出不同的结果,即使您给出了相同的种子和模式。

安全考虑

不要依赖 jtd-fuzz 作为密码学安全的随机数源。jtd-fuzz 意在用作示例数据生成器,例如用于模糊测试应用程序。它不是为了加密目的而设计的。

依赖项

~2.8–4MB
~70K SLoC