Testautomatisierung mit Selenium und PHP

In den vergangenen letzten vier Monaten habe ich auf Berufswegen eine Menge dazugelernt. Besonders im Bereich der Testautomatisierung. In meinem neuen Job, als Senior Web Developer bei Sauce Labs, dreht sich alles um Softwarequalitätssicherung. Während ich tagtäglich damit beschäftigt bin Testinfrastruktur zu verbessern und bereitzustellen möchte ich hier, in einer Serie von Blogposts, meine Erkenntnisse zum Thema „Testen“, mit Euch, hoffentlich interessierten Lesern, teilen.

Zum Auftakt möchte ich Euch mit der eigentlich Thematik vertraut machen. Dafür gibt es keine bessere Methode als die Idee anhand eines praktischen Beispiels zu verdeutlichen. Wir wollen das heute mit Hilfe der Programmiersprache PHP tun. Über die Popularität und die Verbreitung dieser Programmiersprache muss ich wohl kein weiteres Wort verlieren. Natürlich würde ich gerne von Euch hören, wenn Ihr euch ein Beispiel in Eurer Lieblingssprache wünscht. Ihr könnt mir einen Kommentar hinterlassen oder mich auf Twitter drangsalieren! Ich freue mich über jede Form von konstruktivem Feedback.

Vorab ein wenig Theorie zu Architektur, Konzepten, Technologie und Standards die in meinem praktischen Beispiel Anwendung finden. Dabei gehe ich davon aus, dass Ihr nicht grundsätzlich fachfremd seid und bereits Erfahrung mit Softwareentwicklung und die Basics mit PHP mitbringt. In jedem Fall solltet Ihr auch ohne Vorkenntnisse in der Lage sein mein Beispiel erfolgreich durchzuführen. Haltet Euch dabei einfach an die Schritt für Schritt Abfolge.


Los geht’s! – Was ist Selenium und warum brauche ich das?

Selenium wurde aus der Not heraus geboren und zwar um die menschliche Interaktion mit Browsern zu simulieren. D.h. bei Selenium handelt es sich um eine Technologie die es Euch erlaubt Kommandos an einen Browser zu senden und dieser Browser führt diese aus, als ob ein Mensch per Maus und Tastatur mit dem Browser interagieren würde.

Selenium dient Softwareentwicklern dazu Testskripten zu schreiben um Webanwendung auf Herz und Nieren zu prüfen. Diese Testskripten können beliebig oft wiederholt ausgeführt werden und vermeiden somit die mit Fehler verbundene Notwendigkeit wiederkehrende Abläufe händisch durchzuführen.

Selenium besteht im wesentlichen aus zwei Bestandteilen:

  1. Einem Server welcher dauerhaft auf den Empfang von auszuführenden Kommandos von Euren Testskripten wartet.
  2. Eine Ansammlung von Browser-Erweiterungen, genannt Driver, die eine Browser unmittelbar aus der Ferne durch den Server kontrollierbar machen.

Der Selenium Server kommuniziert per HTTP mit den Client-Bibliotheken, was wiederum die Kommunikation mit dem Server erleichtert und das Kommunikationsprotokoll neutral zu verwendbaren Programmiersprachen implementiert. Prinzipiell kann jede Programmiersprache mit HTTP Bibliothek, wie z.B. PHP, mit diesem Server kommunizieren. Keine Sorge… Kopfschmerzen über HTTP Anfragen bleiben Euch erspart. Glücklicherweise gibt es bereits einige PHP Bibliotheken die diese Funktionalität eleganter, transparenter und vor allem leicht verständlich für PHP Entwickler bereitstellen.

Historisch bedingt ist es sicherlich hilfreich zu erwähnen, das Selenium bereits einen Generationssprung hinter sich hat. D.h. es gibt Selenium 1 (genannt: Selenium Remote Control) und Selenium 2 (genannt: WebDriver). Wir beschäftigen uns in diesem Post ausschließlich mit Selenium 2. Das ist insofern wichtig, wenn Ihr euch Rat und Informationen aus dem Netz holen wollt. Bitte achtet darauf welche Selenium-Version diskutiert wird.

Folgendes Schaubild verdeutlich die Architektur von der wir bereits gesprochen hatten:

