State Machine Testing
This is in progress course material for a course on property-based state machine testing, using the Hedgehog package.
- You would like an automated minion to unleash hell on your application, breaking it in strange and fascinating ways.
What is State Machine Testing?
State Machine Testing extends property-based testing to provide a toolkit for building randomised tests of stateful systems. Like property-based testing, state machine tests use random generators to create test cases and shrink failing tests to minimal counter-examples. The difference with state machine testing is that the random input is now a sequence of commands to perform instead of arguments to pure functions.
How do we know that our stateful system is behaving itself? We build a model of the system being tested, and use it in a few ways:
Not all actions make sense at all times (e.g., what should happen if you try to log in when you're already logged-in?). When hedgehog generates a command sequence, we update the model being tested and use it to limit the actions we generate.
When we run tests, we perform commands both on the model and the system being tested, and check that their results agree.
The system we're testing is a vending machine for hot drinks, defined
src/CoffeeMachine.hs. You can select which drink you'd like,
insert or remove a mug, add milk or sugar, insert coins and dispense a
beverage. We'll be testing these features at different levels of the
The course itself is broken apart into several levels. Because this is
a course about testing, each level is a separate
test-suite in the
.cabal file, and its own directory.
Solutions are on the
solutions branch, one commit per level.
Running with stack
You will need to run a few additional commands when using stack:
# Initialise $ stack init # Replace `level01` with the level you are working on $ stack test :level01 # REPL, if you want it $ stack ghci :level01
- Setting Up
- First tests
- Terminology and
- Some simple commands
- Discussion of test feedback and interpreting errors
- More Commands
- Positive & Negative Testing
- Lensy Models