#属性测试 #模糊测试 #属性 #模糊 #任意 #propcheck

dev proptest-arbitrary-interop

任意和proptest crate之间的互操作粘合剂

1 个不稳定版本

0.1.0 2022年8月9日

#591 in 测试

Download history 410/week @ 2024-03-28 821/week @ 2024-04-04 878/week @ 2024-04-11 960/week @ 2024-04-18 873/week @ 2024-04-25 855/week @ 2024-05-02 342/week @ 2024-05-09 638/week @ 2024-05-16 678/week @ 2024-05-23 729/week @ 2024-05-30 533/week @ 2024-06-06 415/week @ 2024-06-13 2590/week @ 2024-06-20 2849/week @ 2024-06-27 2680/week @ 2024-07-04 3268/week @ 2024-07-11

11,479 每月下载
8 crates 中使用

MIT/Apache

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