Каковы существенные различия между QuickCheck 1 и QuickCheck 2? От рассмотрения документов Пикши I видят, что оно разделяется через большее количество модулей, coarbitrary
был заменен новым Fun
введите и FunArbitrary
класс (который кажется легче понять мне), и тестирование одноместного кода теперь поддерживается. О чем еще я должен знать?
Я заметил одно важное улучшение 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))])
Более короткий пример сбоя означает более быструю отладку: -)