おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

ZenTest,autotest,redgreen,growlでテストファースト

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

余談

zentestでググると、zentestについてのブログを一つだけブックマークした自分のブックマーク
が11位に出るのですが、ひょっとしてzentestってあんまり人気ない?