Janiczek/elm-architecture-test

A library for fuzz testing TEA models by simulating user interactions


Keywords
elm, elm-test, fuzz-testing, property-based-testing, test
Install
elm-package install Janiczek/elm-architecture-test 1.0.10

Documentation

ArchitectureTest

tl;dr: Fuzz-test your update function with random List Msgs!

(Click on the diagram below for full size!)

High-level diagram

To do this, you create a Msg fuzzer (and possibly a Model fuzzer) and plug it in test functions exposed here!

  • Here are example Models with test suites showing how to write these kinds of tests.
  • Richard Feldman has a simpler library rtfeldman/test-update with the same purpose - give it a look!
  • A talk about this topic will be presented at Elm Europe 2017.
  • For more discussion, see this issue of elm-test.

FAQ

Can Elm enumerate over your Msg type automatically?

No, it cannot (as of version 0.18). You will have to specify your Msg fuzzers by hand:

cancel : Fuzzer Msg
cancel =
    Fuzz.constant Cancel

addCoins : Fuzzer Msg
addCoins =
    Fuzz.intRange 0 Random.maxInt
        |> Fuzz.map AddCoins

-- some other Msg fuzzers... and then, combine them:

allMsgs : Fuzzer Msg
allMsgs =
    Fuzz.oneOf
        [ cancel
        , addCoins
        , buy
        , takeProduct
        ]

How can I focus my Msgs (prefer some of them more than others?)

Right, so Fuzz.oneOf gives all the options the same probability of being chosen. It internally uses Fuzz.frequency, which you can use too and specify your own probabilities!

preferAdding : Fuzzer Msg
preferAdding =
    Fuzz.frequency
        [ (1, cancel)
        , (10, addCoins)
        , (1, buy)
        , (1, takeProduct)
        ]