20 个版本 (10 个破坏性更新)
0.11.1 | 2024年6月20日 |
---|---|
0.10.2 | 2024年3月4日 |
0.10.1 | 2023年12月23日 |
0.10.0 | 2023年9月28日 |
0.2.0 | 2019年10月16日 |
300 在 测试 分类中
25,343 每月下载量
用于 32 个 crate (6 个直接使用)
135KB
3.5K SLoC
bolero-generator
测试和模糊测试的值生成器
安装
bolero-generator
位于 crates.io
并可以像这样添加到项目中
$ cargo add --dev bolero-generator
使用方法
简单类型生成器
use bolero_generator::{gen, driver::FuzzDriver, ValueGenerator};
let input = &[1, 2, 3, 4, 5];
let driver = FuzzDriver::new(&input);
let value = gen::<u8>().generate(&mut driver).unwrap();
参数化值生成器
use bolero_generator::{gen, driver::FuzzDriver, ValueGenerator};
let input = &[1, 2, 3, 4, 5];
let driver = FuzzDriver::new(&input);
let value = gen::<u8>().with().bounds(5..=42).generate(&mut driver).unwrap();
嵌套参数化值生成器
use bolero_generator::{gen, driver::FuzzDriver, ValueGenerator};
let input = &[1, 2, 3, 4, 5];
let driver = FuzzDriver::new(&input);
let value = (
gen::<u8>(),
gen::<u8>()
.with()
.bounds(5..=42), // between 5 and including 42
gen::<Vec<u32>>()
.with()
.len(6usize) // always have 6 values
.values(7..500), // between 7 and 500
).generate(&mut driver).unwrap();
使用 map
和 and_then
修改值
use bolero_generator::{gen, driver::FuzzDriver, ValueGenerator};
let input = &[1, 2, 3, 4, 5];
let driver = FuzzDriver::new(&input);
let value = gen::<u8>()
.map(|value| value / 2)
.and_then(|value| gen::<Vec<u8>>().with().len(value as usize))
.generate(&mut driver)
.unwrap()
相关工作
任意
虽然 bolero
从 rust_arbitrary
crate 中汲取了很多灵感,但增加了一些改进
参数化生成
arbitrary
支持在给定类型的情况下进行基本值生成
let driver = RingBuffer::new(input, 20).unwrap();
let value: u8 = Arbitrary::arbitrary(&mut driver).unwrap();
当需要对类型应用约束时,这可能有限制
let driver = RingBuffer::new(input, 20).unwrap();
let value: u8 = Arbitrary::arbitrary(&mut driver).unwrap();
// make sure `value` in between 8 and 20
let value = (value % (20 - 8)) + 8;
同样的问题也出现在容器大小被限制在 0-255 的情况中
let driver = RingBuffer::new(input, 20).unwrap();
let mut value: Vec<u8> = Arbitrary::arbitrary(&mut driver).unwrap();
// make sure `value` has at least 3 items
while value.len() < 3 {
value.push(Arbitrary::arbitrary(&mut driver).unwrap());
}
// make sure `value` has no more than 42 items
while value.len() > 42 {
value.pop();
}
bolero
支持在给定类型的情况下进行值生成
let driver = FuzzDriver::new(&[1, 2, 3, 4, 5]);
let value = gen::<u8>().generate(&mut driver).unwrap();
可以通过调用 with()
来创建参数化生成器
let driver = FuzzDriver::new(&[1, 2, 3, 4, 5]);
let value = gen::<u8>().with().bounds(8..=20).generate(&mut driver).unwrap();
还可以指定容器大小
let driver = FuzzDriver::new(&[1, 2, 3, 4, 5]);
let value = gen::<Vec<u8>>().with().len(3usize..=42).generate(&mut driver).unwrap();
#![no_std]
兼容性
bolero
支持需要 #![no_std]
的环境
依赖项
~3.5MB
~77K SLoC