【问题标题】:How to generate meaningful examples to test n-ary properties with property-based testing?如何生成有意义的示例以使用基于属性的测试来测试 n 元属性?
【发布时间】:2020-04-27 21:12:12
【问题描述】:

在基于属性的测试设置中,例如 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) 实际成立的示例,因此您最终会在无意义的测试上浪费大量精力。对于传递性等三元关系,情况会变得更糟。

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

【问题讨论】:

    标签: unit-testing testing quickcheck property-based-testing


    【解决方案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-03-06
      • 2022-01-16
      • 2016-03-01
      • 1970-01-01
      • 2011-08-27
      • 2016-06-22
      • 2020-01-08
      • 2014-09-13
      • 2021-05-03
      相关资源
      最近更新 更多