この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
よしだです。
Rails 3 アプリにGuard を導入して自動テストをより手軽にする方法を紹介したいと思います。
■ はじまり
最近携わっている Rails 3 アプリの自動テスト(RSpec)が、すべて完了するのに1時間半かかるようになってしまいました。
5〜10分で終わっていた頃はファイルに変更を加えるたびにすべてのテストを確認できていましたが、それが難しくなってきたので Guard を導入することにしました。
Guard を利用すれば、変更のあったファイルに関連するのみを効率よくテストすることができます。
ローカルでは Gurad で自分が編集した部分のみテストして、リモートの jenkins などですべてのテストを確認、ということをできるようにするのが今回の目的です。
■ Guard のインストール
というわけで、さっそく Rails 3 アプリに Guard を導入していきます。
bundlerを利用している場合は Gemfile ファイルに下記の行を追加します。
group :development do
gem 'guard'
gem 'guard-rspec'
gem 'guard-spork'
end
追加後、gem をインストールします。
% bundle install
最後に、guard の設定ファイル Guardfile を生成します。
% guard init
(※bundler を利用している場合は「bundle exec guard init」とすれば実行できます)
■ Guard の設定
インストール後は Guardfile を編集して動作設定を行います。
今回は Guardfile の rspec に関わる行を下記のように書き換えました。
guard 'rspec', :cli => "--color --fail-fast --drb", :all_after_pass => false, :all_on_start => false do
# …
end
「:cli => “–color –fail-fast –drb”」 という部分は rspec のオプションを記述しています。
これらはそれぞれ次のような意味があります。
- –color … 色をつけて表示する
- –fail-fast … テストに失敗したら即座に中断
- –drb … DRBサーバをサポートする
–drb オプションによって Spork が利用でき、テスト開始までの時間が短縮できます。
「:all_after_pass => false」という部分は、テストが通ったときにすべてのテストを実行するか否か、というオプションになります。
今回は、すべてのテストを実行していると時間がかかりすぎるので、 オフ にしています。
「:all_on_start => false」という部分は、Guard 起動時にすべてのテストを実行するか否か、というオプションになります。
これも上と同じ理由でオフにしています。
■ Guard の実行
まず、テストの高速化を図るためにあらかじめ Spork を起動しておきます。
% spork
つぎに Guard を起動します。
% guard start
これで準備完了です。
■ Guard を走らせる
適当なファイルを編集&保存するだけで、更新されたファイルに関連づいたファイルだけ自動的にテストが走ります。
ファイルの中身に更新があるかどうかは問わないようなので、下記のようにタイムスタンプを更新するだけでもテストの実行が可能です。
% touch app/models/hoge.rb
■ おわりに
現在非常に多くのツールが Guard と連携できるようになっているようです。
例えば仮想端末ソフト tmux などと連携することで「テスト実行後に結果を通知」といったことまでできます。
今回紹介したのは使い方のほんの一部でしたが、また機会があればその他の使い方について紹介したいと思います。