32

我正在尝试在一些嵌套列表上运行 QuickCheck,如下所示:

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

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

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

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

当您有这样的嵌套数据时,您如何提高理解 QuickCheck 失败的机会?

4

2 回答 2

3

FWIW,看看https://github.com/leepike/SmartCheck,它声称比通常手动执行的收缩效果更好。

于 2012-08-07T20:34:29.807 回答
1

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

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

如果您有此测试的谓词,并且您的示例不起作用,请尝试从列表中删除所有顺序的元素(这应该是调用的线性数量级)以及每次尝试如果它未通过测试。

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

如果它开始通过,则该元素应保留在简化示例中。

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

为了更科学的外观,我建议A.Zeller的“为什么程序失败:系统调试指南”一书中的“简化问题”一章。

注意:这主要是收缩的作用......

于 2012-01-24T09:03:03.237 回答