#proptest #attributes #macro #procedural #testing #attr #u32

macro proptest-attr-macro

用于编写proptest测试的进程属性宏

3个版本 (1个稳定版)

1.0.0 2020年10月27日
0.1.0 2019年7月21日

#574 in 进程宏

Download history 188/week @ 2024-03-11 138/week @ 2024-03-18 100/week @ 2024-03-25 140/week @ 2024-04-01 147/week @ 2024-04-08 125/week @ 2024-04-15 205/week @ 2024-04-22 181/week @ 2024-04-29 160/week @ 2024-05-06 136/week @ 2024-05-13 108/week @ 2024-05-20 125/week @ 2024-05-27 174/week @ 2024-06-03 119/week @ 2024-06-10 69/week @ 2024-06-17 101/week @ 2024-06-24

每月471次下载
用于 5 个crate(4个直接使用)

Apache-2.0

11KB
100 代码行

此crate提供了proptestproptest!宏的进程属性宏版本。

因此,您不必编写

use proptest::proptest;

proptest! {
    fn test_excluded_middle(x: u32, y: u32) {
        assert!(x == y || x != y);
    }
}

您可以编写

use proptest_attr_macro::proptest;

#[proptest]
fn test_excluded_middle(x: u32, y: u32) {
    assert!(x == y || x != y);
}

限制

进程属性宏只能与有效的Rust语法一起使用,这意味着您不能使用proptest的in运算符(允许您从特定的策略函数中获取值)

// This won't compile!
#[proptest]
fn test_even_numbers(x in even(any::<u32>())) {
    assert!((x % 2) == 0);
}

相反,您必须提供一个实际的参数列表,就像您在真实的Rust函数定义中做的那样。这反过来又意味着您的函数参数只能使用它们的类型的any策略来获取值。如果您想使用自定义策略,您必须创建一个单独命名的类型,并且让新类型的Arbitrary实现使用该策略

struct Even { value: i32 }

impl Arbitrary for Even {
    type Parameters = ();
    type Strategy = BoxedStrategy<Even>;

    fn arbitrary_with(_args: ()) -> Self::Strategy {
        (0..100).prop_map(|x| Even { value: x * 2 }).boxed()
    }
}

#[proptest]
fn test_even_numbers(even: Even) {
    assert!((even.value % 2) == 0);
}

优点

主要的一个是纯粹的美观:因为您正在将proptest属性宏应用于有效的Rust函数,所以rustfmt可以在它们上工作!

依赖

~1.5MB
~35K SLoC