LoginSignup
25

More than 5 years have passed since last update.

HUnit 超入門

Last updated at Posted at 2014-08-29

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

その他

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

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25