Sieht man sich das Schaubild genauer an stellt man fest, dass davon ausgegangen wird, dass alle beteiligten Komponenten (Testskripten, Selenium Server und die von die jeweiligen Browser + Driver Erweiterungen) auf Eurem Computer laufen. Es könnte sich dabei auch um einen Computer in Euerem lokalen Netz (LAN) handeln. Euer Skript-Code (geschrieben mittels PHP Selenium Bibliothek) schickt Kommandos an den Selenium Server, welcher diese Kommandos wiederum an die jeweiligen verfügbaren Browser koordiniert weiterleitet. Resultate werden von den Browsern, über den Selenium Server, an Euren Testcode zurückgeführt. In diesen Testskripten können entsprechend Testbedingungen geprüft werden, die ausschlaggebend sind, ob ein einzelner Test erfolgreich verläuft oder fehlschlägt.

Selenium in dieser Konstellation aufzusetzen ist relativ simpel. Dabei kommt Euch zu gut, dass alle verwendeten Komponenten frei unter Open Source Lizenzen verfügbar sind. Die eigentliche Problematik entsteht dann, wenn Vielfalt gefragt ist. Bei allen verfügbaren Betriebsystemen und entsprechenden Browserversionen kommen wir auf 85+ Kombinationen. Das Aufsetzen und Warten einer kleinen Rechnerfarm kann sich hier zu einer Vollzeitstelle entwickeln. Noch dazu wird Know-how im Systemadministrationsbereich für unterschiedliche Plattformen und bestenfalls Virtualisierung benötigt.

Falls Ihr dennoch mehr zur lokalen Installation erfahren möchtet hinterlasst mir einen Kommentar oder meldet Euch über Twitter bei mir.

Um Euch den Einstieg zu erleichtern gehe ich in nachfolgender Schritt-für-Schritt-Anleitung davon aus, dass Ihr euch einen kostenlosen Account bei Sauce Labs‘ OnDemand Dienst anlegt. Sauce Labs‘ OnDemand basiert auf dem Selenium-Standards und erspart Euch die lokale Installation (mehr dazu im Schaubild weiter unten). OnDemand ist ein Cloud-Service (Platform as a Service), welcher Euch tausende von virtuelle Maschinen gespickt mit Browsern und unterschiedlichen Betriebssystemen in wenigen Augenblicken mittels des Selenium-Standards zur Verfügung stellt. Für die Nutzung von Sauce entstehen Euch keinerlei Kosten, da jeder kostenlose Zugang mit freien Testminuten ausgestattet wird. Diese kostenlosen Testminuten werden zusätzlich monatlich erneut. Wenn mehr als die bereitgestellten kostenlosen Testminuten benötigt werden können jederzeit Abos geschlossen werden, die sowohl mehr Testminuten, als auch höhere parallele Ausführung, zu fairen Preisen bereitstellen.

Falls Ihr hierzu Fragen habt könnt Ihr Euch gerne an mich wenden.

Die Idee hinter Sauce Labs‘ OnDemand Dienst ist lediglich die Adresse des lokalen Selenium-Servers, den eure Euere Testskripen verwenden, durch die Adresse des Sauces Selenium Server zu ersetzen. Das könnte beispielsweise durch eine Konfigurationsänderung realisiert werde oder lediglich ein oder zwei Zeilen Änderungen in Euren Skriptquellen nach sich ziehen. Keinerlei porträtiere Abhängigkeiten. Nachfolgendes Schaubild verdeutlicht diese Idee bildlich.

Wenn Eure Testskripten per PHP Bibliothek gegen den Sauce Selenium Server testen werden die Browser-Kommandos per HTTP über das Internet zum jeweiligen Wunsch-Browser geschickt. Gleiches passiert auf dem Rückweg für die Auslieferung der Resultate. Ein weitere positive Begleiterscheinung, wenn Sauces OnDemand als Selenium Backend verwendet wird, ist, dass Sauce Euch die volle Breite an gängigen Browser + OS Kombinationen zur Verfügung stellt. Dazu zählen auch mobile Browser, wie die von iPhones, iPads und verschiedenen Android Geräten.

Wir wissen nun genug über Sauces OnDemand Dienst und wollen unser Ziel nicht aus den Augen verlieren. Lasst und mit dem Testen loslegen…!

Was benötige ich um lokale Testskripten mit PHP ablaufen zu lassen?

Um Tests mittels PHP und Selenium auszuführen verwenden wir die Bibliothek Sausage. Es gibt vielerlei Alternativen in der PHP Community um mit Selenium zu kommunizieren. Persönlich habe ich bisher jedoch positive Erfahrungen mit Sausage gesammelt. Die Bibliothek basiert auf PHPUnit dem def-facto Standard im Bereich der Qualitätssicherung in Verbindung mit PHP.

