トップ(最新)

nDiki

2006年2月18日 (土)

Perl CGI プログラムのテストには WWW::Mechanize::CGI このエントリーを含むはてなブックマーク

CGI プログラムを書いていて、いつも困るのがリグレッションテスト

パッケージのビルド時に実行するテストスーツ (make check / make test 用テストプログラム群) に含めておきたいが、さすがにその場で Web サーバの下へセットアップするわけにもいかない。 ミニ Web サーバを同梱してテストスーツ内で起動する方法はちょっとおおがかかりだし、ポート番号の選択やらサーバの停止の問題もあって、かなり面倒。

結局、テストスーツの中で環境変数や標準入力など CGI リクエスト環境をセットアップして、CGI プログラムを実行するという王道(?)かつ泥臭いテストを書くことになったりする。

何かいいものはないかと探していたところ、WWW::Mechanize::CGI というものをみつけた。

LWP::UserAgent を継承した WWW::Mechanize モジュールは Web ブラウジングを容易にする有名どころのモジュールである。

WWW::Mechanize::CGI モジュールはさらにこれを拡張したモジュールで、HTTP リクエストを、仮想的に CGI プログラムやサブルーチンへの呼出しにしてくれる。 これを用いるとあたかも Web サーバ上の CGI プログラムにリクエストしレスポンスを受けとっているかのように、テストプログラムを書くことができる。

素晴しい。

さっそく WiKicker のテストを書き換えてみた:

 use Test::More tests => 2;
 use WiKicker::WikICGI::Controller;
 use WWW::Mechanize::CGI;
 use File::Temp qw(tempdir);
 use File::Spec;
 my $www_dir = tempdir(CLEANUP => 1);
 my $mech = WWW::Mechanize::CGI->new;
 $mech->cgi(sub {
              $ENV{PATH_INFO} = '' if $ENV{PATH_INFO} eq '/';
              WiKicker::WikiCGI::Controller->new->run});
 $mech->env($mech->env,
            SCRIPT_FILENAME => File::Spec
                                 ->catfile($www_dir . '/wiki'),
            SCRIPT_NAME => '/wiki');
 my $response = $mech->get('http://localhost/wiki');
 ok($response->is_success);
 like($response->content,
      qr|<title>WikiForum\[WiKicker\]: FrontPage</title>|);

WWW::Mechanize::CGI オブジェクトを new した後、cgi メソッドで CGI サブルーチンを指定するか、cgi_application メソッドで外部 CGI プログラムを指定する。 ここでは直接、CGI サブルーチン (WiKicker::WikiCGI::Controller->new->run を実行)を指定した。

なおここで WWW::Mechanize::CGI が使っている HTTP::Request::AsCGI 0.5 における PATH_INFO の扱いが Apache などとは違って、空でも必ず '/' が入るようになっている。 これだと WiKicker では困るので、サブルーチンのところで修正している。

後は必要ならば WWW::Mechanize::CGI::env で、追加の環境変数設定を行っておく。

セットアップが済めば通常の WWW::Mechanize と同様に get 等でリクエストを行いレスポンスを受けとることができるようになる。

いい。しばらく試してみて不具合がなさそうなら、定番のテストスタイルにしたい。

ちなみに Test::Harness 用の Test::WWW::Mechanize にあわせて、Test::WWW::Mechanize::CGI というものもある。 これらを用いるとさらにテストを書くのが楽になるが、依存するモジュールも多いので無理に使わないほうがいいかもしれない。

スポンサード リンク


[ 2月18日全て ]

Related term

■よく検索されるキーワード

torrent(142) expressions(72) 書き方(46) 竹内まりや(46) perl(42) 提案書(38) linux(38) windows(36) アジェンダ(34) x31(32) cvs(28) wiki(27) usb(26) ドラマ(22) 使い方(20) svn(20) アジェンダとは(20) centos(20) ganttproject(20) 設定(19) java(19) インストール(18) 秋葉原(18) debian(18) thinkpad(18) サンプル(18) 動画(17) ノート(15) 手帳(13) a6(13) truecrypt(13) tc-1(13) tortoisesvn(13) 無印(12) ssh(12) rcs(12) subversion(12) 冷蔵庫(12) nikon(12) allinanchor:*.torrent(12) firefox(11) ガントチャート(11) 画像(11) 日本語(11) 生年月日(11) apache(11) メール(11) ダイソー(10) 無料(10) 壁紙(10) リフィル(10) ubuntu(10) 作り方(10) dropbox(10) c#(9) xp(9) oracle(9) xampp(9) terastation(8) 方眼(8) マイク(8) ヨドバシカメラ(8) テンプレート(8) ほぼ日(8) cwrsync(8) google(8) ming(8) 評判(8) 影舞(8) madwifi(8) アカウント(8) window(8) usbメモリ(8) gantt(8) project(7) 三条まゆみ(7) hdd(7) 変換(7) カバー(7) 交換(7)

この日記のはてなブックマーク数 Add to Google RSS

Process Time: 0.355194s / load averages: 0.81, 0.92, 0.76
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)