从任意的非结构化输入生成结构化数据。
cargo-fuzz 或 AFL 等生成器结合使用,并帮助将它们生成的原始、未类型化的字节缓冲区转换为具有类型、有效且结构化的值。这使您能够将结构感知的测试用例生成与基于突变的覆盖率导向生成器相结合。假设您正在编写一个颜色转换库,并且您有一个 Rgb 结构来表示 RGB 颜色。您可能希望为 Rgb 实现 Arbitrary,这样在测试函数中就可以使用任意的 Rgb 实例来断言某些属性(例如,断言 RGB 转换为 HSL,然后再转换回 RGB 总是始终保持原始状态)。
// rgb.rs
use arbitrary::Arbitrary;
#[derive(Arbitrary)]
pub struct Rgb {
pub r: u8,
pub g: u8,
pub b: u8,
}如果您的结构使用未实现 Arbitrary 的类型,或者您希望针对特定字段进行更多自定义,这将特别方便。
…Arbitrary或者,您可以手动编写 Arbitrary 实现:
// rgb.rs
使用 arbitrary::{Arbitrary, Result, Unstructured};
#[derive(Copy, Clone, Debug)]
pub struct Rgb {
pub r: u8,
pub g: u8,
pub b: u8,
}
impl Arbitrary for Rgb {
fn arbitrary(u: &mut Unstructured) -> Result {
let r = u8::arbitrary(u)?;
let g = u8::arbitrary(u)?;
let b = u8::arbitrary(u)?;
Ok(Rgb {r, g, b})
}
}
`
[**Read the API documentation on `docs.rs`!**](https://docs.rs/arbitrary)
[dependencies]暂无开放 Issues,或尚未同步最近议题。