CGI でのテスト駆動開発についての質問です。
現在、Perl や PHP での DB にアクセスする CGI 開発に従事しています。しかし、機能追加や仕様変更のたびにエンバグしてしまうことがあるのです。こんなときに早期に対処できるよう、テスト駆動開発を導入したいと思っています。改修ごとに自動で単体テストを実行してエンバグしていないかチェックしたいのです。
CGI の内部の処理は関数化してやることによってある程度 xUnit のような単体テストに対応させることができますが、CGI 全体にわたって、各イヴェントごとに単体テストをする手法が思いつきません。
どなたか良いお知恵や経験をお持ちの方はいらっしゃらないでしょうか? ポイントは傾斜配分させていただくことになるかと思います。ぜひ宜しくお願いします。
単体テストとは少し違いますが、テストの自動化としてSeleniumをお勧めします。
紹介ページ:
http://journal.mycom.co.jp/articles/2006/09/29/selenium/
というのも、単体テストをキチッとやるためには各層の抽象化が必須ですが、Perl や PHPではそのあたりが難しいと私は思っているからです。
各層の抽象化ってなんのことかと言うと、例えばDBを使っているスクリプトの単体テストをするためにはDBを使わずにやるのが便利ですよね?
でないともし不具合が出たときに当のスクリプトが悪いのかDBのデータが悪いのか区別がつきません。
そのためにもデータの状態が一定のニセのDBをテスト対象のスクリプトに使わせればよいのですが、ニセのDBを使うために一々スクリプトを編集するわけにもいけません。(戻し忘れたりすると悲惨です。)
ということで、あらかじめDBをスクリプトから直接使わないようにDB関連の関数に一枚、皮をかぶせて(これを抽象化といっています)テスト対象のスクリプトに気づかれないように(要は編集なしで)こっそりと皮の向こうのDBをニセのDBにすりかえられるようにしておくといいのですが、PerlやPHPでは難しいんじゃないかなという事です。
Test::WWW::Mechanize とかどうですか?
Test::WWW::Mechanize - Testing-specific WWW::Mechanize subclass - search.cpan.org
nDiki: Test::WWW::Mechanize - Test::WWW::Mechanize で Web アプリケーションをテ... (2006-09-13)
これは大変便利そうなものを教えていただきました。ぜひ導入を検討したいところです。
アドヴァイス、ありがとうございます。
なるほど、抽象レイヤーをかませてから DB にアクセスしてやるのなら、テストの実行が楽になりますよね。現在、会社ではインハウスの DB ライブラリを使っているのですが、ここで工夫すれば Perl や PHP でもラッピングできそうです。