1. 7shi

    Posted

    7shi
Changes in title
+HUnit 超入門
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,128 @@
+Haskellのユニットテスト用ライブラリHUnitを使うのに最低限必要な事項を説明します。
+
+以下の続きを想定しています。
+
+* [Haskell 超入門](http://qiita.com/7shi/items/145f1234f8ec2af923ef)
+
+# 設定
+
+HUnitへの参照が必要です。
+
+Leksahでの設定方法を説明します。Leksahについては以下を参照してください。
+
+* [Haskell IDE Leksah 入門](http://qiita.com/7shi/items/d1e5a0c22be6cf61d286)
+
+メニューから設定します。
+
+* Package -> Edit
+ * Dependencies → HUnit と入力して [Add]
+ * [Save]
+
+依存関係を変更した後は[1]中間生成物を消去して[2]configureをやり直します。
+
+![clean-configure.png](https://qiita-image-store.s3.amazonaws.com/0/32057/52e613c5-2aca-2d47-5e1e-564cad1a6268.png)
+
+以上で設定は完了です。
+
+# 使用方法
+
+簡単な使用方法を説明します。
+
+HUnitで定義されている`~:`と`~?=`という演算子を使って、想定される結果を記述します。奇妙な演算子ですが、先頭の`~`で識別してください。
+
+```text
+ラベル ~: 式 ~?= 期待値
+```
+
+ラベルはテストに名前を付けるのに使用します。省略可能ですが、エラー発生時に識別が難しくなるため、付けておく方が無難です。
+
+```hs
+module Main where
+
+import Test.HUnit
+import System.IO
+import Data.Char
+
+hexStrToInt hex = f (reverse hex)
+ where
+ f "" = 0
+ f (x:xs) = (digitToInt x) + 16 * (f xs)
+
+hex x = if x1 == 0 then x2 else hex x1 ++ x2
+ where
+ x1 = x `div` 16
+ x2 = [intToDigit (x `mod` 16)]
+
+tests = TestList
+ [ "show" ~: show 123 ~?= "123"
+ , "digitToInt" ~: digitToInt 'a' ~?= 10
+ , "intToDigit" ~: intToDigit 10 ~?= 'a'
+ , "hexStrToInt 1" ~: hexStrToInt "100" ~?= 256
+ , "hexStrToInt 2" ~: hexStrToInt "ffff" ~?= 65535
+ , "hex 1" ~: hex 256 ~?= "100"
+ , "hex 2" ~: hex 65535 ~?= "ffff"
+ ]
+
+main = do
+ runTestText (putTextToHandle stderr False) tests
+```
+
+テストが通れば結果のみが表示されます。表示がシンプルになるように`putTextToHandle`で調整しています。
+
+```text
+Cases: 7 Tried: 7 Errors: 0 Failures: 0
+```
+
+## テスト失敗
+
+テストが通らなかった場合は以下のように表示されます。
+
+```hs
+ , "hex 2" ~: hex 65536 ~?= "ffff"
+```
+
+```text
+### Failure in: 6:hex 2
+expected: "ffff"
+ but got: "10000"
+Cases: 7 Tried: 7 Errors: 0 Failures: 1
+```
+
+## エラー
+
+テスト中にエラーが発生した場合は以下のように表示されます。
+
+```hs
+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
+```
+
+```text
+### Error in: 0:f 0
+src\Main.hs:9:1-7: Non-exhaustive patterns in function f
+
+### Error in: 2:f 2
+src\Main.hs:9:1-7: Non-exhaustive patterns in function f
+
+Cases: 3 Tried: 3 Errors: 2 Failures: 0
+```
+
+# その他
+
+初めのうちはこれだけ知っていれば充分ではないかと思います。
+
+それ以外の使い方は以下を参照してください。
+
+* [HaskellのUnitTest、HUnitについて学ぶ - エンジニアのソフトウェア的愛情](http://d.hatena.ne.jp/E_Mattsan/20121020/1350707524)
+
+何か関数を実装するときは想定される結果でテストを書いておくことをお勧めします。テストについては以下を参照してください。
+
+* [テスト駆動開発 - Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA)