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:

  1. Auflösen der Abhänigkeiten mittels Composer
  2. Starten von PhantomJS im GhostDriver Modus
  3. Starten eines lokalen WebServers zur Ausführung der Awendung
  4. Ausführen der Tests gegen den Headless Browser

In der travis.ymlsieht 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.

Wichtig: Der Parameter sudo muss auf truegestellt 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.

> **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.

Happy Testing.

Zurück