HTTP::WebTest::Cookbook - ウェブページのテストのレシピ
応用なし
このドキュメントには HTTP::WebTest の使い方の いくつかの例を載せてあります.
特に記述がない例は実行可能なプログラム( HTTP::WebTest::API 参照) もしくは実行可能な wtscript ファイル(perldoc wt参照)です.
(基本)
(静的なウェブページのテスト)
以下の wtscript ファイルは著者(訳注:原文の著者)のウェブサイト上の 静的なページをテストします:
test_name = First page
url = http://martynov.org/
text_require = ( Ilya Martynov's Web Site )
end_test
test_name = Mail-CheckUser page
url = http://martynov.org/checkuser
text_require = ( Mail-CheckUser
Download )
regex_require = ( Mail-CheckUser-[\d\.]+\.tar\.gz )
end_test
同じテストの Perl スクリプト版です:
use HTTP::WebTest;
my $webtest = new HTTP::WebTest;
$webtest->run_tests(
[ {
test_name => 'First page',
url => 'http://martynov.org/',
text_require => [ "Ilya Martynov's Web Site" ]
},
{
test_name => 'Mail-CheckUser page',
url => 'http://martynov.org/checkuser',
text_require => [ 'Mail-CheckUser',
'Download' ],
regex_require =>
[ 'Mail-CheckUser-[\d\.]+\.tar\.gz' ]
}
]);
(ログインフォームのテスト)
以下の wtscript ファイルは http://fsck.com/rt2/ のログインフォームを テストします:
test_name = Login page
url = http://fsck.com/rt2/
text_require = ( Login
Username:
Password:)
end_test
test_name = Submit wrong username & password
url = http://fsck.com/rt2/
params = ( user => unknownUser
pass => somePassword )
text_require = ( Error
Your username or password is incorrect )
end_test
test_name = Submit correct username & password
url = http://fsck.com/rt2/
params = ( user => guest
pass => guest )
regex_require = ( Signed in as.*?guest.*?\. )
end_test
(テスト中に URL ではなくリンクやボタンの名前を使う)
# load HTTP::WebTest::Plugin::Click module which provides test
# parameter 'click_link'
plugins = ( ::Click )
test_name = First page
url = http://martynov.org/
text_require = ( Ilya Martynov's Web Site )
end_test
test_name = Mail-CheckUser page
click_link = Mail-CheckUser
text_require = ( Mail-CheckUser
Download )
regex_require = ( Mail-CheckUser-[\d\.]+\.tar\.gz )
end_test
この wtscript ファイルは http://fsck.com/rt2/ にあるログインフォームを テストします. これは と似ていますが, URL のハードコードを避けてテストパラメータ click_button
を使ってフォームを送信しています:
# load HTTP::WebTest::Plugin::Click module which provides test
# parameter 'click_button'
plugins = ( ::Click )
test_name = Login page
url = http://fsck.com/rt2/
text_require = ( Login
Username:
Password:)
end_test
test_name = Submit correct username & password
click_button = Login
params = ( user => guest
pass => guest )
regex_require = ( Signed in as.*?guest.*?\. )
end_test
(上級編)
(Test::Harness 互換の出力)
以下の Perl スクリプトは test.wt
ファイルからテスト手順を読み込み Test::Harness 互換の出力を生成します:
use Test::More qw(no_plan);
use HTTP::WebTest;
my $webtest = new HTTP::WebTest;
$webtest->run_wtscript('test.wt',
{
default_report => 'no',
plugins => [ '::HarnessReport' ]
});
このスクリプトではレポートプラグイン HTTP::WebTest::Plugin::HarnessReport を使っています. これは Test::Harness 互換の出力を 生成するために内部で Test::Builder を使っています. これは Test::Builder を使って構築された他のテスト ライブラリ(Test::More や Test::Differences 等)と互換であるため, 1つのテストスクリプトの中にこれらを自由に取り混ぜることができます.
(ユーザ定義のテスト)
新しいプラグインモジュールを書かなくとも新しいテストを定義する ことができます. 以下の wtscript ファイルは Add Record テストの結果 新しいレコードがデータベースに追加されたことを調べる抜粋です.
# load HTTP::WebTest::Plugin::Hooks module which provides test
# parameters 'on_start', 'on_finish' and 'on_response'
plugins = ( ::Hooks )
on_start = {
# initialize a database handle used later in the tests
require DBI;
$dbh = DBI->connect('dbi:mysql:test', 'login', 'password');
}
on_finish = {
# disconnect from the database
$dbh->disconnect;
}
....
test_name = Add Record
# request to this URL with parameter 'name' adds new record
url = http://some.server/add-record
params = ( name => 'John' )
# define check
on_response = {
my $has_record = $dbh->selectrow_array(
'SELECT COUNT(*) FROM USERS ' .
'WHERE NAME = ?',
undef, 'John'
);
# return result of check with a comment
[ $has_record > 0 ? 'yes' : 'no', 'Have got John' ];
}
end_test
(動的なテスト)
あるテストの結果を次のテストに反映したいこともあるでしょう. 次の例では Add Record
がデータベースにレコードを生成て その新しいレコードのIDを含んだ HTML を発行し, Delete Record
にておいて Add Record
のレコードIDを使って データベースからレコードを削除します.
# load HTTP::WebTest::Plugin::Hooks module which provides test
# parameter on_response
plugins = ( ::Hooks )
....
test_name = Add Record
# request to this URL with parameter 'name' adds new record
url = http://some.server/add-record
params = ( name => 'John' )
# get ID from a page
on_response = {
# get webtest object
my $webtest = shift;
# find ID in the returned page
($ID) = $webtest->current_response->content =~ /ID=(\d+)/;
# because no checks are defined a reference on empty array
# must be returned
[];
}
end_test
....
test_name = Delete Record
# request to this URL with parameter 'id' deletes record
url = http://some.server/delete-record
params = ( id => "$ID" )
end_test
Copyright (c) 2001-2003 Ilya Martynov. All rights reserved.
このプログラムはフリーソフトウェアです. このプログラムは Perl 自身と同じ条件下で再配布・改変可能です.