Headless Testing mit Laravel, Codeception, PhantomJS und Travis CI
25. März 2015 Softwaretest von Eric Kubenka
Für mein aktuelles Projekt auf Laravel-Basis habe ich zum ersten mal mit dem Continiuos Integration Dienst Travis CI experimentiert. Führ das Ausführen der Tests nutze ich Codeception. Da ich neben dem automatischesn Ausführen von Unit-Tests auch funktionale Tests über die Oberfläche ausführen möchte, stellte sich mir die Frage nach einer passenden Konfiguration für Travis, da dort ja nur die Konsole, beziehungsweise Kommandozeile, zur Verfügung steht.
PhantomJS und GhostDriver
PhantomJS bietet die Möglichkeit funktionale Tests im Browser durchzuführen. Mittels der Integration von GhostDriver, einer Implementation des RemoteWebDriver-Protokolls von Selenium kann man die Tests gegen einen 'virtuellen' Browser laufen lassen. Das Handling ist dabei identisch zu dem normalen WebDriver / Selenium. Statt aber einen Seleniumserver zu starten, startet man eben PhantomJS mit folgender Kommandozeile.
phantomjs --webdriver=4444
Headless Browser Testing mit Travis CI
Generell bietet Travis CI die Möglichkeit mittels xvfb
(X Virtual Framebuffer) Test gegen eine Oberfläche auszuführen. Mehr dazu in der Travis-Dokumentation.
Doch mich reizte eher die Alternative mittels GhostDriver und PhantomJS. PhantomJS ist standardmäßig beim Ausführen mittel Travis CI verfügbar.
Die Konfiguration der travis.yml
Da also alle Bedingungen für das browserlose Testen beim Ausführen von Tests mit Travis CI bereits gegeben sind, ging es also nur noch darum die richtigen Konfigurationseinstellungen zu finden.
Die Handlungsschritte sehen also wie folgt aus:
- Auflösen der Abhänigkeiten mittels Composer
- Starten von PhantomJS im GhostDriver Modus
- Starten eines lokalen WebServers zur Ausführung der Awendung
- Ausführen der Tests gegen den Headless Browser
In der travis.yml
sieht das dann wie folgt aus:
language: php
php:
- 5.6
sudo: true
install: travis_retry composer install --no-interaction --prefer-source
before_script:
# Start WebServer on localhost:8000
- php artisan serve --quiet 2>&1 >/dev/null &
# Start PhantomJS
- phantomjs --webdriver=4444 2>&1 >/dev/null &
# Give it some time to start
- sleep 5
script:
- vendor/bin/codecept run
Mittels dieser Konfiguration ist es also problemlos möglich funktionale Tests im Browser gegen die zu testende Anwendung auszuführen.
> **Anmerkung**: Natürlich ist es so auch möglich **nicht**-Laravel PHP-Anwendungen zu testen. Dazu muss anstatt `php artisan serve` der Befehl `php -S localhost:8000`verwendet werden. > ** Anmerkung 2**: Das Ganze ist natürlich auch lokal ohne Travis CI möglich. Dazu die entsprechenden Befehle in der lokalen Kommandozeile ausführen.Wichtig: Der Parameter
sudo
muss auftrue
gestellt werden, um die Tests auf einer wirklichen VM auszuführen, da es sonst beim Starten zu Problem mit der normalerweise verwendeten Docker-basierten Archtiektur von Travis CI kommt.
Happy Testing.