Open Source im professionellen Einsatz
Linux-Magazin 10/2006

Automatische Regressionstests mit Selenium

Browser ferngesteuert

Das Testen komplexer Webapplikationen erfordert nicht unbedingt teure proprietäre Tools wie Test Director oder Silk Performer: Selenium gibt's umsonst. Es steuert alle gängigen Browser unter verschiedenen Betriebssystemen fern und lässt sich unter anderem mit Perl programmieren.

634

Ob eine Webapplikation nach einer Veränderung des Code noch funktioniert, vermag der Entwickler nur dann mit Sicherheit zu sagen, wenn er alle Funktionen mit einem Browser durchspielt, also jede Seite aufschlägt, jeden Button drückt und jedes Feld ausfüllt. Und das nicht nur einmal, denn sowohl Erfolgs- als auch Fehlerszenarios sollte man mehrfach überprüfen.

Dem Entwickler oder den Mitarbeitern der Abteilung für Qualitätssicherung macht es sicherlich wenig Freude, solche monotonen Tests manuell auszuführen. Zudem birgt dies Vorgehen die Gefahr menschlicher Fehler. Ein automatischer Test erledigt die Aufgabe besser.

Javascript im Test

Einfache Webapplikation lassen sich mit Screenscrapern wie dem CPAN-Modul WWW::Mechanize testen. Dieses Tool steigt jedoch aus, wenn Javascript ins Spiel kommt. Zwar mangelt es nicht an Javascript-Implementationen mit zugehörigen Perl-Schnittstellen, doch für die Interaktion zwischen der Javascript-Engine und dem DOM (Document Object Model) des Browsers gab es bisher keine zufriedenstellende Lösung.

Die Aufgabe ist auch ganz schön komplex: Javascript manipuliert das HTML geladener Seiten, löst sich wiederholende Aktionen aus, öffnet Fenster oder holt neue Daten vom Server und lässt sie in die Seite einfließen. Außerdem hat jeder Browser seine Tücken und Unterschiede in der DOM-Implementation.

Einfach und effektiv

Nun hat die Firma Thoughtworks das Open-Source-Projekt Selenium [2] veröffentlicht, mit dem das Problem einfach zu lösen ist. Das in Java geschriebene Programm füttert einen Webbrowser mit Javascript-Code, der es ihm ermöglicht, die Kontrolle über den Webclient zu übernehmen und Tests zu automatisieren. Welche Anweisungen der Selenium-Server dem Browser erteilt, bestimmen in Perl, Python, Ruby, Java oder Dotnet geschriebene Skripte. Die Kontrolle über den Datenverkehr zwischen Internet und Browser behält Selenium, indem es sich als Proxy dazwischenschaltet.

Abbildung 1 zeigt ein einfaches Webformular, das Userkommentare entgegennimmt. Vor dem Kommentartext gibt der Benutzer seine E-Mail-Adresse an, damit ihm der Webmaster antworten kann. Damit das E-Mail-Feld nicht irrtümlich leer bleibt oder anderen Text enthält, überprüft das Javascript-Programm die Eingabe, wenn der Benutzer den »Send«-Button drückt. Stellt es einen Fehler fest, zeigt es eine Warnung an, statt den Kommentar an den Server zu schicken.

Bei Eingabe einer syntaktisch gültigen Mailadresse gibt das hinter der »ACTION«-URL stehende CGI-Skript »/cgi/feedback.cgi« die Meldung »Thanks for your feedback!« zurück. Der Test soll das Aufklappen des Warnfensters im Falle einer ungültigen Eingabe ebenso verifizieren wie die Erfolgsmeldung.

Listing 1 zeigt das Testskript »emailcheck«, das zunächst eine Verbindung zum Selenium-Server aufbaut. Dieser öffnet auf den Befehl »start()« hin einen Firefox-Browser in einer isolierten Session. »open()« veranlasst ihn danach dazu, die HTML-Seite aus Abbildung 1 vom Webserver zu holen, die den Javascript-Code zur E-Mail-Prüfung enthält.

Listing 1:
»emailcheck«

01 #!/usr/bin/perl -w
02 use WWW::Selenium;
03 use Log::Log4perl qw(:easy);
04 Log::Log4perl->easy_init($DEBUG);
05
06 my $url = "http://perlmeister.com";
07
08 my $sel = WWW::Selenium->new(
09   host => "localhost",
10   port => 4444,
11   browser => "*firefox " .
12     "$ENV{FIREFOX_HOME}/firefox-bin",
13   browser_url => $url,
14 );
15
16   DEBUG "Starting";
17 $sel->start();
18
19 $sel->open("$url/test/mail.html");
20   DEBUG "Typing email";
21 $sel->type("from", 'abcde');
22   DEBUG "Clicking send";
23 $sel->click("send");
24 my $alert = $sel->get_alert();
25   DEBUG "alert was '$alert'";
26
27   DEBUG "Opening";
28 $sel->open("$url/test/mail.html");
29   DEBUG "Typing email";
30 $sel->type("from", 'abcde@foo.com');
31   DEBUG "Clicking send";
32 $sel->click("send");
33 $sel->wait_for_page_to_load(50000);
34 my $body = $sel->get_body_text();
35   DEBUG "Response was '$body'";
36
37 $sel->stop();

Abbildung 1: Das zu testende Webformular nimmt eine E-Mail-Adresse entgegen und prüft die Eingabe auf Gültigkeit.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.