Ein Test Tool für HTTP basierte Software

Ein Test Tool für HTTP basierte Software

Hello World

Das HTTP Test Tool Projekt hilft Entwickler beim Testen von HTTP basierter Software. In der neusten Version 2.1.0 wurde der Code grundlegend aufgeräumt und modularisiert. Neben dem HTTP Protokoll wird auch das ICAP, NTLM, POP3 und SMTP Protokoll unterstützt.

Das HTTP Test Tool Projekt wurde von mir im Sommer 2007 ins Leben gerufen. Das Herz des HTTP Test Tool Projekt ist der httest, ein scriptbasiertes Test Tool spezielle entwickelt für das HTTP Protokoll. Es können sowohl Clients wie Server emuliert werden und das in ein und dem selben Testscript. Dies macht den httest unverzichtbar für das Testen von Proxy oder komplexen Webapplikationen. Auch Client Software wie Browser oder Fat Clients können mit dem httest getestet werden. Neben dem einfachen HTTP Protokoll kann er auch HTTPS, ICAP und NTLM . Ausserdem können auch POP3 und SMTP abgebildet werden. Eine Webapplikation, welche Emails versendet, kann somit vollständig getestet werden. Sowohl das Auslösen des Mails (HTTP Request) wie auch das Prüfen (POP3) kann in einem Test Script abgebildet werden.

Installation

Um die ersten Schritte zu tun muss der httest erst bezogen werden. Wir brauchen mindestens die httest Version 2.1.2. Der Source Tar von httest kann bei Sourceforge http://sourceforge.net/projects/htt/files/htt2.1/ heruntergeladen und mit dem berühmten Dreisatz

make configure && make && make install

konfiguriert, gebaut und installiert werden.

Der Hilfetext des httest ist unspektakulär und gibt einen kurzen Überblick der vorhandenen Optionen. Der eigentliche Test muss in einem httest Script definiert werden. Mit dem Kommando

httest -L

können die Befehle des httest aufgelistet werden. Und ein

httest -C<Dein Befehl>

gibt den Hilfetext zum gewünschten Befehl wieder.

Eine kleine Applikation zum Testen

Für unser Hello World Test brauchen einen Apache mit php. Wir wollen nun eine einfach mailer.php Seite

