0

在基于属性的测试设置中,例如 Haskell 对自定义数据结构的快速检查,您如何为关系的 n 元属性(例如传递性或对称性)生成测试数据?我认为,实现语言无关紧要。

这是一个使用rapidcheck的幼稚 C++ 示例(只是因为我现在手头有这个工具):

  rc::check("Double equality is symmetric.", [](double a, double b) {
     RC_ASSERT(!(a == b) || (b == a)); // a == b ==> b == a
  });

在这种幼稚的情况下,该工具不太可能生成许多前提 ( a == b) 实际成立的示例,因此您最终会在无意义的测试上浪费大量精力。对于像传递性这样的三元关系,情况会变得更糟。

是否有解决这些问题的通用技术?我是否需要生成相等的对(对于“等于”的一些建设性定义)?订单之类的东西呢?

4

1 回答 1

1

我为提高值冲突的可能性所做的是将值生成限制在更小的范围内,有时将其与更通用的生成器结合使用。

考虑以下改编自https://johanneslink.net/how-to-specify-it/#46-a-note-on-generation的生成器:

@Provide
Arbitrary<Integer> keys() {
    return Arbitraries.oneOf(
            Arbitraries.integers().between(-25, 25),
            Arbitraries.integers()
    );
}

生成将首先以相等的概率在任意整数和-25 到+25 之间的整数之间进行选择。因此,大约每 100 个值将是重复的。

在更困难的情况下,我什至可能有一个从一小组预定义值中选择的生成器。

更新:最新版本的 jqwik 允许以给定的概率显式生成重复项:https ://jqwik.net/docs/snapshot/user-guide.html#inject-duplicate-values 我不知道,不过,如果 QuickCheck或任何其他 PBT 库具有类似的功能。

于 2020-01-11T06:11:50.480 回答