ZenTestのautotestにハマる

RubyForgeRSSに捕捉しながらも全然見る気がなかったZenTest.触ってみると,ちょっと素敵だったという話.


二重の意味でハマった.

  1. 何これ,すげーカッケーやん
  2. 何これ,autotest動かんやん

なんというか,プロジェクトそのものが2004年頃には既にあった事を思うと,俺チョット遅れ過ぎじゃねーか.

カッコいいところ

これは,Railsとかで使うとすげー効果的なんですね.ZenTestを全く知らない人のためにさらっと説明しておくと,$RAILS_ROOTに".autotest"という名前の空っぽのファイルを作って置いておき,$RAILS_ROOTでautotestを実行すると,アプリケーションやテストケースの更新を捕捉して,該当部分だけを,その名の通り自動でテストを実行してくれるというスグレモノ.
これは嫌でもTDDが加速しますね.

動かない感じ

railsでやるときは上の方法ですんなり動いたんですが,railsの全く関係無いところでやると,ちょっと難儀だった.これは何と言うか,ボクの認識が甘すぎる.

例えば,こういう内容のスクリプトを実行する.

puts Dir.pwd.split(/\//).last # カレントディレクトリの名前

=>
% pwd
/Users/kenji/ruby
% ruby tmp/piyo.rb
ruby

ボクは,スクリプトのカレントディレクトリの名前であるtmpって出て欲しいわけだけど,帰ってきたのはrubyインタプリタを実行したカレントディレクトリの名前であるruby.これがどのようにautotestに影響するかというと,

  • autotestを行うためには,以下の階層構造が必要
    • lib/*.rb
    • test/test_*.rb
  • と言う事は,テストケースに以下のようなrequire文を追加しなければならない
require '../lib/application.rb'
  • テストケース単体で実行するためには,コレで良い
    • これのお陰で変に躓いたのだ
  • しかし,autotestはlib,testの上のディレクトリで行わなければならない
    • すなわち,rubyインタプリタが実行されるのはlib,testの上になるので,先のrequire文は不適切
  • よって,テストケースのrequire文は以下の様に変更しなければならない
require 'lib/application.rb'
  • これで幸せ

この原理だと,単体テストを行いたいときは,ruby test/test_application.rbでいけるよね.


なんか最近変な事でハマるなー.ほんと,もう一回勉強し直すべきだよね….

何はともあれ

これはすごく便利.id:secondlifeさんの記事や瀧内さんの記事を読む限り,使いこなすと,もっとすごいことが起こるっぽい.rakeがRailsに於けるTDDの全てじゃないんだな,と最近すごく実感する.