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:
click_link
# 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:
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:
test.wt
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.
Add Record
Delete 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.
HTTP::WebTest
HTTP::WebTest::API
wt
To install HTTP::WebTest, copy and paste the appropriate command in to your terminal.
cpanm
cpanm HTTP::WebTest
CPAN shell
perl -MCPAN -e shell install HTTP::WebTest
For more information on module installation, please visit the detailed CPAN module installation guide.