Haskell

HUnit 超入門

More than 3 years have passed since last update.

Haskellのユニットテスト用ライブラリHUnitを使うのに最低限必要な事項を説明します。

この記事はHaskell 超入門シリーズの番外編です。


設定

HUnitへの参照が必要です。

Leksahでの設定方法を説明します。Leksahについては以下を参照してください。

メニューから設定します。


  • Package → Edit


    • Dependencies → HUnit と入力して [Add]

    • [Save]



依存関係を変更した後は[1]中間生成物を消去して[2]configureをやり直します。

clean-configure.png

以上で設定は完了です。


使用方法

簡単な使用方法を説明します。

HUnitで定義されている~:~?=という演算子を使って、想定される結果を記述します。奇妙な演算子ですが、先頭の~で識別してください。

ラベル ~: 式 ~?= 期待値

ラベルはテストに名前を付けるのに使用します。省略可能ですが、エラー発生時に識別が難しくなるため、付けておく方が無難です。

import Test.HUnit

import System.IO

fact 1 = 1
fact n = n * fact (n - 1)

tests = TestList
[ "fact 1" ~: fact 1 ~?= 1
, "fact 2" ~: fact 2 ~?= 2
, "fact 3" ~: fact 3 ~?= 6
, "fact 4" ~: fact 4 ~?= 24
, "fact 5" ~: fact 5 ~?= 120
]

main = do
runTestText (putTextToHandle stderr False) tests

テストが通れば結果のみが表示されます。表示がシンプルになるようにputTextToHandleで調整しています。


実行結果

Cases: 5  Tried: 5  Errors: 0  Failures: 0



失敗

故意にテストを失敗させて結果を確認します。


テストの改変部分

    , "fact 5" ~: fact 5 ~?= 100



実行結果

### Failure in: 4:fact 5

expected: 100
but got: 120
Cases: 5 Tried: 5 Errors: 0 Failures: 1


エラー

故意にエラーを発生させて結果を確認します。

import Test.HUnit

import System.IO

f 1 = 0

tests = TestList
[ "f 0" ~: f 0 ~?= 0
, "f 1" ~: f 1 ~?= 0
, "f 2" ~: f 2 ~?= 0
]

main = do
runTestText (putTextToHandle stderr False) tests


実行結果

### Error in:   0:f 0

src\Main.hs:4:1-7: Non-exhaustive patterns in function f

### Error in: 2:f 2
src\Main.hs:4:1-7: Non-exhaustive patterns in function f

Cases: 3 Tried: 3 Errors: 2 Failures: 0



その他

以上の知識で、初めのうちは充分ではないかと思います。

それ以外の使い方は以下を参照してください。

何か関数を実装するときは想定される結果でテストを書いておくことをお勧めします。テストについては以下を参照してください。