John Hughes
The exercises
in this course will be involve practical Haskell programming using the latest
version of QuickCheck, and a theory exploration tool, QuickSpec. It’s important
to have all the necessary software installed on your laptop before the School
begins. You will need:
· A Haskell installation. I recommend
installing the Haskell Platform, if you do not already have one: https://www.haskell.org/platform/
· A recent version of QuickCheck, 2.12
or newer. The most recent version of the Haskell Platform (8.6.3) includes
this; older versions include an older version of QuickCheck which lacks some of
the features I will be discussing. If you have an older version of QuickCheck
installed, you can upgrade it using the command cabal install quickcheck.
· A version of QuickSpec. You can
install this using the command cabal install quickspec; however, at the time of writing
the installation sometimes fails. If this happens to you, I suggest installing
QuickSpec in an Ubuntu virtual machine instead. This is a slow process involving
a large download, if you need to create a new Ubuntu VM—don’t wait until you
are at the School to do it.
· Basic familiarity with Haskell: you
will be adding code to existing modules, so if you are unfamiliar with Haskell
syntax then there will be examples for you to work from, but of course, some
Haskell knowledge will be helpful. Good sources are Graham Hutton’s book Programming in Haskell,
or Learn you a Haskell for Great Good, a free online tutorial.
The lecture
slides are available as PDFs below; you may wish to make notes on the slides
during the lectures. The exercises are available as zip files containing a
problem description as a PDF, and Haskell files needed to solve the problem;
some of the Haskell files contain solutions or other “spoilers”, so always read
the problem description first.
An
introduction to property-based testing, along with one or two war stories about
interesting bugs.
An
introduction to using Haskell QuickCheck, and an experience in using
property-based testing in test driven development.
Anatomy of
a QuickCheck property. Where do properties useful for testing come from? Some
guidelines and common pitfalls. The QuickSpec property generator.
Writing
properties for testing binary search trees, based on yesterday’s lecture. Using
properties to diagnose bugs. Using QuickSpec to explore properties.
Testing a
stateful API requires specialized properties, and a state-modelling library to
express them. Using such a library to test an API modelled on the Erlang
process registry.
Complete
the specification begun in yesterday’s lecture, and
extend it to test the behavior of the registry when processes may sometimes
crash.
Plausible-looking
properties can actually be ineffective at finding
bugs, if no thought is given to test case distributions. How can we measure
distributions? What distributions should we aim for? How can we state—and
test—coverage requirements on distributions, to prevent later regressions?
Label tests
in an implementation of interval sets (from Monday), and tune the testing of
delete. Measure coverage of the registry tests (from Wednesday), and tune them
to test the rare cases more frequently.