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测试 分类中

Download history 5210/week @ 2024-05-03 3842/week @ 2024-05-10 5242/week @ 2024-05-17 6880/week @ 2024-05-24 6867/week @ 2024-05-31 9461/week @ 2024-06-07 6809/week @ 2024-06-14 7058/week @ 2024-06-21 5223/week @ 2024-06-28 10353/week @ 2024-07-05 8785/week @ 2024-07-12 10099/week @ 2024-07-19 6029/week @ 2024-07-26 6408/week @ 2024-08-02 4665/week @ 2024-08-09 7341/week @ 2024-08-16

25,343 每月下载量
用于 32 个 crate (6 个直接使用)

MIT 许可证

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();

使用 mapand_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()

相关工作

任意

虽然 bolerorust_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