繁体   English   中英

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

[英]How do I get good (small) shrinks out of QuickCheck?

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

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

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

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

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

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

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

我有类似的问题,但我使用C和自制的示例生成器:)我有慢和正确,快速和不正确的实现。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM