🔭
HaskellのHSpecで複数ファイルのテストを同時に走らせる
概要
Haskellのstackのプロジェクトで、HSpecでテストを書く時、複数テストファイルを同時に走らせたかったら、Automatic spec discoveryを使う。senseiを使うとなお便利。
背景
stackを使ってwebアプリっぽいものを作る過程で、複数のHSpecテストファイルができたのだが、それらをまとめて走らせる良い方法がわからず詰まったのでメモする。
環境
- MacOS Big Sur 11.4
- MacBook Air M1
- stack 2.7.1
やり方
stack test
で実行できるようにする
I. HSpecのAutomatic spec discoveryを使って、複数ファイルのテストコードを-
stack new (プロジェクト名)
で適当なstackプロジェクトを作る。 -
package.yaml
の、testsという項目の、(プロジェクト名)-testという項目のdependenciesに、- hspec
という一行を追加 -
このページを参考に、
src
ディレクトリにプロダクションコード、test
ディレクトリにテストコードを書いていく。
このとき、以下の点に注意
- 各テストコードのファイル名は、
xxxSpec.hs
とする- 各テストコードのファイルは、
Spec
型の、spec
という名前の関数をエクスポートするモジュールにする必要がある。
- 各テストコードのファイルは、
- 以下の一行だけを持つ、
test/Spec.hs
というファイルを作っておく。test/Spec.hs{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
-
stack build
としてプロダクションコードをビルド、その後stack test
とすると、全てのテストコードが実行される。
このとき、裏ではHSpecのAutomatic spec discoveryが走っており、自動的にテストコードを収集、実行してくれている。
II. senseiを使って、テストコードorプロダクションコードが変更されたら即座にテストを自動実行できるようにする
さらに便利にするために、senseiというツールで、コードの変更を自動で検知し、即座にテスト実行できるようにする。
上記手順Iが終わっているという想定で、下記手順を実行。
-
stack install sensei
として、senseiをインストール。 -
senseiは、デフォルトでは
$HOME/.local/bin
にインストールされるが、ここにパスが通っている必要がある。そこで、.zshrc
や.bashrc
などに以下の行を追加してパスを通す。その後シェル再起動もしくはsource ~/.zshrc
などでリロード。
PATH="$HOME/.local/bin:$PATH"
- 手順Iで作ったstackで作ったプロジェクトのルートディレクトリに、下記内容の
.ghci
という名前のファイルを作成。(これを行わないと、senseiがtest
ディレクトリの中のモジュールを読み込んでくれず、エラーになってしまう)
:set -isrc -itest
- プロジェクトのルートディレクトリで、
stack exec sensei test/Spec.hs
とすると、senseiが立ち上がり、テストが自動実行される。この状態で、プロダクションorテストコードを変更すると、即座にテストが再実行されるようになる。
Discussion