The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

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

SYNOPSIS

Not Applicable

DESCRIPTION

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).

BASICS

Test Static Web Pages

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' ]
      }
    ]);

Test a Login Form

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

ADVANCED

Test::Harness Compatible Output

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.

User-Defined Tests

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

Dynamic Tests

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

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.

SEE ALSO

HTTP::WebTest

HTTP::WebTest::API

wt