はじめに
Haskell でテストコードを書くツールをしらべてみた.
メジャーなものは以下
- doctest
- QuickCheck
- HSpec
- HUnit
各ツールの特徴
doctest
コメントにテストを書くスタイルのツール.
Python の doctest を haskell に移植したものだとか.
QuickCheck
ランダムなテストデータによって関数の性質をテストする.
xUnit とは異なるコンセプトをもつ.
HSpec
xSpec ライクなテストツール.
Ruby の RSpec にインスパイヤされたらしい.
記法が BDD 的.
HUnit
xUnit ライクなテストツール. JUnit ライク.
- HUnit: A unit testing framework for Haskell | Hackage
- Haskell - HUnit 超入門 - Qiita
- Haskell の UnitTest, HUnit について学ぶ - エンジニアのソフトウェア的愛情
HUnit を試す
JUnit になじみがあるので, HUnit を試してみた.
Install
$ cabal install HUnit
Usage
Test.HUnit をインポート.
import Test.HUnit
テスト対象コード
import Data.List
import Data.Char
import Unsafe.Coerce
data Nat = Zero
| Succ Nat
deriving Show
natToInteger (Succ n) = natToInteger n + 1
natToInteger Zero = 0
テストコード
tests = TestList
[ "natToInteger 1" ~: natToInteger Zero ~?= 0
, "natToInteger 2" ~: natToInteger (Succ Zero) ~?= 1
, "natToInteger 3" ~: natToInteger (Succ (Succ Zero)) ~?= 2
]
テスト実行
runTestTT (テスト関数名) でテスト実行.
$ runTestTT tests
Cases: 3 Tried: 3 Errors: 0 Failures: 0
Counts {cases = 3, tried = 3, errors = 0, failures = 0}
わざと失敗させてみる.
*Main> runTestTT tests
### Failure in: 2:natToInteger 3
expected: 1
but got: 2
Cases: 3 Tried: 3 Errors: 0 Failures: 1
Counts {cases = 3, tried = 3, errors = 0, failures = 1}