如何通过基于属性的测试生成有意义的示例来测试n元属性?

在基于属性的测试设置(例如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)实际存在的情况下生成许多示例,因此您最终在无意义的测试上浪费了很多精力。对于象传递性这样的三元关系,情况甚至更糟。

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

hexar 回答:如何通过基于属性的测试生成有意义的示例来测试n元属性?

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

考虑以下根据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库是否具有类似的功能。

本文链接:https://www.f2er.com/2792462.html

大家都在问