1 个不稳定版本
0.1.0 | 2022年8月9日 |
---|
#591 in 测试
11,479 每月下载
在 8 crates 中使用
10KB
86 行
proptest-arbitrary-interop
此crate提供必要的粘合剂,以重用arbitrary::Arbitrary
的实现作为proptest::strategy::Strategy
。
用法
在 Cargo.toml
[dependencies]
arbitrary = "1.1.3"
proptest = "1.0.0"
在您的代码中
// Part 1: suppose you implement Arbitrary for one of your types
// because you want to fuzz it.
use arbitrary::{Arbitrary, Result, Unstructured};
#[derive(Copy, Clone, Debug)]
pub struct Rgb {
pub r: u8,
pub g: u8,
pub b: u8,
}
impl<'a> Arbitrary<'a> for Rgb {
fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
let r = u8::arbitrary(u)?;
let g = u8::arbitrary(u)?;
let b = u8::arbitrary(u)?;
Ok(Rgb { r, g, b })
}
}
// Part 2: suppose you later decide that in addition to fuzzing
// you want to use that Arbitrary impl, but with proptest.
use proptest::prelude::*;
use proptest_arbitrary_interop::arb;
proptest! {
#[test]
#[should_panic]
fn always_red(color in arb::<Rgb>()) {
prop_assert!(color.g == 0 || color.r > color.g);
}
}
注意事项
它只与实现了arbitrary::Arbitrary
的特定类型的类型一起工作:那些符合ArbInterop
要求的类型。这些类型大致是“当随机生成时,不会保留指向由arbitrary::Unstructured
生成的随机数据缓冲区中的指针的类型”。许多arbitrary::Arbitrary
实现都将符合条件,但某些类型的“零拷贝”实现将不起作用。这个要求似乎是proptest
语义模型的一个必要部分--生成的值必须拥有自己的指针图,没有借用。如果您能想出一种不需要这种方式的方法,欢迎提交补丁。
本软件包基于Mazdak Farrokhzad的proptest-quickcheck-interop
,没有这项工作,我就不知道如何着手。对于ArbInterop
类型的精确类型签名要归功于Jim Blandy,我正式授予他“Rust谜题之王”的称号。我在过程中引入的错误当然都是我自己的。
许可证:MIT OR Apache-2.0
依赖项
~2MB
~42K SLoC