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って選んで問題無いよね?

使い方

railsプロジェクトのディレクトリで,

% 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でテストが通らなくても,大して気に病むべきではないか?いや,どうなんだろうな.