Quelles sont les principales différences entre QuickCheck 1 et QuickCheck 2? En regardant la documentation de Haddock, je peux voir qu'il est divisé en plusieurs modules, coarbitrary
a été remplacé par le nouveau type Fun
et la classe FunArbitrary
(qui semble plus facile à comprendre pour moi), et le test de code monadique est désormais pris en charge. De quoi d'autre devrais-je être conscient?
Réponse
Trop de publicités?J'ai vu une avancée majeure dans QuickCheck 2, que je considère aussi importante que les tests de code monadique, voire plus :
class Arbitrary a where
arbitrary :: Gen a
shrink :: a -> [a]
C'est vraiment génial. La méthode shrink est facultative, mais si vous pouvez fournir une liste de réductions "éventuellement vides" de votre type, alors lorsque QuickCheck trouve un test défectueux, il essaiera de réduire vos données défectueuses au minimum en essayant de les réduire, puis de les retester. Il les réduit tant qu'il échoue.
Un petit exemple pour vous convaincre, sans réduction :
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))])
Avec :
FormulaPrim deparsing : *** Failed! Falsifiable (after 2 tests and 3 shrinks):
Poly (Polynome "t" [(CoeffInt 14,PolyRest (CoeffInt 126))])
Un exemple de fail plus court signifie un débogage plus rapide :-)