autotest で Symfony + Lime を自動テストする

screen-shot-2010-05-12-at-140931
ruby 界隈でよく使われている自動テストツール autotest の Symfony + Lime 用スタイルを書いて公開しました。
プロジェクトのローカルルールに合わせてあるのですが、軽く手を入れれば他のプロジェクトでも、また Symfony や PHP 以外でも使えると思います。

  • TDD で書いていないと不安が高じて動悸と息切れが始まる
  • red-green-refactoring を唱えなさいとじっちゃに言われた
  • growl の red を見ないとコードが先に進まない

よくある話だと思います。
まずテストが無いと何も始まらない!書いたテストはがんがん自動実行して使い倒したい!
となるとやはり、自動テストの出番ですね。

インストール手順

autotest コマンドをインストールします。rspec + autotest + インストール辺りでぐぐってください。
mac の人は autotest-fsevent を一緒にぶち込んでおくと良いのですが、fseventの README により軽量な autotest コマンドのインストールガイドがあったのでそちらを参考にするのが良いかも知れません。
(RSpec2 beta + Rails 3 beta で偶然か動作しなかったため、私は ZenTest を継続利用中です)

続いて autotest-anyをローカルに落とします。
gem 化してません。サボってます。

Symfony プロジェクトのルートディレクトリに移動し、autotest 用のディレクトリ autotest と設定ファイル .autotest を作成します。
ファイル群は autotest-ary/example 以下にあります。
ここで作成、配置するファイルはプロジェクトに応じて随時カスタマイズします。

autotest
|-- dinolimetest_php.rb
`-- discover.rb
.autotest

.autotest を適宜書き換えてください。

挙動とカスタマイズ

autotest はファイルとテストを対で覚えており、ファイルが更新されるとそれに該当するテストをテストコマンドに渡し、自動実行を行います。
$target_patterns はその監視対象とするファイルを指定するための正規表現集合です。
$exception_patterns はその通り、テスト実行や監視から外したいファイルを指定するための正規表現集合です。

監視対象ファイルとテストファイルを結びつけているのは次の部分です。

at.add_mapping($target_patterns) do |filename, _|
  testfiles = [
    at.find_local_unit_test(filename),
    at.find_local_functional_test(filename)
  ];
 
  puts "src: #{filename}  ->  test: #{testfiles.join(', ')}"
  testfiles
end

filename は監視対象となるファイルのパスです。 
find_local_*_test(filename) により対となるテストファイルのパスを決定しています。 
弊社の、某プロジェクトのメンバーには便利なメソッドだと思います。
メソッドの中身は簡単な正規表現なので、ここでさくさくっと書いてしまうのも良いと思います。

red-green できゃっきゃうふふする

あとは symfony のプロジェクトルートで autotest を実行するだけです。

/Users/sou_sk/work/project/working% autotest
loading autotest/dinolimetest_php
style: DinolimetestPhp
src: lib/model/JobQueue/JqProcPeer.php  ->  test: test/unit/lib/model/JobQueue/JqProcPeerUnitTest.php, test/functional/lib/model/JobQueue/JqProcPeerFunctionalTest.php
src: lib/model/JobQueue/JqJob.php  ->  test: test/unit/lib/model/JobQueue/JqJobUnitTest.php, test/functional/lib/model/JobQueue/JqJobFunctionalTest.php
src: lib/proc/ProcTest.class.php  ->  test: test/unit/lib/proc/ProcTestUnitTest.php, test/functional/lib/proc/ProcTestFunctionalTest.php
src: lib/model/JobQueue/JqJobPeer.php  ->  test: test/unit/lib/model/JobQueue/JqJobPeerUnitTest.php, test/functional/lib/model/JobQueue/JqJobPeerFunctionalTest.php
src: lib/model/JobQueue/JqProc.php  ->  test: test/unit/lib/model/JobQueue/JqProcUnitTest.php, test/functional/lib/model/JobQueue/JqProcFunctionalTest.php
src: lib/proc/ProcBase.class.php  ->  test: test/unit/lib/proc/ProcBaseUnitTest.php, test/functional/lib/proc/ProcBaseFunctionalTest.php
src: lib/model/JobQueue/JqTask.php  ->  test: test/unit/lib/model/JobQueue/JqTaskUnitTest.php, test/functional/lib/model/JobQueue/JqTaskFunctionalTest.php
src: lib/model/JobQueue/JqTaskPeer.php  ->  test: test/unit/lib/model/JobQueue/JqTaskPeerUnitTest.php, test/functional/lib/model/JobQueue/JqTaskPeerFunctionalTest.php
src: lib/proc/ProcHaveALunch.class.php  ->  test: test/unit/lib/proc/ProcHaveALunchUnitTest.php, test/functional/lib/proc/ProcHaveALunchFunctionalTest.php
php test/unit/lib/model/JobQueue/JqJobPeerUnitTest.php && echo "----------------------" && php test/functional/lib/proc/ProcHaveALunchFunctionalTest.php && echo "----------------------" && php test/functional/lib/model/JobQueue/JqProcPeerFunctionalTest.php && echo "----------------------" && php test/unit/lib/model/JobQueue/JqProcPeerUnitTest.php

といった形でテストが走ってくれれば成功です。
src: .. -> test: .. はデバッグ用に表示しており、全ての監視対象ファイルとテストファイルを列挙しています。
最終ラインに表示されているのは実行コマンドで、ここに現れない場合はテストファイルが存在しない(パスが違う)可能性が濃厚です。
また autotest コマンドがぱたっと終了してしまう場合は、add_mapping のブロック内で何らかのエラーが発生している可能性を疑ってみてください。

スクリーンが二面あるともっと幸せになれます。
ちなみに私は Dell の縦回転するディスプレイを用意して自動テストのログをだらだらと表示し、もう片面をテキストエディタで埋めてコーディングに没頭するのが好きです。ヘンな脳内麻薬が出てきますよ。お勧めです!
TextMate のようなショートカットからコマンドを実行出来るエディタ + AppleScript を使うとブラウザのリフレッシュまでコマンド一発、スクリーン固定で出来るのでもっとお勧めです。

余談ついでに、autotest のような監視&実行を行うツールとしては他に
wathcr
弊社高原の watchdirがあります。
autotest でうまくいかない! もっと他の方法がいい!という人はこちらもお試しください。

autotest-any を作った後に watchr に気付きました、、、今から作るなら watchr かも知れません。

追記:
TextMate の LimeTest 実行コマンドを書きました。
需要ある方はご利用ください。

株式会社ディノではテストフェチな開発者を絶賛募集中しています。

コメント / トラックバックはありません

コメントする