[Chicago-talk] Automated testing of web apps?

Jonathan Rockway jon at jrock.us
Mon Feb 26 17:15:27 PST 2007

On Monday 26 February 2007 11:07, Alan Mead wrote:
> An upcoming Perl web application is going to need some testing and I'd
> like to automate it. This (testing) is not like anything that I've done
> previously... Does anyone have suggestions about the right module,
> helpful articles, etc.?

The standard perl way of testing web applications is Test::WWW::Mechanize.  
Mech gives you an web-browser-like interface that looks something like:

   $mech->content_contains('this is the foo page!');
   $mech->content_contains('this is the foo page RELOADED!');
   @links = $mech->followable_links;
   # etc.

Note that there isn't an actual web browser involved; everything is done 
through LWP::UserAgent.  Oh, and the author reads this list, so if you have 
questions you'll probably get a quick answer. :)

Selenium is like Mech, except the tests pop up a real web browser (Firefox or 
IE) and run the tests inside the browser.  This is great when you're testing 
javascript, but pretty-durn-slow compared to Mech.  An advantage is that you 
can write tests interactively in the Selenium IDE and then incorporate those 
tests in your normal tests suite.  The IDE is good for recording client 
testing so you can reproduce bugs that they find as many times as it takes to 
get the issue fixed.

Something to keep in mind, though, is that you probably don't want to do all 
of your tests via mech or selenium.  If your application is well-structured, 
you should be able to easily test individual components.  Some helpful 
modules in this department are Test::MockObject (for faking parts of your app 
that you don't want to test) and Test::Class for unit testing classes.  If 
your web application framework of choice doesn't come with a test server, 
then you'll want to read up on Apache::Test.  (Now's a good time to mention 
that Catalyst applications are extremely easy to test; you can use 
Test::Catalyst for basic get/post stuff, Test::WWW::Mechanize::Catalyst if 
you want to use mech, and Test::WWW::Selenium::Catalyst if you want selenium.  
Those modules take care of the details for you, so you can just write the 

> More specifically, beyond the usual feature-based testing, I'll need to
> stress test it to demonstrate scalability. 

This is a little different from functionality testing.  You'll probably need 
to do it "manually" with a tool like siege.


> Testing the app will require 
> authentication but not SSL (not in v1.0, anyway).  For expediency, I'll
> use an Apache layer for authentication initially, with the possibility
> of a cookie-based approach later.

Mech will handle both cookies and SSL.

Jonathan Rockway
package JAPH;use Catalyst qw/-Debug/;($;=JAPH)->config(name => do {
$,.=reverse qw[Jonathan tsu rehton lre rekca Rockway][$_].[split //,
";$;"]->[$_].q; ;for 1..4;$,=~s;^.;;;$,});$;->setup;

More information about the Chicago-talk mailing list