Haskell hspec を一から調べた内容をまとめます。
はじめに
僕は Java では JUnit でテストをこれまで、数万テストケースは書いてきました。特に Java VM を開発していたので、リグレッションテストの重要性は承知しています。
JUnit はテスト駆動開発という考え方で、実装よりもテストを先に書いて、すべてのテストが通ったら実装完了、という開発方法に用いることが推奨されています。いわゆる「テストファースト」です。
hspec とは、振る舞い駆動開発という、テスト駆動開発を更に一歩進めた考え方を採用する開発方法に用います。振る舞い駆動開発とは簡単に言うと、自然言語に近い文法でスペックを記述すると、それがテストケースになる、というようなものです。実装の前にスペックを書き下すということで、こちらは「スペックファースト」と呼ばれているようです。
hspec のインストール
hspec をインストールするには、以下のように行います。
$ cabal update && cabal install hspec
hspec による Hello World
もっとも簡単な hspec の例をまず書いてみましょう。基本ですね。
import Test.Hspec
hello :: String -> String
hello name = "hello, " ++ name
specHello :: Spec
specHello = do
describe "hello" $ do
it "standard" $
hello "world" `shouldBe` "hello, world"
it "empty" $
hello "" `shouldBe` "hello, "
main :: IO ()
main = hspec $ do
specHello
hello
のテストを specHello
で定義しています。振る舞い駆動開発の考え方を適用すると、先に specHello
を書いてから hello
を実装します。
振る舞いを定義する関数は Test.Hspec.Spec
という型で、これは do
ブロックに複数の describe
ブロックを定義し、describe
ブロックに複数の it
ブロックを定義します。最初の振る舞い定義の hello "world" `shouldBe` "hello, world"
は、かなり自然言語に近いですね。
本来であれば、実装とテストは分けたほうが良いのですが、簡単のため一緒にしています。
これを以下のように実行します。
$ runhaskell Hello.hs
hello
standard
empty
Finished in 0.0002 seconds
2 examples, 0 failures
参考文献
以下を見ればすべて書いてあります。