🔭

HaskellのHSpecで複数ファイルのテストを同時に走らせる

2021/07/23に公開

概要

Haskellのstackのプロジェクトで、HSpecでテストを書く時、複数テストファイルを同時に走らせたかったら、Automatic spec discoveryを使う。senseiを使うとなお便利。

背景

stackを使ってwebアプリっぽいものを作る過程で、複数のHSpecテストファイルができたのだが、それらをまとめて走らせる良い方法がわからず詰まったのでメモする。

環境

  • MacOS Big Sur 11.4
  • MacBook Air M1
  • stack 2.7.1

やり方

I. HSpecのAutomatic spec discoveryを使って、複数ファイルのテストコードをstack testで実行できるようにする

  1. stack new (プロジェクト名)で適当なstackプロジェクトを作る。

  2. package.yamlの、testsという項目の、(プロジェクト名)-testという項目のdependenciesに、- hspecという一行を追加

  3. このページを参考に、srcディレクトリにプロダクションコード、testディレクトリにテストコードを書いていく。
    このとき、以下の点に注意

  • 各テストコードのファイル名は、xxxSpec.hsとする
    • 各テストコードのファイルは、Spec型の、specという名前の関数をエクスポートするモジュールにする必要がある。
  • 以下の一行だけを持つ、test/Spec.hsというファイルを作っておく。
    test/Spec.hs
    {-# OPTIONS_GHC -F -pgmF hspec-discover #-}
    
  1. stack buildとしてプロダクションコードをビルド、その後stack testとすると、全てのテストコードが実行される。
    このとき、裏ではHSpecのAutomatic spec discoveryが走っており、自動的にテストコードを収集、実行してくれている。

II. senseiを使って、テストコードorプロダクションコードが変更されたら即座にテストを自動実行できるようにする

さらに便利にするために、senseiというツールで、コードの変更を自動で検知し、即座にテスト実行できるようにする。

上記手順Iが終わっているという想定で、下記手順を実行。

  1. stack install senseiとして、senseiをインストール。

  2. senseiは、デフォルトでは$HOME/.local/binにインストールされるが、ここにパスが通っている必要がある。そこで、.zshrc.bashrcなどに以下の行を追加してパスを通す。その後シェル再起動もしくはsource ~/.zshrcなどでリロード。

PATH="$HOME/.local/bin:$PATH"
  1. 手順Iで作ったstackで作ったプロジェクトのルートディレクトリに、下記内容の.ghciという名前のファイルを作成。(これを行わないと、senseiがtestディレクトリの中のモジュールを読み込んでくれず、エラーになってしまう)
:set -isrc -itest
  1. プロジェクトのルートディレクトリで、stack exec sensei test/Spec.hsとすると、senseiが立ち上がり、テストが自動実行される。この状態で、プロダクションorテストコードを変更すると、即座にテストが再実行されるようになる。

Discussion