40

QuickCheck 1 和 QuickCheck 2 之间的主要区别是什么?通过查看 Haddock 文档,我可以看到它被拆分为更多模块,coarbitrary已被新的Fun类型和FunArbitrary类取代(这对我来说似乎更容易理解),并且现在支持测试 monadic 代码。我还应该注意什么?

4

1 回答 1

54

我已经看到 QuickCheck 2 的一项重大进步,我认为它与一元代码测试一样重要,甚至更多:

class Arbitrary  a where
    arbitrary :: Gen a
    shrink :: a -> [a]

这,真的是太棒了。收缩方法是可选的,但是如果你可以提供一个你的类型的“可能为空”的缩减列表,那么当 QuickCheck 发现一个错误的检查时,它会尝试将你的错误数据减少到最小,通过尝试收缩它然后重新- 测试它。只要它失败,它就会缩小它。

一个小样本来说服你,不缩小:

FormulaPrim deparsing    : *** Failed! Falsifiable (after 4 tests):
Poly (Polynome "p" [(CoeffRatio (26 % 25),PolyRest (CoeffRatio (129 % 40))),(CoeffInt 96,PolyRest (CoeffInt 11)),(CoeffInt 29,PolyRest (CoeffRatio (147 % 121))),(CoeffRatio (62 % 9),PolyRest (CoeffRatio (90 % 43))),(CoeffInt 56,PolyRest (CoeffInt 27))])

和 :

FormulaPrim deparsing    : *** Failed! Falsifiable (after 2 tests and 3 shrinks):
Poly (Polynome "t" [(CoeffInt 14,PolyRest (CoeffInt 126))])

更短的失败示例意味着更快的调试:-)

于 2009-12-19T18:04:58.597 回答