Türchen 17: Funktionales Testen und Continues Integration in 5 Schritten
Viele Entwickler schrecken davor zurück, funktionale Tests zu nutzen. Hauptargumente sind die langen Ausführungszeiten und das aufwendige Setup. Die langen Ausführungszeiten sind allerdings akzeptabel, wenn die Tests unabhängig von der Entwicklung auf einem entfernten Rechner ausgeführt werden. Das Setup möchte ich hier in fünf einfachen Schritten beschreiben.
Voraussetzung für alle weiteren Schritte ist ein Versionsmanagement – genauer SVN oder Git. Es wird ein Versionsmanagement benötigt, auf den die Continues Integration zugreifen kann – ein interner GIT-Server taugt hier zum Beispiel ebenso wie GitHub oder Bitbucket.
Schritt 1: Selenium
Die Selenium IDE ist vielen bekannt und ein denkbar einfach zu bedienendes Plugin für Firefox. Mit dem Plugin kann Interaktion mit einer Webseite aufgezeichnet und später wieder ausgeführt werden. Bei komplexeren Webseiten sind vor allem zwei Arten von Nacharbeiten notwendig: Werden Ajax-Request ausgeführt, so muss Selenium mitgeteilt werden, woran der erfolgreiche Abschluss erkannt werden kann. Außerdem müssen gelegentlich die Pfade der HTML-Elemente überarbeitet werden, um ein stabiles Ergebnis zu erhalten. Lässt sich der Selenium-Test erfolgreich ausführen, ist Schritt 1 abgeschossen. Das Ergebnis wird als Selenium-HTML-Datei gespeichert und in Schritt 5 wieder benötigt.
Weiterführende Informationen zu Selenium:
Nun benötigen wir einen Server mit einem aktuellen Ubuntu; auch eine virtuelle Maschine reicht in aller Regel aus. Natürlich funktionieren auch andere Linux-Systeme, die allerdings teilweise mit anderen Paket-Managern daherkommen. Entsprechend werden dann auch andere Befehle zur Installation benötigt. Auf dem System müssen wir nun imagemagick, git, java und ggf. firefox installieren. Dazu benötigen wir in einer Shell die folgenden Befehle:
Das System soll mit Selenium einen Browser steuern und dieser Browser benötigt einen Bildschirm. Da wir aber (in aller Regel) keinen Bildschirm an das System anschließen können oder wollen, muss unser Bildschirm virtuell sein. Dazu installieren wir X Window Virtual Framebuffer – kurz Xvfb:
apt-get install xvfb
Den virtuellen Bildschirm testen wir zunächst mit der Dummy-Applikation xclock, die eine Uhr darstellt:
Nun installieren wir das Continues Integration System: Hudson. Der Prozess sollte mit Jenkins analog funktionieren, ich habe es allerdings nicht ausprobiert. Hierzu sind ein paar Schritte notwendig, deren Bedeutung in den Links am Ende des Abschnitts nachvollzogen werden können:
Der Port, unter dem Hudson läuft, wird in der Datei /etc/default/hudson der Port auf 8081 umgestellt, denn den Standard-Http-Port 80 benötigen wir für Selenium. Dann wird Hudson (oder wenn nicht bekannt wie, der ganze Server) neu gestartet.
Nun beginnt die Arbeit mit Hudson im Web-Browser. In unserem Fall ist Hudson unter http://c4b-hudson.c4b.local:8081/ zu finden. In Hudson selbst sollte zunächst ein Benutzerkonto angelegt werden, um den öffentlichen Zugriff zu verhindern. Dann müssen die folgenden Plugins für Hudsons nachinstalliert werden: „Seleniumhq“ und „Selenium“ HTML. Dies ist in Hudson unter „Manage Hudson“ und dann „Manage Plugins“ möglich.
Schließlich benötigen wir eine aktuelle Version des Selenium Standalone Servers. Dieser ist unter http://www.seleniumhq.org/download/ zu haben und wird im Server unter /var/lib/hudson/ abgelegt. Der Besitzer der Datei muss mit chown auf hudson gesetzt werden. Zurück im Browser wird in Hudson unter Magage Hudson und Configure System die Einstellung Selenium Remote Control auf den Pfad des Selenium Standalone Servers gesetzt, also z.B. /var/lib/hudson/selenium-server-standalone-2.38.0.jar.
Weiterführendes Links zu Hudson:
Innerhalb von Hudson muss nun ein Build angelegt werden. Voraussetzung ist ein GIT-Server, der vom Hudson-Server aus zugänglich ist. Im folgenden Bild werden allgemeine Daten angelegt und der virtuelle Bildschirm als Parameter angegeben. Existieren später mehrere Tests, die parallel laufen sollen, so benötigen sie unterschiedliche Nummern für die verschiedenen Bildschirme.
Dann werden wird der Zugriff auf das Versionsmanagement eingetragen. Wir nutzen unser GIT per http hinter einer Firewall, so dass der Zugriff denkbar einfach ist. Bei komplizierten Zugriffen ist möglicherweise ein Blick ins Hudson-Handbuch notwendig.
Dann werden drei Befehle konfiguriert, die später von Hudson in der Shell ausgeführt werden und schließlich wird Selenium selbst gestartet. Der Erste Befehl startet den virtuellen Bildschirm. Der zweite und dritte Befehl löschen den Cache und setzten Berechtigungen zurück – sie können bei korrekte Konfiguration entfallen, für den Test lassen wir sie drin:
Voraussetzung ist, dass unter dem Pfad selenium/Hach.html aus dem Git auch wirklich eine Selenium-Datei liegt. Diese wurde in Schritt 1 erzeugt. Außerdem muss ein Zugriff auf http://c4b-hudson.c4b.local/hach/ möglich sein und auf das Projekt zeigen. Dazu muss ein Symbolischer Link Verzeichnis /var/www auf das Projekt gelegt werden.
Wenn alles geklappt hat, ist es nun geschafft: Hudon zeigt die erfolgreichen Tests an:
Fazit
Gewusst wie ist sind funktionale Tests mit Selenium in einer Continues Interation eine Aktion von wenigen Stunden von nichts bis zum funktionierenden Setup. Für einen einzelnen Entwickler von fraglichem Nutzen profitiert schon ein kleines Team von dieser Kombination sehr.