状況
PhoenixFrameworkのprojectでEspec, ExMachinaの組み合わせでテストを書き始めたが、テストを書くたびにmix espec
を叩くのがだるい。そこで、rubyのguardみたいなことができないのか?と探してみた。
環境
Elixir 1.3.1
PhoenixFramework 1.1.6
Espec 0.8.22
解決方法
ex_guardを使う
手順
基本的にはREADMEに書いてある通りに進める。Espec実行のために設定を少し変更した。
ex_guardをプロジェクトに導入
test系のtoolは最新のものを使いたいので、githubを直接指定。また、開発環境で使うので:dev
を追加している。この辺は個人の好みで設定。
{:ex_guard, github: "slashmili/ex_guard", only: :dev}
設定用のファイルを追加
applicationのrootに.exguard.exs
を配置する。設定はREADMEの設定を拝借して、少しだけ書き換えた。
READMEのサンプルからの変更点は、commandをmix espec
に変更したことと、watch
の対象をex,exsのみにしたこと。
use ExGuard.Config
guard("unit-test")
|> command("mix espec")
|> watch(~r{\.(ex|exs)\z}i)
|> notification(:auto)
実行
下記コマンドで実行。後はひたすらspecを書きまくる。
mix guard
通知について
ex_guard
は実行結果を通知することも可能。設定自体は下記4つがどれか使えればそれを利用する。という仕組み。
Terminal Title (Xterm)
TMux (Universal)
Terminal Notifier (mac only)
Notify Send (linux distros)
自分はOSX,tmuxを使っているので、ステータスラインにgreen, redがでることで満足していた。
がしかし、せっかくならOSXの通知で出したいなと思い、今はterminal-notifierを導入し、別terminalを開いてそこで個別に実行させている。
残念なところ
ファイルを個別に指定できない
.exguard.exs
を見てもらうとわかるように、command
を固定で指定しているので、常に全てのspecを実行してしまっている。理想としては、個別のファイルも指定できるとうれしい。
自分が知らないだけかもしれないので、知っている方いたらコメントをお願いしますm(__)m
まとめ
ちょっと残念だけど、手でポチポチとコマンドを叩く手間は改善された。
こちらで紹介されていたmix-test.watchも試してみたけどうまくいかなかった。
とりあえずこの設定で運用しつつ、mix-test.watch
もチェックしながらベストな方法を模索したい。