Help us understand the problem. What is going on with this article?

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

その他

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

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

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

7shi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした