最近流行っているBDD(振舞駆動開発)というものをやってみたかったので、RSpecとZenTestをインストールしてみた。
環境
- Ubuntu 8.04
- JRuby 1.1.4
- Rails 2.1.1
- MySQL 5.0.51a
- RSpec 1.1.8
RSpecをインストール。
gem install rspec
Railsプロジェクトを作成。
jruby -S rails data_conversion -d mysql
プロジェクト作成後、config/dat
RSpecをRailsで使うためのプラグインをインストール。
RSpecやRailsのバージョンによって、インストールするリポジトリが変わるので注意。詳しくはrspec-rail
jruby script/plugin install git://gith ub.com/dch elimsky/rs pec.git jruby script/plu gin install git://gith ub.com/dch elimsky/rs pec-rails. git
RSpecの基本的なファイルを生成。
jruby script/generate rspec
rspec_scaf
jruby script/generate rspec_scaf fold Client name:strin g jruby script/gen erate rspec_scaf fold Journal name:strin g code:integ er client_id: integer
DBとテーブルを作る。
jruby -S rake db:create:all jruby -S rake db:migrate jruby -S rake db:test:cl one #developmen t用DBのスキーマをtest用DBにコピー
rspec_scaf
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN " "http://www .w3.org/TR /xhtml1/DT D/xhtml1-s trict.dtd"> 2 3 <html xmlns="http://www .w3.org/19 99/xhtml" xml:lang="ja" lang="ja"> 4 <head> 5 <meta http-equiv ="content-ty pe" content="text/html;charset=UT F-8" /> 6 <title><%= controller .controller _name %>: <%= controller .action_nam e %></title> 7 <%= stylesheet _link_tag 'scaffold' %> 8 </head> 9 <body> 10 11 <p style="color: green"><%= flash[:notice] %></p> 12 13 <%= yield %> 14 15 </body> 16 </html>
テスト実行。
jruby -S rake spec
rake aborted!
エラーが発生してしまった。なぜ?
どうやら、spec/views
- edit.erb_s
pec.rb - index.erb_
spec.rb - new.erb_sp
ec.rb - show.erb_s
pec.rb
1 stub_model(Journal, 2 :name => "value for name", 3 :code => "1", 4 )
に、:client_id
1 stub_model(Journal, 2 :name => "value for name", 3 :code => "1", 4 :client_id => "1" 5 )
再度、テスト実行。
jruby -S rake spec
Finished in 2.017446 seconds 74 examples, 0 failures
今度は通った!
どうやら、rspecでviewのspecファイルを生成すると、stub_model
次は、ソースコードを保存した時に、自動的にテストを実行させるための環境構築。
gem install ZenTest gem install diff-lcs gem install redgreen #autotest時のコンソール出力に色をつけてくれる
このままautotestを実行するとエラーになってしまうので、下記のメソッドを変更しなければならない。
vendor/plu
1 def consolidate_failures (failed) 2 filters = new_hash_o f_arrays 3 failed.each do |spec, trace| 4 if trace =~ /\n(\.\/)?(.*spec\.rb):[\d]+:\Z?/ 5 filters[$2] << spec 6 end 7 end 8 return filters 9 end
を、
1 def consolidate_failures (failed) 2 filters = Hash.new { |h,k| h[k] = [] } 3 failed.each do |spec, trace| 4 if trace =~ /\n(.*):[\d]+:\Z/ 5 filters[$1] << spec 6 end 7 end 8 return filters 9 end
に変更。
環境変数に下記の一行を追加。
~/.bashrc
1 export RSPEC=true
編集後、設定ファイルの再読み込み。
source ~/.bashrcこれを追加しておかないと、
loading autotest/rというメッセージがでたまま、止まってしまう。ails
準備が整ったところで、autotestを実行してみる。
まずは、テスト用サーバの立ち上げ。
立ち上げっぱなしにしておくことで、処理が早くなる。
jruby script/spec_server
新しいコンソール端末を起動して、autotestを実行。
autotest #Railsプロジェクトのルートディレクトリで
Finished in 2.017446 seconds 74 examples, 0 failures
autotest成功!
最後に、テストの結果をポップアップさせるための設定を行う。
ポップアップ表示させるために、Notifyをインストール。
sudo apt-get install libnotify-bin
Railsプロジェクトのルートディレクトリに.autotestというファイルを新規作成し、下記のコードをコピーする。
1 require 'autotest/redgreen' 2 3 module Autotest::Notify 4 def self.notif y title, msg, img, pri='low', time=3000 5 `notify-sen d -i #{img} -u #{pri} -t #{time} '#{msg}'` 6 end 7 8 Autotest.add_hook :ran_comman d do |autotest| 9 results = [autotest.results].flatten.join("\n") 10 output = results.slice(/(\d+)\s+examples?,\s*(\d+)\s+failures?(,\s*(\d+)\s+pending)?/) 11 folder = "~/Pictures /rails/" 12 if output =~ /[1-9]\d*\sfailures?/ 13 notify "FAIL:", "#{output}", folder+"rails_fail .png", 'critical', 10000 14 elsif output =~ /[1-9]\d*\spending?/ 15 notify "PENDING:", "#{output}", folder+"rails_pend ing.png", 'normal', 10000 16 else 17 notify "PASS:", "#{output}", folder+"rails_ok.p ng" 18 end 19 end 20 end
ポップアップしたときに表示する画像(緑、黄、赤)をこちらのサイトからダウンロードし、~/Pictures
これで、autotest完了時に、以下のポップアップが表示されるようになった。


