/hspec

Behavior Driven Development for Haskell

Primary LanguageHaskellOtherNOASSERTION

hspec aims to be a simple, extendable, and useful tool for Behavior Driven Development in Haskell.


Step 1, write descriptions and examples of your desired behavior
> module Myabs where
>
> import Test.Hspec
>
> specs :: Specs
> specs = describe "myabs" [
>   it "returns the original number when given a positive input"
>     (myabs 1 == 1),
> 
>   it "returns a positive number when given a negative input"
>     (myabs (-1) == 1),
> 
>   it "returns zero when given zero"
>     (myabs 0 == 0)
>   ]

Step 2, write whatever you are describing
> myabs n = undefined

Step 3, watch your examples fail with red text by running from the .hs file itself
> main = hspec specs

myabs
 - returns the original number when given a positive input FAILED [1]
 - returns a positive number when given a negative input FAILED [2]
 - returns zero when given zero FAILED [3]

1) myabs returns the original number when given a positive input FAILED
Prelude.undefined

2) myabs returns a positive number when given a negative input FAILED
Prelude.undefined

3) myabs returns zero when given zero FAILED
Prelude.undefined

Finished in 0.0002 seconds

3 examples, 3 failures


Specs can also be run from the command line using the hspec program
  $ hspec myabs.hs

Step 4, implement your desired behavior
> myabs n = if n < 0 then negate n else n

Step 5, watch your examples pass with green text when rerun
myabs
 - returns the original number when given a positive input
 - returns a positive number when given a negative input
 - returns zero when given zero

Finished in 0.0000 seconds

3 examples, 0 failures




Here's the report of hspec's behavior:


the "describe" function
 - takes a description of what the behavior is for
 - groups behaviors for what's being described

  a nested description
   - has it's own specs

the "it" function
 - takes a description of a desired behavior
 - takes an example of that behavior
 - can use a Bool, HUnit Test, QuickCheck property, or "pending" as an example
 - will treat exceptions as failures

the "hspec" function
 - displays a header for each thing being described
 - displays one row for each behavior
 - displays a row for successfull examples
 - displays a detailed list of failed examples
 - displays a '#' and an additional message for pending examples
 - summarizes the time it takes to finish
 - summarizes the number of examples and failures
 - outputs failed examples in red, pending in yellow, and passing in green

Bool as an example
 - is just an expression that evaluates to a Bool

HUnit TestCase as an example
 - is specified with the HUnit "TestCase" data constructor
 - is the assumed example for IO() actions
 - will show the failed assertion text if available (e.g. assertBool)
 - will show the failed assertion expected and actual values if available (e.g. assertEqual)

QuickCheck property as an example
 - is specified with the "property" function
 - will show what falsified it

pending as an example
 - is specified with the "pending" function and an explanation
 - accepts a message to display in the report

the "hHspecWithFormat" function
 - can use the "silent" formatter to show no output
 - can use the "progress" formatter to show '..F...FF.F' style output
 - can use the "specdoc" formatter to show all examples (default)
 - can use the "failed_examples" formatter to show only failed examples

quantify (an internal function)
 - returns an amount and a word given an amount and word
 - returns a singular word given the number 1
 - returns a plural word given a number greater than 1
 - returns a plural word given the number 0

Finished in 0.0483 seconds

32 examples, 0 failures