In nachfolgenden Abschnitten werden die Schritte zur Installation von Sausage angeführt. Das soll jedoch nicht heissen, dass wir eine komplette Basisinstallation von PHP durchsprechen werden. All das würden den Rahmen dieses Blogposts sprengen. Bitte stellt sicher, dass Eure PHP Version mindestens 5.3 entspricht. Sausage wird mittels des PHP Paketmanagers Composer installiert, welcher wiederum notwendig Abhängigkeiten auflöst. Der Download der einzelnen Bibliotheken kann durchaus einige Minuten dauern.

In einem Verzeichnis eurer Wahl führt Ihr bitte folgende Kommandos aus (Mac OS X).

curl -s https://raw.github.com/jlipps/sausage-bun/master/givememysausage.php | SAUCE_USERNAME=<username> SAUCE_ACCESS_KEY=<access_key> php

Accountseite, unten links.

Bitte beachtet die Felder <username> und <access_key> mit Euren Sauce Labs Zugangsdaten zu ersetzen.

Falls Eure Tests auf Windows laufen sollen, dann downloaded bitte givememysausage.php (Rechtsklick: „Speicher unter…“ in euer Verzeichnis) und führt dieses entsprechend wie folgt mit PHP aus.

C:\sauce-tutorial> php givememysausage.php

Unter Windows müssen zusätzlich die Zugangsdaten folgendermaßen konfiguriert werden:

C:\sauce-tutorial> vendor\bin\sauce_config.bat <username> <access_key>

Damit ist Eure Umgebung bereits fertig installiert und konfiguriert!

Was muss ich nun tun um meinen ersten Selenium Test laufen zu lassen?

Nachdem wir erfolgreich unsere Testumgebung aufgesetzt haben wollen wir unseren allerersten Test ablaufen lassen. Somit können wir außerdem sicherstellen, dass unsere Umgebung ordnungsgemäß installiert wurde und funktioniert.

Unter Mac OS X:

vendor/bin/phpunit WebDriverDemo.php

Unter Windows:

C:\sauce-tutorial> vendor\bin\phpunit.bat WebDriverDemo.php

Was passiert nun? – Der PHPUnit Testrunner wird unter der Angabe der Datei, welche die Sausage-Beispieltestfälle beinhaltet, gestartet. Nach einigen Augenblicken sollte PHPUnit starten. Falls das nicht sofort sichtbar sein sollte bitte ich Euch um etwas Geduld. PHPUnit gibt pro ausgeführten Testfall entweder einen Punkt (.) im Erfolgsfall oder den Buchstaben „F“ im Fehlerfall aus. Das kann durchaus einige Sekunden dauern. Auf Euren Bildschirmen solltet Ihr schlussendlich eine Serie von Punkten und/oder Buchstaben „F“ erscheinen. Falls unter anderem der Buchstabe „E“ auf Eurem Bildschirm ausgegeben werden sollte, dann weißt dies darauf hin, dass bei der Ausführung eine Ausnahme, also ein Fehler, aufgetreten ist.

Während der Testausführung könnt Ihr Euch die momentan laufenden Tests auf dem Sauce Dashboard ansehen. Wenn Ihr auf einen laufenden Test klick könnt Ihr diesem in Echtzeit bei der Ausführung per Live-Video zusehen. Wenn die Ausführung bereits abgeschlossen ist kann die Videoaufzeichnung nachträglich verfolgt werden.

Sequentielle Testausführung

Obwohl Sausage mit mehren Beispieltestfällen ausgestattet ist wird Euch sicherlich auffallen, dass immer nur ein Testfall gleichzeitig, also alle Testfälle sequentiell, ausgeführt werden. Das liegt daran, dass PHPUnit grundsätzlich nicht dafür ausgelegt ist Testfälle parallel auszuführen. Während das für eine lokale Installation, auf Grund der begrenzten Kapazitäten einer einzelnen Maschine, ausreichend sein mag kann man durch parallele Ausführung einen massiven Geschwindigkeitsvorteil erzielen. Besonders dieser Aspekt steht bei Sauce Labs‘ OnDemand Dienst im Vordergrund. Sauce Labs verfügt über massive Kapazitäten an virtuellen Browsern die nach Bedarf sekundenschnell bereitgestellt werden.

Bitte beachtet, dass Euer kostenloser Sauce Labs Account auf zwei parallele Tests beschränkt ist. Mit einem optionalen Abo kann diese Parallelität erheblich erhöht werden.

Kann ich Tests auch parallel ausführen?

Auf jeden Fall! Das solltet Ihr auch! Besonders um den Geschwindigkeitsvorteil von paralleler Tests auszuspielen.

