LoginSignup
17
13

More than 5 years have passed since last update.

Haskell hspec 入門

Posted at

Haskell hspec を一から調べた内容をまとめます。

はじめに

僕は Java では JUnit でテストをこれまで、数万テストケースは書いてきました。特に Java VM を開発していたので、リグレッションテストの重要性は承知しています。

JUnit はテスト駆動開発という考え方で、実装よりもテストを先に書いて、すべてのテストが通ったら実装完了、という開発方法に用いることが推奨されています。いわゆる「テストファースト」です。

hspec とは、振る舞い駆動開発という、テスト駆動開発を更に一歩進めた考え方を採用する開発方法に用います。振る舞い駆動開発とは簡単に言うと、自然言語に近い文法でスペックを記述すると、それがテストケースになる、というようなものです。実装の前にスペックを書き下すということで、こちらは「スペックファースト」と呼ばれているようです。

hspec のインストール

hspec をインストールするには、以下のように行います。

$ cabal update && cabal install hspec

hspec による Hello World

もっとも簡単な hspec の例をまず書いてみましょう。基本ですね。

Hello.hs
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

参考文献

以下を見ればすべて書いてあります。

17
13
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
17
13