2 个版本
0.1.1 | 2024年2月1日 |
---|---|
0.1.0 | 2024年2月1日 |
#13 在 #hypothesis
在 2 个包中使用(通过 checkito)
3KB
checkito
一个简单的受 QuickCheck 启发的库,用于生成可缩小的随机数据,主要面向生成/属性/探索性测试。可以使用此库来证明在输入空间的一个暂代表样例中,程序具有某些属性。
Generate
特性在许多 Rust 的标准类型上实现,允许通过组合器(如元组、Any
、Map
、Flatten
等)生成任何随机复合数据。它旨在组合性,使用时应感觉像与Iterator
一起工作。Shrink
特性试图将生成的样本减小到其“较小”版本,同时保持其约束(例如,范围在10..100
内的usize
样本永远不会缩小到其范围之外)。对于数字,这意味着将样本移向 0,对于向量,这意味着移除无关项并缩小剩余项,等等。Prove
特性旨在表示待测试系统的理想属性。它主要用于Generate::check
或Checker::check
方法中,并且是证明失败触发了缩小过程。它为一些标准类型(如bool
和Result
)实现。
示例
use checkito::{check::Error, *};
struct Composite(String, f64);
fn main() {
// Parse this pattern as a [`Regex`] which implements the [`Generate`] trait. The '_' character is included in the regex
// to make the checks below fail (for illustration purposes).
let regex = regex!("[a-zA-Z0-9_]*");
// [`f64`] ranges implement the [`Generate`] trait.
let number = 10.0f64..;
// Combine the previous [`Generate`] implementations and map them to a custom `struct`.
let composite = (regex, number).map(|pair| Composite(pair.0, pair.1));
// Generate 1000 [`Composite`] values which are checked to be alphanumeric.
// [`Generate::check`] will fail when a '_' will appear in `value.0` and the shrinking process will begin.
let result: Result<_, _> = composite.check(1000, |value: &Composite| {
value.0.chars().all(|character| character.is_alphanumeric())
});
// `result` will be [`Err`] and will hold the original and shrunk values.
let error: Error<Composite, _> = result.unwrap_err();
let _original: &Composite = &error.original;
// The expected shrunk value is [`Composite("_", 10.0)`].
let _shrunk: &Option<Composite> = &error.shrunk;
// Alternatively, generated samples can be retrieved directly, bypassing shrinking.
for value in composite.samples(1000) {
// This assertion is almost guaranteed to fail because of '_'.
assert!(value.0.chars().all(|character| character.is_alphanumeric()));
}
}
替代方案
依赖
~1–1.8MB
~50K SLoC