Shrinking
Once QuickCheck
has found a counterexample, it’s the tester’s or programmer’s job to figure out why the test fails. The purpose of shrinking is to reduce the size of a counterexample as much as possible to make this more manageable.
Shrinking in action
To see what shrinking does, let’s return to the failing prop_at_zero
property. We’ll contrast the same test run. When executed with quickCheck
and with verboseCheck
, the verbose version of quickCheck
gives us a blow-by-blow account of the test run. The first gives a short report:
*Main> quickCheck prop_at_zero *** Failed! Falsified (after 3 tests and 3 shrinks): 1 [0]
The second also shows the steps that precede the generation of that report:
*Main> verboseCheck prop_at_zero Failed: -2 [2,0] Failed: 2 [2,0] Passed: 0 [2,0] Failed: 1 [2,0] Passed: 0 [2,0] Passed: 1 [] Failed: 1 [0] Passed: 0 [0] Passed: 1 [] *** Failed! Falsified (after 3 tests and 3 shrinks): 1 [0]...