Mit Mac OS X geht das wie folgt. Das Argument „processes“ steuert dabei wieviele parallele Tests ausgeführt werden sollen. Paratest ist ein Werkzeug, das PHPUnit Parallelität beibringt grundsätzlich aber PHPUnit zur Ausführung der Tests verwendet.

vendor/bin/paratest --processes=2 --path=WebDriverDemo.php --functional

Unter Windows sieht das ähnlich aus:

C:\sauce-tutorial> vendor\bin\paratest.bat --processes=2 --path=WebDriverDemo.php --functional

Mit der der parallelen Ausführung von zwei gleichzeitigen Tests sollte die Ausführungszeit entsprechend halbiert werden. Auch hier kann auf dem Sauce Dashboard bequem verfolgt werden wie viele Tests zum gleichen Zeitpunkt ablaufen. Bitte beachtet nochmals, dass Euer kostenloser Account auf zwei gleichzeitig laufende Tests beschränkt ist.

Parallele Testausführung

Herzlichen Glückwunsch! Sobald Ihr hier angekommen seit habt ihr erfolgreich Eure ersten Selenium-Browsertestfälle ausgeführt! Nun ist definitiv der Zeitpunkt gekommen in die Küche zu laufen, das Bier oder auch den Champanger aus dem Kühlschrank zu holen und den Erfolg zu feiern… 🙂

Falls Ihr unterwegs steckengeblieben seit würde ich euch bitte mir in jedem Fall Feedback zu geben wann und wo Ihr auf Probleme gestossen seid. Gerne runde ich die Ecken und Kante in diesem Blogpost entsprechend ab, um zukünftigen Lesern Einstiegshürden, für einem erfolgreichen Einstieg in die Testautomatisierung, zu nehmen. Falls Ihr Fragen zum Thema, Sauce Labs oder Fragen grundsätzlicher Natur habt meldet Euch bitte jeder Zeit bei mir.

In meinem nächsten Blogpost möchte ich näher auf den eigentlichen Testcode und die WebDriver-Schnittstellen eingehen. Zusätzlich werde ich verdeutlichen wie Ihr Eure eigenen Webanwendungen mit unterschiedlichen Browsern, mittels der gleichen Testskripten, testen könnt.

Vielen Dank für Euer Interesse und jede Menge Spaß beim Testen!

Sebastian (Twitter: @sourishkrout)

Advertisements

5 Kommentare

  1. Hallo Sebastian,

    klasse Einführung in Selenium. V.a. hab ich ne Menge über PHP bzgl. Selenium gelernt.
    Vielleicht noch als Ergänzung:
    ein Selenium-Server wird für die lokale Verwendung nicht zwingend benötigt: http://seleniumhq.org/docs/03_webdriver.html#webdriver-and-the-selenium-server
    die offizielle Sprachregelung zu Sel 1/2 und RC/WebDriver: http://seleniumhq.wordpress.com/2011/07/14/a-smattering-of-selenium-53/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+Selenium+%28The+Official+Selenium+Blog%29

    die SauceLabs cloud kann ich jedem nur wärmstens empfehlen – ich benutze Sie täglich – Respekt vor dieser Leistung!

    Greetings to Frisco,
    Michael

    1. Danke für die netten Worte! Freut mich, dass dir Sauce Labs das Leben leichter macht. Falls du hierzu Fragen oder Vorschläge hast kannst du dich gerne an mich wenden.

      Ich sehe zu, dass ich deine Links mit in den Post einarbeite!

      Schöne Grüße aus Kalifornien,
      Sebastian

  2. Marcel · · Antwort

    Ist es möglich mit Selenium aufgezeichnete Tests zu verschicken, so dass viele Tester über einen längeren Zeitraum eine vorgegebene Klickfolge mit einem Befehl automatisch durchführen können?

    1. Hallo Marcel,

      hast du schon mal einen Blick auf Selenium Builder geworfen? Mit Builder kannst du relativ einfach Klickfolgen aufzeichnen und entsprechend ablaufen lassen. Es wird auch eine Vielzahl von Austauschformaten unterstützt womit die Tests an Tester verteilt werden können.

      Für eine schnelle Evaluierung würde ich dir Sauce’s Se Builder empfehlen (https://saucelabs.com/builder). Falls du die Tests lokal ablaufen lassen möchtest sollte die Open Source Variante ausreichen: http://sebuilder.github.com/se-builder/

      Viel Erfolg! Gruß,
      Sebastian

  3. Marcel · · Antwort

    Vielen Dank dafür! Habe gedacht, ich würde eine Mail-Benachrichtigung bekommen, wenn mein Kommentar hier moderiert wird. War leider nicht so. Aber gut, dass ich trotzdem nochmal hergekommen bin.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: