14日目のエントリーです。Haskellコミュニティにすっかり受け入れられたテスティングフレームワークと言ってよいかと思います。!まだ確たるベストプラクティスは無いと言えるのではないでしょうか!Hspecの元となったRSpecはRubyコミュニティでデファクト・スタンダードとなっており、ベストプラクティスの蓄積があります。これを、Haskellの事情を鑑みつつ適用してみようという記事です。HspecのチュートリアルBDDのチュートリアルソフトウェア・テストのチュートリアルではないので、その辺りは別の記事を読んでください。あと、オフィシャルのexampleがあるので、これに先に目を通しておくと話が早いかもしれません。気になる点、賛同できないプラクティス、改善点などありましたら、是非コメントで教えてください。始めます!一般的なディレクトリ構造に従う一つのソースファイルに一つのスペックファイル名はSpec.hsで終えるソースコードのディレクトリ構造に対応させるが慣用的です。src/Foo.hsのSpecはtest/FooSpec.hs、src/Data/Bar.hsはtest/Data/BarSpec.hsとなります。hspec-discoverでテストスイートをまとめる複数あるテストを一つのテストスイートにまとめるのは結構面倒です。Specをエクスポートしておけば、hspec-discoverが規約に沿ったファイルから自動的にテストスイートを作ってくれます。Spec.hsそれぞれの関数について、振る舞いの説明をするdescribeで説明する関数を宣言し、itでその振る舞いを説明します。8contextを活用するcontextに文脈を書くと整理されたテストスイートになります。1一つのテストで一つの振る舞いを確認する複数の振る舞いを確認すると失敗するテストを見つけるのが難しくなります。テストが遅くなりすぎる場合は複数の振る舞いを検証するのもアリです。省略テストをあまり抽象化しないBDDはソフトウェアの振る舞いを記述するための手法です。多少冗長でも、記述された振る舞いの読みやすさを優先したほうがよいです。いい例が思いつかないので、瑣末な例で。省略としておいた方がよいです。前者の例はコードから振る舞いを読み取れません。BDDのテストコードは抽象化の対象ではなくソフトウェアの振る舞いを記述するものである、ということを心に留めておきましょう。HackageでHspecが取り上げられており、コメント欄でYesodやPersistentのメンテナーであるGregさんもテストの抽象化には反対していました。いえ現実世界では、読みやすい抽象化をすればいいのでは?とか、さすがにボイラープレートコードが多すぎる、とか、悩ましい状況は発生します。適度にルールを破る分には良いかと。マッチャーを知るshouldBe、shouldReturnなどをマッチャーと言います。これはそんなに数多くないので、一度目を通すとよいです。somethingという具合にGHCiの中でテストを実行できます。するほうが早いのでオススメ。便利なライブラリがある一時ディレクトリ、一時ファイルの利用はMockeryが便利です。Silentlyを使うと標準入出力をキャプチャできます。WAIにはhspec-wai、Snapにはhspec-snapがあります。ちなみに僕はhspec-waiの作者の一人です。まとめというか所感Hspecいいソフトウェアだと思います。型がリッチな言語とふわっと振る舞いからコードを育てるBDDの相性がめちゃくちゃ良い。Developmentは捗ります。あと、他にもRSpecのベストプラクティスをパクれるところは沢山あると思うので、RubyわかるHaskeller諸氏は是非参考にしてみてください。ChelimskyさんはClojureの人になってしまいました。本家http://hspec.github.iohttp://hackage.haskell.org/package/hspecこの記事の元ネタhttp://betterspecs.org/jp/http://magazine.rubyist.net/?0032-TranslationArticlehttp://www.methodsandtools.com/tools/rspecbestpractices.phpRSpecについて:http://magazine.rubyist.net/?0021-Rspechttp://rspec.info/Hspecについてhttps://www.reddit.com/r/haskell/comments/3vaj0z/24_days_of_hackage_2015_day_3_hspec_the/http://conscientiousprogrammer.com/blog/2015/12/03/24-days-of-hackage-2015-day-3-hspec-the-importance-of-testing/http://looprecur.com/blog/testing-a-web-application-with-hspec/http://alpmestan.com/posts/2014-06-18-testing-attoparsec-parsers-with-hspec.htmlhttp://d.hatena.ne.jp/kazu-yamamoto/20121205/1354692144http://mike-neck.hatenadiary.com/entry/2015/06/19/103536http://oropon.hatenablog.com/entry/2014/03/14/012729*1:ちなみに中置記法があるおかげでRSpecのようにshould/expect論争がないです。