[Please, read this through, and send me comments if you have an informed opinion on that topic] There was no reply to the following message of mine: ---------------------------------------------------- I'm about to start developping a test framework to allow testing of CGI applications "offline", i.e. without plugging them into a web server. I was thinking to use the CGI::Test namespace. Would that be ok? DLSI follows: CGI::Test i Off-line CGI regression test framework RAM ----------------------------------------------------- Maybe the fact that CGI::Test is looking too common to waste is holding you back...? Nah!, here's why: Given the following CGI script: ----------------------------------------------- : # feed this into perl eval 'exec perl -S $0 ${1+"$@"}' if $running_under_some_shell; use CGI qw/:standard/; $\ = "\n"; print header; print start_html("GET form"), h1("GET form"); print startform("GET"); my $counter = param("counter") + 1; param("counter", $counter); print hidden("counter"); print "Title: ", radio_group( -name => "title", -values => [qw(Mr Ms Miss)], -default => 'Mr'), br; print "Name: ", textfield("name"), br; print "Skills: ", checkbox_group( -name => "skills", -values => [qw(cooking drawing teaching listening)], -defaults => ['listening'], ), br; print "New here: ", checkbox( -name => "new", -checked => 1, -value => "ON", -label => "click me", ), br; print "Color: ", popup_menu( -name => "color", -values => [qw(white black green red blue)], ), br; print "Note: ", textarea("note"), br; print "Prefers: ", scrolling_list( -name => "months", -values => [qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)], -size => 5, -multiple => 1, -default => [qw(Jul)], ), br; print "Password: ", password_field( -name => "passwd", -size => 10, -maxlength => 15, ), br; print "Portrait: ", filefield( -name => "portrait", -size => 30, -maxlength => 80, ), br; print p( reset(), defaults("default"), submit("Send"), image_button( -name => "img_send", -alt => "GO!", -src => "go.png", -width => 50, -height => 30, -border => 0, ), ); print endform; print end_html; ----------------------------------------------- Here's my "t/parsing.t" test script that highlights the parsing work done by CGI::Test (this test currently passes): ----------------------------------------------- use CGI::Test; print "1..33\n"; my $BASE = "http://server:18/cgi-bin"; my $ct = CGI::Test->make( -url_base => $BASE, -cgi_dir => "t/cgi", ); ok 1, defined $ct; my $page = $ct->GET("$BASE/getform"); ok 2, !$page->is_error; ok 3, length $page->raw_content; ok 4, $page->content_type eq "text/html"; my $forms = $page->forms; ok 5, @$forms == 1; my $form = $forms->[0]; my @names; my $rg = $form->radio_groups; ok 6, ref $rg && (@names = $rg->names) && 1; # ok(x, 1, undef) ok 7, @names == 1; my $r_groupname = $names[0]; ok 8, $rg->is_groupname($r_groupname); my @buttons = @{$rg->widgets_in($r_groupname)}; ok 9, @buttons == 3; my $cg = $form->checkbox_groups; ok 10, ref $cg && (@names = $cg->names) && 1; ok 11, @names == 2; my $c_groupname = "skills"; ok 12, $cg->is_groupname($c_groupname); @buttons = @{$cg->widgets_in($c_groupname)}; ok 13, @buttons == 4; ok 14, @{$form->inputs} == 4; # 1 of each (field, area, passwd, file) ok 15, @{$form->buttons} == 4; ok 16, @{$form->menus} == 2; ok 17, @{$form->checkboxes} == 5; my $months = $form->menu_by_name("months"); ok 18, defined $months; ok 19, !$months->is_popup; ok 20, $months->selected_count == 1; ok 21, @{$months->option_values} == 12; ok 22, $months->is_selected("Jul"); ok 23, !$months->is_selected("Jan"); my $color = $form->menu_by_name("color"); ok 24, defined $color; ok 25, $color->is_popup; ok 26, !$color->is_selected("white"); ok 27, $color->selected_count == 0; ok 28, $color->option_values->[0] eq "white"; my @menus = $form->widgets_matching(sub { $_[0]->is_menu }); ok 29, @menus == 2; my @radio = $form->radios_named("title"); ok 30, @radio == 3; ok 31, $form->action eq "/cgi-bin/getform"; ok 32, $form->method eq "GET"; ok 33, $form->enctype eq "application/x-www-form-urlencoded"; ----------------------------------------------- I'm currently working on implementing the "user inteface" side of the test, i.e.: click on that radio, press that button... Besides, I'm needing CGI::Test for writing regression tests for the forthcoming CGI::MxScreen framework... I think this will be a useful addition. Raphael