#属性测试 #属性 #quickcheck #假设 #模糊测试

checkito

一个简单的quickcheck启发库,用于生成可增长/可缩减的随机数据,主要面向生成/属性/探索性测试

27个版本 (稳定)

1.5.1 2024年3月9日
1.4.2 2024年2月19日
1.3.9 2023年12月27日
1.3.8 2023年8月21日
0.1.4 2023年2月27日

#91 in 测试

Download history 3/week @ 2024-05-30 4/week @ 2024-06-06 6/week @ 2024-06-27 95/week @ 2024-07-04 9/week @ 2024-07-25

每月109次下载
scalp 中使用

MIT 许可证

115KB
3K SLoC

checkito

一个简单的QuickCheck启发库,用于生成可缩减的随机数据,主要面向生成/属性/探索性测试。人们可以使用这个库来证明对于其输入空间的一个尝试性代表性样本,某些属性对程序是成立的。


  • 为Rust的许多标准类型实现了的Generate特质允许通过组合器(如元组、AnyMapFlatten等)生成任何随机复合数据。它旨在实现可组合性,其使用方式应类似于使用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–3MB
~66K SLoC