10 个版本
0.2.0-rc.1 | 2023年6月30日 |
---|---|
0.2.0-dev.3 | 2023年6月10日 |
0.1.1 |
|
0.1.0-dev.1 | 2021年5月18日 |
#361 in 测试
2,533 个月下载量
在 13 个 Crates 中使用(6 个直接使用)
66KB
1.5K SLoC
contrafact-rs
一种高度可组合的约束("事实")特质,可用于验证数据和在这些约束内生成任意数据
待办事项
- 将 Arbitrary 作为功能,通用数据生成
- 添加 lens-rs 支持
lib.rs
:
一种高度可组合的约束("事实")特质,可用于验证数据和在这些约束内生成任意数据满足这些约束。
此 crate 主要用于编写测试,特别是用于生成有意义的测试数据。通过定义可组合、可重用的约束,可以将它们混合匹配以处理测试的具体用例。通过定义对测试数据的需要,而不是简单地编写所需的数据,希望随着时间的推移节省重复的工作。
示例
以下示例定义了一个简单的结构体 S
,其中包含两个字段,以及一个关于 S
的简单事实(约束),说明 S::
必须始终等于 1
。这个事实,像所有事实一样,可以用来验证 S
的实例是否满足约束,也可以用来生成满足约束的新 S
实例。
use contrafact::{Fact, facts::{eq, lens1}};
use arbitrary::{Arbitrary, Unstructured};
#[derive(Debug, Clone, PartialEq, Arbitrary)]
struct S {
x: u32,
y: u32,
}
let mut fact = lens1("S::x", |s: &mut S| &mut s.x, eq(1));
assert!(fact.clone().check(&S {x: 1, y: 333}).is_ok());
assert!(fact.clone().check(&S {x: 2, y: 333}).is_err());
// NB: don't actually construct a Generator this way! See the docs for [[`Generator`]].
let mut g = contrafact::utils::random_generator();
let a = fact.build(&mut g);
assert_eq!(a.x, 1);
注意事项
上述示例组合了此 crate 提供的现有事实。您也可以通过实现 Fact
特质手动定义自己的事实。 待办事项:示例。
contrafact
严重依赖 arbitrary
crate 生成任意数据。了解这个库,因为您需要为任何您想编写 Fact
的类型实现 Arbitrary
。
可以通过 [Fact::check()
] 或 check_seq
来使用事实来检查约束是否匹配,也可以通过 Fact::build
和 build_seq
来构建新的值。构建值需要使用 arbitrary::Unstructured
。
事实也可以是状态化的,这样在检查或构建序列时约束会发生变化。TODO: 状态化事实的示例。
可以通过 facts!
宏轻松地将事实“水平”组合在一起,该宏将每个事实装箱并将它们作为特例对象一起打包,逐个应用每个事实。
可以通过 lens
和 prism
组合子将事实“垂直”组合在一起,这些组合子允许您将一个类型的事实提升为另一个类型的事实。
有关此包中定义的每个事实的更多示例和详细说明,请参阅函数文档。
依赖项
~1.5–2.4MB
~47K SLoC