Integrated versus Manual Shrinking
Posted on May 13, 2019Property-based testing is an approach to software testing where instead of writing tests we generate tests, based on properties that the software should have. To make this work, we need to be able to generate test data and, when we find a counter example, we need to shrink that test data to attempt to construct a minimal test case.
In Haskell, the library QuickCheck
has long been the library of choice for property based testing, but recently another library called Hedgehog
has been gaining popularity. One of the key differences between these two libraries is that in QuickCheck
one writes explicit generation and shrinking functions, whereas in Hedgehog
shrinking is integrated in generation. In this blog post we will explain what that means by developing a mini-QuickCheck
and mini-Hedgehog
and compare the two. We will consider some examples where integrated shrinking gives us benefits over manual shrinking, but we we will also see that the belief that integrated shrinking basically means that we can forget about shrinking altogether is not justified. There is no such thing as a free shrinker.