#属性测试 #属性 #快速检查 #模糊测试 #假设

checkito_macro

一组宏,用于配合 checkito

2 个版本

0.1.1 2024年2月1日
0.1.0 2024年2月1日

#13#hypothesis


2 个包中使用(通过 checkito

MIT 许可证

3KB

checkito

一个简单的受 QuickCheck 启发的库,用于生成可缩小的随机数据,主要面向生成/属性/探索性测试。可以使用此库来证明在输入空间的一个暂代表样例中,程序具有某些属性。


  • Generate 特性在许多 Rust 的标准类型上实现,允许通过组合器(如元组、AnyMapFlatten 等)生成任何随机复合数据。它旨在组合性,使用时应感觉像与 Iterator 一起工作。
  • Shrink 特性试图将生成的样本减小到其“较小”版本,同时保持其约束(例如,范围在 10..100 内的 usize 样本永远不会缩小到其范围之外)。对于数字,这意味着将样本移向 0,对于向量,这意味着移除无关项并缩小剩余项,等等。
  • Prove 特性旨在表示待测试系统的理想属性。它主要用于 Generate::checkChecker::check 方法中,并且是证明失败触发了缩小过程。它为一些标准类型(如 boolResult)实现。

示例

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