Haskell:
テストの作成

方法:

Haskellはさまざまなテストフレームワークをサポートしていますが、HspecQuickCheckの二つが人気です。Hspecでは、コードのための人間が読める仕様を定義できる一方で、QuickCheckでは、コードが満たすべき性質を説明することによりテストを自動的に生成させることができます。

Hspecの使用

まず、ビルドツール設定(例えば、stack.yamlcabalファイル)にhspecを追加します。そして、Test.Hspecをインポートし、仕様としてテストを書きます:

-- file: spec/MyLibSpec.hs
import Test.Hspec
import MyLib (add)

main :: IO ()
main = hspec $ describe "MyLib.add" $ do
  it "二つの数値を加算する" $
    add 1 2 `shouldBe` 3

  it "ゼロを加算した場合は、最初の数値を返す" $
    add 5 0 `shouldBe` 5

次に、ビルドツールを使ってテストを実行し、次のような出力が得られるかもしれません:

MyLib.add
  - 二つの数値を加算する
  - ゼロを加算した場合は、最初の数値を返す

0.0001秒で終了
2例、0失敗

QuickCheckの使用

QuickCheckでは、関数が満たすべき性質を表現します。プロジェクト設定にQuickCheckを追加し、それをインポートします:

-- file: test/MyLibProperties.hs
import Test.QuickCheck
import MyLib (add)

prop_addAssociative :: Int -> Int -> Int -> Bool
prop_addAssociative x y z = x + (y + z) == (x + y) + z

prop_addCommutative :: Int -> Int -> Bool
prop_addCommutative x y = x + y == y + x

main :: IO ()
main = do
  quickCheck prop_addAssociative
  quickCheck prop_addCommutative

これらのテストを実行すると、指定された性質をチェックするための入力が自動生成されます:

+++ OK, 100回のテストをパスしました。
+++ OK, 100回のテストをパスしました。

HspecとQuickCheckの両方の例では、テストスイートは実行可能な文書として機能し、コードの正確さを自動的に検証できます。