<html>
<body>
Hello World
<?php
if (isset($_REQUEST['from'])) {
$from = $_REQUEST['from'] ;
$to = $_REQUEST['to'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
if (mail($to, $subject, $message, "From:" . $from)) {
echo "Thank you for using our mail form";
}
else {
echo "Could not send to $to";
}
}
else {
echo "<form method='post' action='mailer.php'> From: <input name='from' type='text' /><br /> To: <input name='to' type='text' /><br /> Subject: <input name='subject' type='text' /><br /> Message:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>";
}
?>
</body>
</html>

anlegen, welche wir mit einem Browser mit http://localhost/mailer.php aufrufen können.

End to End Test

Nun wollen wir unser Hello World Test Script beginnen und anschliessend ausbauen. Zuerst brauchen wir einen Client, welcher einen Request an http://localhost/mailer.php sendet.

CLIENT
_REQ localhost 80
__GET /mailer.php HTTP/1.1
__Host: localhost
__User-Agent: httest
__
_WAIT
END

Mit CLIENT wird ein Client Thread gestartet. Der _REQ baut die Verbindung auf. Die anschliessenden Zeilen definieren den eigentlichen Request. Der _WAIT Befehl sendet den Request schlussendlich ab und wartet auf die Antwort des Servers. Das alleine ist aber noch kein Test, wir wollen auf etwas bestimmtes warten z.B. auf ein HTTP/1.1 200 OK des Servers. Dazu setzen wir

_EXPECT heades “HTTP/1\.1 200 OK”

vor das _WAIT. Falls nun kein 200 OK vom Server zurück kommt wird unser Test mit einem FAILED terminieren, ansonsten mit einem OK. In unserem Fall sollte der Test mit einem OK terminieren.

Nun können wir unser Test Script nochmal laufen lassen, als Antwort werden wir das Formular erhalten. Wir erweitern unser Test Script mit

_EXPECT body “<form method”

was ebenfalls vor das _WAIT kommt. Nun wollen wir den nächsten Request senden.

_REQ localhost 80
__POST /mailer.php HTTP/1.1
__Host: localhost
__User-Agent: httest
__Content-Type: application/x-www-form-urlencoded
__Content-Length: AUTO
__
_-from=foo%40bar.ch&to=hans.muster%40gmx.de&subject=Test+Test&message=foobar+blabla
_WAIT

Es soll also ein Mail an hans.muster@gmx.de gesendet werden mit der message “foobar blabla”. Als Antwort erwarten wir natürlich einen 200 OK und Thank you for using our mail form. Die folgenden zwei Regeln

_EXPECT headers “HTTP/1\.1 200”
_EXPECT body “Thank you for using our mail form”

werden dies testen und werden vor dem _WAIT des zweiten Requests definiert. Unser Test sollte nun noch immer mit OK terminieren und ein Mail sollte in der definierten Mailbox sein. Nun wollen wir dies automatisch testen. Ich habe dies mit meinem GMX Account ausprobiert. Achtung GMX erlaubt nicht beliebig oftes einloggen, man muss dann für eine Minute warten. Ok starten wir nun mit einem

_SLEEP 10000

und geben wir dem Mail ein bischen Zeit, bevor wir prüfen ob es da ist.

Das follgende Snipplet zeigt, wie man das Mail aus dem Mail Account lesen und prüfen kann.

Die Macros des httest Packets werden nicht installiert, sind aber im httest-2.1.x/macros zu finden. Zuerst müssen wir das POP3 Modul Macro laden, was vor dem CLIENT geschehen muss:

INCLUDE /path/to/macros/pop3.htb

Und nach dem zweiten Request wird nun das Mail Account mit POP3 abgefragt.

_POP3:CONNECT pop.gmx.net 110
_POP3:SEND “USER hans.muster@gmx.ch”
_POP3:WAIT
_POP3:SEND “PASS sehrgeheim:)”
_MATCH . “OK mailbox .* has ([0-9]+) messages” NUMBER
_POP3:WAIT
_POP3:SEND “RETR $NUMBER”
_EXPECT . “foobar blabla”
_POP3:WAIT_MULTI
_POP3:SEND “QUIT”
_EXPECT . “\+OK”
_POP3:WAIT

Zuerst wird das Login durchgeführt. Sobald das Passwort übermittelt wurde, teilt GMX die Anzahl Mails mit, was sehr pratkisch ist. Wir schneiden uns diese Info mit dem _MATCH Befehl aus. Die Nummer die wir ausgeschnitten haben zeigt auf unser gewünschtes Mail. Natürlich muss in einer richtigen Testumgebung der Mail Zugang soweit gesichert sein, dass sonst niemand Mails sendet. Der Befehl _EXPECT . “foobar blabla” testet nun ob dies auch wirklich in diesem Mail drin steht.

Damit haben wir in einem Testscript einen ganzen Workflow abgebildet und getestet. Natürlich kann man mit noch mehr _EXPECT Commandi das ganze detailierter und genauer testen.

FAZIT

Der httest ist sehr gut geeignet einen komplexen Workflow einer Webapplikation vollautomatisch zu testen. Der httest wird stetig weiterentwickelt. Aus der Download Statistik ist ersichtlich, dass der httest Weltweit heruntergeladen wird. Projekte wie mod_qos, mod_parp, mod_setenvifplus oder das Monkey HTTP Daemon setzen den httest für die Qualitätsicherung ein.

Die httest Version 2.0.x ist die momentane produktive Version, für welche weiterhin Bugfix Releases erscheinen. Die httest Version 2.1.x wurde grundlegend Umgebaut und modularisiert und ist auf dem Weg auch produktiv eingesetzt werden zu können. Der neue httest hat die Möglichkeit geschaffen alles mögliche als HTTP Quelle zu verwenden, experimentell wurde z.B. das udp_module geschrieben. In Planung ist ein pcap Module um Captures als Quelle zu nutzen.

Den httest setze ich persönlich schon seit Jahren bei der Arbeit ein um unsere Software zu testen. Ich arbeite stetig daran den httest noch besser zu machen.

E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben