MonkeyTestカッコヨス
http://rubyforge.org/projects/monkeytest/
rakeテストカッコいい版みたいなかんじです.よくあるEが赤色になったり,って類いなんですが,あんなシンプルなヤツじゃなくて,変に凝ってる.
インストール方法
% sudo gem install monkeytest
ってすると
Select which gem to install for your platform (powerpc-darwin8.6.0) 1. monkeytest 0.2.1 (mswin32) 2. monkeytest 0.2.1 (ruby) 3. monkeytest 0.2.0 (mswin32) 4. monkeytest 0.2.0 (ruby) …
って聞かれるので,自分にあったプラットフォームを選びましょう.これは,依存するパッケージに関係する事なのですが,これってWindowsの人でも2って選んで問題無いよね?
使い方
% monkeytest exists lib/tasks create lib/tasks/monkey.rake
こんな感じにrakeファイルが作られます.で,テストするときに
% rake test:monkey
でMonkeyTestです.
Look & Feel
PASSは緑,ERRORは赤,FAILは黄色で表示されます.確かに,感覚的に一番痛いのはERRORな気もする.テストケースひとつひとつのテスト数,アサーション数を表示する辺り,こだわりを感じますね.この下のErrors & Failuresに,どこでERRORやFAILが発生したか書いています.出力結果はテストケース単体で走らせたときのものと同一のものです.
ちなみに,この実行結果は「はじめようRuby on Rails」で作成したスケジューラのそれです.ちょっと気持ち悪いのは,rakeで普通にテストしたら,このERRORが出ずに通ったってコトかな….多分,まだこのmonkey.rakeが完璧じゃないんだろうな.だってERRORが出るのはおかしいはずだもの(テストケース単体でやってもERRORが出たのは何でだぜ?一応,続きにその結果を書いておく).
term-ansicolor
プラットフォームの選択で,ruby系を選ぶと依存でインストールされます.これがなかなか面白い.簡単な使い方はhttp://term-ansicolor.rubyforge.org/に載っています.すでにブクマで6件されてるってことは,結構有名どころなのかな?
特に,この
class String include Term::ANSIColor end
が超絶便利.ちなみにrequireの仕方で結構迷ったのですが,こうします.
require 'term/ansicolor'
番外:テストケースと結果
エラーが発生している箇所
def test_create_success num_schedules = Schedule.count file = "#{RAILS_ROOT}/README" post(:create, :schedule => { 'datetime(1i)' => '2005', (略) 'file_name' => uploaded_file(file, 'text', 'README') }) assert_response(:redirect) assert_redirected_to(:action => 'month', :year => 2005, :month => 11) assert_equal(num_schedules + 1, Schedule.count) schedule = Schedule.find(num_schedules + 1) (略) end
出力
Loaded suite schedules_controller_test Started .E............. Finished in 1.674628 seconds. 1) Error: test_create_success(SchedulesControllerTest): ActiveRecord::RecordNotFound: Couldn't find Schedule with ID=4 (略) schedules_controller_test.rb:65:in `test_create_success' 15 tests, 58 assertions, 0 failures, 1 errors
テストケースに問題は無いように見える.それまでのは通っている事から,DBへのレコードの挿入はちゃんとできた事になる.すなわち,ID=4が見つからないのはおかしい.
pp
そこでデバッグプリント.
pp Schedule.find(:all)
で見てやる.
#<Schedule:0x275e184 @attributes= {"title"=>"テスト", "file_name"=>"README", "id"=>"36", # !!!!! "content"=>"", "user_id"=>"1", "datetime"=>"2005-11-01 23:05:00"}>]
…あれ?そう言えば,rakeテストだとオートインクリメントの分はちゃんと消されて,普通にテストだとオートインクリメントの分は消されないんだ(今思い出した).
解決
ていうか,常識的に考えるとnum_schedule + 1は問題がある.だって例えばレコードが5つあって,3番目を消した後に新しくレコードを挿入すると,idは6になるよね.そうなるとnum_schedule + 1は5だから欲しい結果は得られない.ダメじゃん!
そこで,一番ケツのレコードを取ってこようと思うと,Schedule.find(:all).lastの方が完璧に「さっき作られたレコード」になるんだよね.
で実際に
schedule = Schedule.find(num_schedule + 1)
から
schedule = Schedule.find(:all).last
に変えてみると,通りました.気をつけないとな.
結局
rakeでテストが通ってMonkeyTestでテストが通らなくても,大して気に病むべきではないか?いや,どうなんだろうな.