HUnit-Plus-0.3.0: A test framework building on HUnit.

Safe HaskellNone



HUnit-Plus is a unit testing framework for Haskell, based on the older HUnit framework.

To use HUnit-Plus, first import the module Test.HUnitPlus:

import Test.HUnitPlus

HUnit-Plus provides the same succinct syntax for defining test as HUnit. However, HUnit-Plus tests use the data structures from Distribution.TestSuite to describe tests, as opposed to the data structures used by HUnit.

test1 = "test1" ~: (assertEqual "for (foo 3)," (1,2) (foo 3))
test2 = "test2" ~: (do (x,y) <- partA 3
                      assertEqual "for the first result of partA," 5 x
                      b <- partB y
                      assertBool ("(partB " ++ show y ++ ") failed") b)

You can also use the datatypes in Distribution.TestSuite to define your tests, or import tests that were defined that way.

test3 = Test (TestInstance { ... })

testgroup1 = Group { ... }

Additionally, you can use the Test.HUnitPlus.Legacy module to define tests in the old HUnit fashion. The test-creation operators will convert them into HUnit-Plus tests.

import qualified Test.HUnitPlus.Legacy as Legacy
test4 = "test4" ~: Test (assertEqual "a == b" a b)
testgroup2 = TestList [TestLabel "testFoo" testBar,
                       TestLabel "testBar" testBar]

You can add tags to tests as well:

test1Tags = testTags ["demo"] test1
test5 = testNameTags "test5" ["demo"] (a @?= b)

You can also create groups of tests:

testgroup3 = "group3" ~: [ test1, test2, testgroup1, test3 ]

At the top level, group tests into suites.

suite = TestSuite { suiteName = "suite",
                    suiteTests = [ testgroup3, test4 ],
                    ... }

The createMain function in Test.HUnitPlus.Main can be used to easily define a main for a test execution program.

main = createMain suite

The resulting program has a number of options for executing tests and reporting the results, which are documented in Test.HUnitPlus.Main, as well as in the program's "usage" output. Briefly, you can execute all tests by running the program without arguments.

$> ./testprog

You can select tests to be run by supplying a filter:

$> ./testprog group3.test1
$> ./testprog @demo

You can also generate various kinds of reports, and control console output:

$> ./testprog --xmlreport --txtreport --consolemode=quiet --testlist=tests

You can also use the topLevel function to supply options to test execution and get the result, allowing limited integration with a larger test execution framework. (Test.HUnitPlus.Execution has even more options).