Automatische Tests, und warum wir sie brauchen
Wie bei jeder guten Software müssen auch Webanwendungen ausreichend getestet werden. Testen ist immer aufwändig, zeitraubend, anstrengend, entwicklungsintensiv und meistens auch noch einfach nervig. Niemand mag es wirklich, aber es ist absolut nötig und unvermeidbar, will man ein akzeptables Produkt auf die Beine stellen. Die großen CMS-Frameworks (wie z.B. auch das von uns genutzte Drupal) stellen Testmöglichkeiten zur Verfügung. Hier muss jeder "Testcase" einmalig programmiert werden, und wird dann nach jeder Code-Änderung wieder aufgerufen, um die - hoffentlich noch intakte - Arbeitsweise der Software zu verifizieren.
Hier kommt Selenium ins Spiel. Selenium setzt nicht am Backend an wie andere Testverfahren, sondern kommt vom Frontend, dem Webbrowser her. Dies vereinfacht einerseits die Bedienung und andererseits können somit leichter Frontend-spezifische Testfälle abgeprüft werden. Auch Nicht-Programmierer können mit Selenium Testfälle erstellen. Ich möchte heute eine kleine Einführung in Selenium und seine Bedienung geben.
Installation der Selenium IDE in Firefox
Die Selenium IDE lässt sich sehr einfach als Firefox-Plugin installieren. Dazu geht man auf www.seleniumhq.org auf die Download-Seite und klickt den neuesten "Selenium IDE" Release an. Firefox installiert dann die Extension. Nach dem Neustart des Browsers und Aufruf des Plugins (Extras -> Selenium IDE) ergibt sich das Bild (siehe Bildanhang).
Auf der linken Seite (1) sieht man eine (noch leere) Liste von Testfällen in dieser Testsuite, auf die rechte Seite kommen alle Befehle, die in diesem Test ausgeführt werden (2). Darunter die Einzelansicht eines Befehls, mit dem praktischen "Find"-Button (3). Im unteren Bereich kommen Fehlermeldungen/Statusmeldungen (3). Wichtig sind auch die Buttons, mit denen man eine komplette Testsuite oder einen einzelnen Test ausführen kann, und der Record-Button der - wie bei einem Makro - die Aktionen des Benutzers aufzeichnet. Der Record-Button ist immer ein guter Start, um einen Test anzulegen. Man kann damit alle Eingaben (Mausklicks und Tastatureingaben) aufzeichnen, und so komplette Formulare ausfüllen und abschicken.
Aufbau eines Testes
Nun, aus was besteht nun eigentlich so ein Test? Der Sinn eines Testes ist es ja, zu zeigen, das eine Software/Webseite das tut, was man von ihr erwartet. Es müssen also Aktionen ausgeführt werden, und danach muss überprüft werden, ob auch das richtige passiert ist. Hierzu bietet Selenium (bzw. die Selenium-eigene Programmiersprache Selenesisch") viele Interaktionsmöglichkeiten an, die auch im Recording-Modus direkt aufgezeichnet werden. In der Regel findet man dort solche Aktionen wie:- Klicken eines links
- Eingabe in ein Textfeld
- Auswahl einer Option
Ein Selenium-Kommando besteht aus drei Teilen (meist nur zwei), dem Kommando (Command), dem Ziel (Target) und ein Value, das es nicht bei allen Aktionen gibt. Ein solches Kommando bzw. abfolge von Kommandos könnte zum Beispiel so aussehen:
Hier habe ich auf meiner Webseite auf den Link "Login" geklickt, dann in zwei Textfeldern meinen Usernamen und mein Passwort angeben, und dann auf den Submit-button geklickt. Hier sieht man schon gut, das es mehrere Varianten von Kommandos gibt. Im Beispiel wir einmal "click" und einmal "clickAndWait" aufgerufen. Diese Kommandos machen das gleiche, nur "clickAndWait" wartet nach dem klicken darauf, das sich die Seite neu lädt. Dies benötigt man, wenn man auf einen Link klickt. Meistens zeichnet der Recorder die Aktionen so auf, das sie dies berücksichtigen, aber manchmal muss man auch manuell nachbessern. Die xxxAndWait-Variante gibt es von den meisten Befehlen.
Nehmen wir an, ich würde diesen Loginprozess als Testfall nutzen wollen. Mit dem "Play current test case" Button kann ich den Vorgang immer und immer wieder abspielen. Aber irgendwie fehlt mir jetzt ja die Bestätigung, das es auch geklappt hat? Hierfür bietet Selenium "verify" und "assert" - Aktionen an. Nehmen wir an, nach erfolgreichem Login würde auf meiner Webseite der Text "Herzlich Willkommen Herr Kauschke" erscheinen. Diesen Text könnte ich jetzt als Verifizierung für einen erfolgreichen Login benutzen. Dies geht natürlich mit Selenium besonders einfach. Die Selenium-IDE bietet ein erweitertes Kontextmenü beim Rechtsklick auf ein Element der Webseite. Dort sieht man unten schonmal die häufigsten Optionen, und im erweiterten Menü noch eine ganze Menge mehr davon! In unserem Fall rechtsklicken wir auf den Text "Herzlich Willkommen Herr Kauschke" und wählen aus dem Kontextmenü "assertTextPresent Herzlich Willkommen Herr Kauschke". Dies hat zur Folge, das Selenium prüft, ob irgendwo auf der Seite dieser Text vorhanden ist. Sollte er nicht vorhanden sein, schlägt der Testcase fehl und die Testsuite bricht ab. Dies ist auch der kleine Unterschied zwischen "verify" und "assert". Wenn ein Verify-Test fehlschlägt, bricht nicht gleich der ganze Testlauf ab, sondern die restlichen Testfälle werden weiter abgespielt. Da "assertTextPresent" oftmals nicht die gewünschte Genauigkeit liefert - z.B. wenn man testen möchte ob in dem Div mit der ID="meinDiv" ein bestimmter Text steht, gibt es bei Selenium viele ähnliche verify- und assert-Befehle, die mit sog. Locatoren zusammenarbeiten. Die obige Verifikation könnte auch so aussehen:
Hier würde jetzt geprüft, ob in dem div mit der ID "loginmessage" der geforderte Text steht. Oftmals muss man Locatoren per Hand eingeben/anpassen, da das Kontextmenü nicht die nötige Spezifizität liefert. Mehr Infos über Locatoren gibt es in der hervorragenden Selenium-Dokumentation auf seleniumhq.org. Die "Find"-Funktion der Selenium-IDE hilft dabei, den richtigen Locator zu finden, indem Sie das aktuell "locatete" HTML-Element im Webbrowser markiert.
Ich hoffe Anhand dieses sehr simplen Beispieles konnte ich die Fähigkeiten von Selenium etwas schmackhaft machen. Wir nutzen es regelmässig, um auch komplexere Testabläufe zusammenzustellen. Das erstellen von solchen Testabläufen ist wirklich sehr aufwendig, dafür wird man dadurch entschädigt, das man sie im Nachhinein nurnoch "abspielen" muss. Der Vorteil von Selenium gegenüber Backend-Unit-tests ist, das man auch komplexere Interaktionen mit Javascript/Ajax Effekten damit testen kann.
Selenium auf anderen Browsern
Auch wenn die Selenium IDE nur unter Firefox verfügbar ist, kann man Selenium-Tests auch unter anderen Browsern ausführen. Dies wird durch Selenium-RC bewerkstelligt. Das ist aber nochmal eine ganz andere Geschichte, und nicht so einfach zu handhaben wie das IDE-Plugin für Firefox.
Für weitere Informationen möchte ich hier gern auf die Seleniumhq-Webseite und dortige Dokumentation verweisen. Dort ist wirklich sehr anschaulich erklärt, wie das ganze funktioniert, und welche Möglichkeiten Selenium bietet. Eine gewisse Einarbeitungszeit ist sicher auch vonnöten, doch man kann schon nach relativ kurzer Zeit eigene Tests bauen. Selenium HQ Webseite











