如何从QuickCheck中获得好(小)缩小?

时间:2012-01-09 12:37:04

标签: haskell quickcheck

我正在尝试在某些嵌套列表上运行QuickCheck,看起来像这样:

type Constraint = Text
data Value = Value [Constraint]
data Literal = Literal Value [Value]
type Formula = [Literal]

所以公式是一个文字列表,每个文字都包含一个谓词和一些参数;谓词/参数是每个字符串形式的约束分离的值。这给了我们一份列表清单列表,p!

如果我的某个QuickCheck属性失败,我倾向于得到一个难以理解的页面输出。在尝试收缩之前,我曾经通过使用只能生成一小组(小)值的任意实例来解决这个问题。为我的每个类型实现收缩功能似乎有点帮助,但没有我想要的那么多。我仍然得到了一大堆的输出。

我认为我想要收缩的是一个小文字列表,其中每个文字都有一个小的值列表,而这些值又有很少的约束,每个约束都尽可能短。但在我目前的努力中,至少这些列表变得足够大,使输出变得可怕。如果我尝试调整缩小实现,我也发现QC开始花费很长时间(寻找收缩?),这会削弱我有效收缩的努力。

当你有这样的嵌套数据时,如何提高理解QuickCheck失败的几率?

2 个答案:

答案 0 :(得分:3)

FWIW,请查看https://github.com/leepike/SmartCheck,声称可以获得比人们通常手动更好的收缩。

答案 1 :(得分:1)

我遇到了类似的问题,但我使用的是C和自制的示例生成器:)我的速度很慢,而且执行速度快且不正确。

使用随机示例,当您找到不正确的示例时,我建议缩小示例本身。 (当然,这可以或应该由程序而不是计算机来完成)

如果您有此测试的谓词,并且您的示例不起作用,请尝试删除所有订单中的元素表单列表(这应该是调用的线性数量级),并且如果测试失败则尝试每次尝试。

如果仍然失败,则没有理由将此保留在示例中。

如果它开始传递,那么这个元素应该保留在缩减的例子中。

(这是贪婪的,不是最优的,但它确实在poly中执行,而不是指数时间,并且它对我有用)

为了更科学地看,我建议A.Zeller的书"WHY PROGRAMS FAIL: A Guide to Systematic Debugging"中的“简化问题”一章。

注意:这主要是收缩所做的......