#sample #data #strategies #sampling #machinery #counterexamples

dev sample-test

测试任意数据的抽样策略和机制

4 个版本

0.2.1 2024年3月1日
0.2.0 2024年3月1日
0.1.1 2023年6月26日
0.1.0 2023年6月26日

101测试 分类中

Download history 1043/week @ 2024-04-13 858/week @ 2024-04-20 850/week @ 2024-04-27 822/week @ 2024-05-04 769/week @ 2024-05-11 756/week @ 2024-05-18 666/week @ 2024-05-25 965/week @ 2024-06-01 1387/week @ 2024-06-08 1330/week @ 2024-06-15 1450/week @ 2024-06-22 2294/week @ 2024-06-29 1442/week @ 2024-07-06 1784/week @ 2024-07-13 1948/week @ 2024-07-20 1828/week @ 2024-07-27

7,210 每月下载量
6 个 crate 中使用

Apache-2.0

20KB
350 代码行

sample-test: 样本测试工具

创建测试以对任意数据进行抽样,以生成给定命题的反例

use sample_std::VecSampler;
use sample_test::{sample_test, TestResult};

#[sample_test]
fn age_range(#[sample(VecSampler { el: 1..25, length: 0..50 })] ages: Vec<u8>) -> TestResult {
    if ages.iter().all(|a| *a < 5) {
        TestResult::discard()
    } else {
        TestResult::from_bool(ages.iter().all(|a| *a < 25))
    }
}

前期工作

这个库受到了 quickcheckproptest 的极大启发。

以下是不同之处

  • quickcheck 在类型级别工作,因此创建新的抽样策略需要全新的类型。对于复杂类型和多种不同的抽样策略,这会变得非常冗长。
  • proptest 使用宏来创建策略,并创建一个种子值树来缩小数据。对于递归数据,这个树可以变得非常大,而且宏难以处理。

这个库试图取二者之长。它允许用户定义 Sample 策略,这些策略被输入到测试中。与 quickcheck 一样,缩小操作直接在生成的值上操作。这避免了使用 proptest 所使用的种子树的需要,并允许这个库扩展到更大的生成数据大小。

这个库及其下游用户大量依赖 Sample 组合子,而不是宏。这受到 Iterator 组合的启发,它既高效又简洁,而且无需任何宏。

权衡是

  • sample-testquickcheck 略微复杂,但定义抽样策略更容易。
  • sample-test 在缩小方面不如 proptest,因为它不记录用于生成给定输出的种子值。

依赖项

~6MB
~120K SLoC