
HTTP::WebTest::Cookbook - Recipes for typical web tests

Not Applicable

This document contains some examples of HTTP::WebTest usage.
Unless otherwise is stated all examples are either runnable programs (see HTTP::WebTest::API) or runnable wtscript files (see perldoc wt).

This wtscript file tests static pages on the author's website:
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
The same tests in the form of a Perl script:
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' ]
}
]);
This wtscript file tests the login form at 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
This wtscript file tests static pages on the author's website. It is similar to the example in section "Check Static Website" but it uses the test parameter click_link to specify the link to be followed on the next test request instead of a hardcoded 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
This wtscript file tests the login form at http://fsck.com/rt2/. It is similar to the example in section "Check Login Form" but avoids using a hardcoded URL for the page the form should be submitted to by using the test parameter 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

This Perl script reads a test specification from file test.wt and generates Test::Harness compatible output:
use Test::More qw(no_plan);
use HTTP::WebTest;
my $webtest = new HTTP::WebTest;
$webtest->run_wtscript('test.wt',
{
default_report => 'no',
plugins => [ '::HarnessReport' ]
});
This script uses reporting plugin HTTP::WebTest::Plugin::HarnessReport which internally uses Test::Builder module to generate Test::Harness compatible output. It should be compatible with other testing libraries built using Test::Builder (like Test::More or Test::Differences) so you can freely intermix them in one test script.
It is possible to define new tests without writing new plugin module. This is a fragment of a wtscript file that checks if a new record has been inserted into a database as a result of the Add Record test.
# 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
Sometimes you want to feed the results of a previous test into the next test. In this example, Add Record creates a database record, emits HTML containing the new record ID, and Delete Record deletes the database record using the record ID from Add Record.
# 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.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
