
Railsでアプリケーションを作っていると、unitテストやfunctionalテストなどを書くのが正直非常に骨が折れます。テストを書いていてもこれでいいのかと不安になることもあり、個人的に苦手。
先月、セミナーで角谷信太郎さんの講演を拝見し、RSpecの生産性の高さと、autotestでテスト結果がGrowlで表示されるのが非常にかっこ良く「これはいい!」と環境整備してみました。
環境整備の際、下記の素晴らしいページを参考にさせていただきました。
http://blog.tkmr.org/tatsuya/show/361-rails-macosx-rspec-zentest-growl http://d.hatena.ne.jp/zariganitosh/20080305/1204672076 http://d.hatena.ne.jp/willnet/20080301/1204387678 http://jp.rubyist.net/magazine/?0021-Rspec
以下作業ログ。
gemでRSpec,ZenTestなどをインストール
sudo gem install rspec
sudo gem install zentest
sudo gem install diff-lcs
sudo gem install redgreen
インストールしたZenTestをディレクトリからexample_dot_autotest.rbを.autotestとしてホームディレクトリにコピー。MacPorts環境なので、ここでは/opt。
cp \
/opt/local/lib/ruby/gems/1.8/gems/ZenTest-3.9.1/example_dot_autotest.rb \
~/.autotest
TKMRさんのブログ記事を参考に.autotestを編集。
#コメントアウト
require 'autotest/redgreen'
require 'autotest/growl'
#追加
module Autotest::Growl
def self.growl title, msg, img="~/.rails_ok.png", pri=0, sticky=""
system "growlnotify -n autotest --image #{img} -p #{pri} -m #{msg.inspect} #{title} #{sticky}"
end
Autotest.add_hook :ran_command do |at|
results = [at.results].flatten.join("\n")
output = results.slice(/(\d+)\s+examples?,\s*(\d+)\s+failures?(,\s*(\d+)\s+not implemented)?/)
if output
if $~[2].to_i > 0
growl "Test FAIL", "#{output}", "~/.rails_fail.png", 2
else
growl "ALL GREEN", "#{output}", "~/.rails_ok.png"
end
end
end
end
テスト結果に表示するための画像をダウンロードしてホームディレクトリに.rails_fail.png、.rails_ok.pngとして設置します。
Growlをインストール。また、Growlのパッケージに入っているgrowlnotifyもインストールします。
Leopardの場合、バージョン1.1.2のGrowlではautotestでGrowlが動かないそうです。zariganitoshさんのブログの記事を参考に修正します。
http://d.hatena.ne.jp/zariganitosh/20080305/1204672076
http://hasseg.org/blog/?p=111
Railsプロジェクトに移動。
cd ~/app/railsapp
rspec on railsプラグインをインストール。
ruby script/plugin install http://rspec.rubyforge.org/svn/tags/CURRENT/rspec_on_rails
RSpec用のファイルを生成します。
ruby script/generate rspec
RSpecジェネレータでモデルを作ります(script/generate modelは使わない)
ruby script/generate rspec_model Item
モデルのmigrationを書いてmigrate
rake db:migrate
モデルのspecを書きます
fixture
vi spec/fixtures/items.yml
spec
vi spec/models/item_spec.rb
autotestの前にテストサーバを立ち上げておくと実行速度が速くなるそうです。
script/spec_server
最後にautotestを起動
autotest
これでファイルが変更されるたびに、autotestが作動してRedかGreenかGrowlですぐにわかるようになります。ものすごくモチベーションがあがりますね。これ。