You don't have javascript enabled. Good luck! :(

doctest

doctest は一言で言えば、Haddock にテストを埋め込んだものです。

例として、以下のような関数とコメントがあった場合に

消費税が10%に変更になったとしたらプログラムは以下のように修正されるでしょう。

この時、ドキュメントも同様に修正されるべきですが、その保証はどこにもありません。この問題に対する有効な解決策が doctest です。

doctest の準備

まずは package.yamldoctest のための記述を追加しましょう。

このままでは doctests.hs が見つからずにエラーになるため、以下のファイルを作成します。このファイルに doctest の対象ファイルを記述します。

これで準備は完了です。

doctest を実行するためには以下のように stack test コマンドを実行します。

$ stack clean
$ stack test

コマンド実行時に以下のようなエラーが出る場合があります。

上記のエラーが出た場合は以下のように必要なパッケージをインストールしてください。

doctest の書き方

doctest は以下のように、非常に直感的に記述することができます。

doctest>>> に続く文字列が ghci によって処理され、その下の行の結果と等しいかどうかをテストするだけです。

それでは minfree 関数に doctest を記述してみましょう。また、最初なので、間違ったテスト結果を書いてみます。

本当にテストが失敗するか確認します。

$ stack test
...
PFAD-0.1.0.0: Test suite PFAD-test passed
Completed 2 action(s).
Test suite failure for package PFAD-0.1.0.0
    PFAD-doctest:  exited with: ExitFailure 1
Logs printed to console

確かに失敗していることが確認できました。では、正しいテスト結果を記述してみましょう。

もう一度テストしてみます。

$ stack test
...

$ stack haddock

今度はちゃんとテストをパスし、以下のようなドキュメントが生成されると思います。

スクリーンショット 2017-12-11 18.27.52.png
スクリーンショット 2017-12-11 18.27.52.png

また QuichCheck を使った書き方もできます。その場合は >>>prop> にするだけです。

この性質は満たされないためテストに失敗します。

$ stack test
### Failure in src/Minfree.hs:21: expression `(as ++ bs) \\ cs == (as \\ cs) ++ (bs \\ bs)'
*** Failed! Falsifiable (after 3 tests and 3 shrinks):
[]
[0]
[]

正しく書き換えた場合はテストに通ります。ついでに、残りのプロパティテストも追加しておきます。

実行するとちゃんとテストをパスしてドキュメントを生成していると思います。

$ stack test
スクリーンショット 2017-12-11 18.57.01.png
スクリーンショット 2017-12-11 18.57.01.png

なんかかっこいい感じのドキュメントになってきました!

こんな感じでドキュメントも手軽にテストできるので、ぜひアプリケーションを開発する際に利用してください。

doctest