如何在基于 属性 的测试中保证极端情况

How to guarantee corner cases in property based testing

最近,在阅读有关基于 属性 的测试的想法时,我感到非常兴奋。

但我有 1 个问题,我仍然无法在任何地方找到答案:

基于 属性 的测试如何确保每次都会测试极端情况?

更具体地说,假设我正在使用 ScalaCheck 来测试我的除法函数:

def divide(a: Int, b: Int): Int

由于测试用例是随机生成的,我如何确定ScalaCheck每次都会检查b = 0的情况?

特例往往是它们自己的属性。如果您尝试编写一个涵盖 b = any integer 的案例,那么您的所有属性都将在一个大而复杂的测试中结束。但是您可以将参数 space 拆分为多个块,例如:

  • b = 正整数
  • b = 负整数
  • b = 0

并分别检查。

一些 PBT 工具总是会在生成随机案例之前注入极端案例。

例如,jqwik(对于 Java)会在任何随机值之前尝试 0、1、-1、Integer.MIN…VALUE 和 Integer.MAX…VALUE。