3个版本 (1个稳定版)
1.0.0 | 2020年10月27日 |
---|---|
0.1.0 | 2019年7月21日 |
#574 in 进程宏
每月471次下载
用于 5 个crate(4个直接使用)
11KB
100 代码行
此crate提供了proptest的proptest!
宏的进程属性宏版本。
因此,您不必编写
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