Test::WWW::Mechanize::Catalyst
Test::WWW::Mechanize::Catalystは、WWW::Mechanizeを継承したテストモジュールで、タイトルやリンク情報など、HTMLのタグに関するレベルまでのテストを行うことができます。
また、ユーザーの操作をシミュレートしてボタンのクリックやフォームのサブミットを行うメソッドも用意されており、値のチェックだけではなく、複雑な操作を必要とするようなテストを記述することもできます。
Test::WWW::Mechanize::Catalystをインストールするには、rootユーザーで次のコマンドを実行します。
# perl -MCPAN -e 'install Test::WWW::Mechanize::Catalyst'
Test::WWW::Mechanize::Catalystを使用したテストの例を紹介します。次の例では、2種類のUser-Agentとして振る舞うTest::WWW::Mechanize::Catalystオブジェクトを用意し、それぞれに対して同じテストを行っています。
# 省略
use Test::WWW::Mechanize::Catalyst 'TestSample';
# テストメソッド
sub access_test {
my $mech = shift;
diag('Test for ' . $mech->agent);
# (1)'/'をGETで呼び出し、HTMLチェックとリンクチェックを行う
$mech->get_ok('/', 'Request should succeed');
$mech->html_lint_ok('HTML check');
$mech->page_links_ok('All links ok');
# (2)存在しないURL
$mech->get('/notfound');
ok($mech->status == 404, 'Not found page');
# (3)リダイレクト
$mech->get('/jump');
# いったん複製したオブジェクトのURIをチェックする必要がある
my $mech2 = $mech->clone();
ok ($mech2->uri() eq 'http://codezine.jp', 'Redirect page');
# (4)POSTした値のチェック
$mech->post_ok('/register', {name => 'john', age => 32 }, 'Register');
$mech->content_like(qr/john/, 'Check registered name');
$mech->content_like(qr/32/, 'Check registered age');
}
# (5)User-AgentをWindows版Mozillaとしてテスト
my $ua1 = Test::WWW::Mechanize::Catalyst->new;
# あらかじめ用意されているエイリアスを用いてUser-Agentを指定
$ua1->agent_alias('Windows Mozilla');
access_test($ua1);
# (6)User-Agentを携帯電話としてテスト
my $ua2 = Test::WWW::Mechanize::Catalyst->new( agent => 'DoCoMo/2.0');
access_test($ua2);
done_testing();
テストスクリプトもPerlのスクリプトなので、メソッドを定義できます。この例では、アクセステストを行うメソッドとして'access_test'を定義し、Windows版のMozillaとDoCoMoの携帯電話として振る舞うTest::WWW::Mechanize::Catalystから、access_testメソッドを呼び出しています。
(1)では、'/'に対してGETでリクエストを行い、その結果に対してHTMLの構文チェック(html_link_ok)とページのすべてのリンクに対して、リンク先にアクセスできるかどうかのチェック(page_links_ok)を行っています。
HTMLの構文チェックを行うには、HTML::Lintモジュールをあらかじめインストールしておく必要があります。
(3)のリダイレクトチェックでは、WWW::Mechanizeの制限のため、複製したオブジェクトのURIをチェックすることで、リダイレクト先に遷移しているかどうかを確認しています。
Test::WWW::Mechanize::Catalystには、POSTを行うメソッドも用意されているので、(4)のようにURLとパラメータを渡すだけで実現できます。レスポンスのチェックもcontent_likeを使うことで、正規表現による値の確認を行っています。
(5)と(6)では、それぞれ異なるUser-Agentを設定したオブジェクトを作成し、アクセステストを行っています。
Test::WWW::Mechanize::Catalystには、あらかじめいくつかのUser-Agentが登録されており、"Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6"のような長いUser-Agentをエイリアスを使用して指定することができます。
Test::WWW::Mechanize::Catalystには、ここで紹介したもの以外にも多くのメソッドが定義されているので、詳しい情報はTest::WWW::Mechanize::Catalystを参照ください。
まとめ
本記事ではテスト関連のモジュールを紹介しました。Catalystでのテストについては、Catalyst::Manual::Cookbook#TestingやCatalyst::Manual::Tutorial::08_Testingにも解説がありますので、必要な折には参照ください。
実際のアプリケーションはApacheなどの環境で動作させることが多いと思いますが、今回紹介したようなテストスクリプトが、必ずしも本番環境と同じように動作するとは限りません。そこで次回は、mod_perlを使用した環境でのテスト方法について紹介していく予定です。
参考資料
- 『Catalyst-Manual-5.8004』
- 『モダンPerl入門』 牧大輔 著、翔泳社、2009年2月
