MyNixOS website logo
Description

Test monadic programs using state machine based models.

quickcheck-state-machine-distributed

Hackage Stackage Nightly Stackage LTS Build Status

quickcheck-state-machine-distributed is Haskell library for testing stateful, possibly distributed, programs. It's based on QuickCheck, but differs from the Test.QuickCheck.Monadic approach in that it lets the user specify the correctness by means of a state machine based model using pre- and post-conditions. The advantage of the state machine approach is twofold: 1) specifying the correctness of your programs becomes less adhoc, and 2) you get testing for race conditions for free.

The combination of state machine based model specification and property based testing first appeared in Erlang's proprietary QuickCheck. The quickcheck-state-machine-distributed library can be seen as an attempt to provide similar functionality to Haskell's QuickCheck library.

The quickcheck-state-machine-distributed library builds upon ideas from the quickcheck-state-machine sister library. The most significant difference is that the former is based on the distributed-process library, hence the name. A more detailed comparison follows below.

Example

See test/TicketDispenser.hs for a full example of how to implement and test a ticket dispenser -- think of one of those machines in the pharmacy which gives you a piece of paper with your number in line on it.

This example also appears in the Testing a Database for Race Conditions with QuickCheck and Testing the Hard Stuff and Staying Sane [PDF, video] papers.

quickcheck-state-machine-distributed vs quickcheck-state-machine

Apart from the already mentioned difference that -distributed is based on distributed-processes, it's also different in that it:

  • Decouples requests from responses (opening up the possibility for testing asynchronous interfaces);

  • Takes a more lightweight approach; no GADTs, no references (which hopefully makes the library easier to understand and use).

Contributing

The quickcheck-state-machine-distributed library is still very experimental.

We would like to encourage users to try it out, and join the discussion of how we can improve it on the issue tracker!

See also

The README of the sister library quickcheck-state-machine library contains many links and examples that could be useful for a better understanding of this library and the underlying principles.

License

BSD-style (see the file LICENSE).

Metadata

Version

0.0.1

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows