rubyでのテスト支援ツール群ZenTestの中にautotestというツールがあります。
autotestは、ソースの編集を検知し自動でテストを走らせてくれる機能を持っています。
テストファーストを習慣づけるためにはもってこいのツールですね。
下記の二つのツールと合わせるとより便利になりそうです。
- 結果を赤と緑で色分けしてくれるredgreen
- ポップアップ表示してくれるgrowl
という訳で、これらをインストールしてみました。以下やり方。
Zentest,redgreenのインストール
ZenTest,redgreenをgemでインストール
sudo gem install ZenTest sudo gem install redgreen
growlのインストール
下記URLからdownloadページへ移動し、Growlをインストール
http://growl.info/
ダウンロードしたものをマウントすると、下のようなウィンドウが出る。
ダブルクリックでインストール。
growlnotifyのインストール
さらに、autotestでgrowlを利用するためのツールであるgrowlnotifyをインストールする。
上記画像の左下にあるExtrasフォルダ配下のgrowlnotifyフォルダを適当なディレクトリへ移動させ、その中にあるinstall.shを実行する。
autotestの設定
autotestの設定ファイルをホームディレクトリに移動
cp /Library/Ruby/Gems/1.8/gems/ZenTest-3.9.1/lib/example_dot_autotest.rb ~/.autotest
~/.autotest を適当なエディタで編集
require 'autotest/redgreen' require 'autotest/growl'
上記二行のコメントを外す
ここまでで設定としては終了です。RAILS_ROOTで
autotest
と打てば後は自動で動きます。止めるにはC-cを二回すればOK。
growlの表示をカスタマイズするための画像取得
こちらのブログでは、growlの表示がとてもきれいになっているので、僕もやってみることにしました。
cd curl -O http://blog.internautdesign.com/files/rails_fail.png curl -O http://blog.internautdesign.com/files/rails_ok.png mv rails_fail.png .rails_fail.png mv rails_ok.png .rails_ok.png
autotestのgrowl利用部分のソースコードを編集
上記で紹介したブログのやりかたがどうしてもできなかったので、やむなく別の手段で。
cd /Library/Ruby/Gems/1.8/gems/ZenTest-3.9.1/lib/autotest cp growl.rb growl.rb.old sudo emacs growl.rb
として、growl.rbを直接編集することに。下記のような感じで、
- テスト成功→緑のアイコン
- テスト失敗→赤のアイコン
になるようにしました。
# -*- ruby -*- module Autotest::Growl def self.growl title, msg, img="~/.rails_ok.png", pri=0 title += " in #{Dir.pwd}" msg += " at #{Time.now}" system "growlnotify -n autotest --image #{img} -p #{pri} -m #{msg.inspect} #{title}" end Autotest.add_hook :run do |at| growl "autotest running", "Started", "~/.rails_ok.png" end Autotest.add_hook :red do |at| growl "Tests Failed", "#{at.files_to_test.size} tests failed", "~/.rails_fail.png", 2 end Autotest.add_hook :green do |at| growl "Tests Passed", "Tests passed", "~/.rails_ok.png", -2 if at.tainted end Autotest.add_hook :all_good do |at| growl "Tests Passed", "All tests passed", "~/.rails_ok.png", -2 if at.tainted end end