Assertion
は単なる IO ()
なので、なんかアクションを書いてコンストラクタであるTestCase
へ渡せば、Test
型のデータを作れる。Test
型のデータはrunTestTT
で実行するのがお手軽(ターミナルに結果を表示)。後Test
型にはTestList
ってコンストラクタもあり、これを使って複数のテストを1つにまとめてもよい。もしくはAssertion
の段階で >>
で連結して1つのIO ()
にまとめても無問題。
Assertion
は、IO
アクションが普通に終われば成功扱いとなる。テストの失敗を知らせるにはHUnitFailure
を例外として投げればいいのだけど、こいつは隠蔽されているので実際はassertFailure
を呼べばよい。
% runghc
module Main (main) where
import Test.HUnit
test1, test2 :: Test
test1 = TestCase $ return ()
test2 = TestCase $ assertFailure "FAILED"
testN :: Int -> Test
testN = TestCase . assertBool "I don't like 13" . (/= 13)
tests :: Test
tests = TestList . ([test1, test2] ++) $ (map testN [1 .. 20])
main :: IO ()
main = do
count <- runTestTT tests
putStrLn ("The result is " ++ show count)
return ()
### Failure in: 1
FAILED
### Failure in: 14
I don't like 13
Cases: 22 Tried: 22 Errors: 0 Failures: 2
The result is Counts {cases = 22, tried = 22, errors = 0, failures = 2}