Testing complex Webapps with wget

How do you test web applications? You can use Selenium, but Selenium is very heavy.

I tried wget.

To find out what exactly to send to the app, I started Firebug inside Firefox, went to the “Network” section and recorded what I would do, to see, whether the application works. Then I took the accessed URLs together with the parameters and first tried to send them manually from the command line. Observe, that Firebug lets you copy the exact POST/GET parameter as was sent by the browser, when you right click on the POST/GET command in the Firebug Network log. Once I managed to redo all the steps manuall from the commandline I transferred what I did into a script and edited it until it was nice and would run through:

$ history > test_my_web_app
test_my_web_app now looks as follows:
#!/bin/bash
#
# check availability of:
url="http://www.example.org/my-app" 

# exit immediately if something goes wrong -> test fails!
set -e

echo "Testing $url" 

# save an error log in case there's an error so that
# we can analyse it further
error_log=$( mktemp )
cookies=$(   mktemp )

echo "In case the tests fail, you'll find the error log under $error_log" 
# send everything that goes to STDERR to the log
exec 2>$error_log

echo "Getting a cookie..." 
wget --save-cookies $cookies "$url" -O /dev/null

# we could put username/password directly into the script but we're cautuous and don't
echo -n "please enter user for $url: ";     read    user
echo -n "please enter password for $url: "; read -s pass
echo

echo "Logging in..." 
# if we logged in successfully, then the webapp will send us an html page
# that contains the following string:
to_verify="You're logged in" 
# POST to the webapp:
wget --load-cookies $cookies \
     --post-data "login=Login&user_login=$user&user_password=$pass" \
     --save-cookies $cookies \
     --keep-session-cookies \
     "$url/login" \
     -O - \
| grep -q "$to_verify" 

# now we're logged in

echo "Query component DB..." 
# First search the DB (parameters need to be URI encoded...)
num_components_found=$(
  wget --load-cookies $cookies \
       --save-cookies $cookies \
       --post-data 'action=set_params&crit%5Bcolor%5D=red&crit%5Bmin_size%5D=0' \
       "$url/prepare-picture" \
       -O - \
  | grep 'Number of matching components:' \
  | sed 's/.*Number of matching components:<\/td><td>//; s/<.*//' )

echo "Make sure that the app found something..." 
[ $num_components_found -gt 0 ]

echo "Generate and get picture..." 
wget --load-cookies $cookies \
     --save-cookies $cookies \
     --post-data 'index=0' \
     "$url/get-pic" \
     -O /dev/null

echo "Hooray, $url successfully tested" 

rm $error_log
rm $cookies
<pre>

Surprisingly easy, isn't it?

spam acl condition: error reading from spamd socket: Connection reset by peer

FOSS4G 2010 Barcelona

Translation of Twinkle SIP phone presentation

Graphing ping times

Folien QGIS User Meeting Bern