Hier geben wir Einblicke in das Unternehmen, Gedanken, How-Tos, Wissenswertes und News, die sich aus der Programmierung und Projekten ergeben. Auch unsere Open Source Aktivitäten begleiten wir hier.

Corporate Blog der prooph software GmbH

Behavior Driven Design in PHP mit Behat und Mink

Behavior Driven Design

Testfälle automatisieren - Online Shop Use Case

Letztes Wochenende bin ich endlich mal dazu gekommen, Behat näher unter die Lupe zu nehmen. Das Thema hatte ich schon lange auf dem Tisch, kam aber nicht dazu, weil mein aktuelles Kundenprojekt meine gesamte Programmierzeit beansprucht. Meine Blogaktivitäten musste ich auch zurückfahren. Demnächst gibt es aber wieder mehr zu lesen, ich habe noch einige Themen in der Pipeline. Nichtsdestotrotz möchte ich euch Behat kurz vorstellen, falls ihr es noch nicht kennt.

Wozu brauche ich Behat, ich habe doch PHPUnit?

PHPUnit sollte für jeden professionellen PHP Entwickler zum Alltag gehören. Aber reichen 80% Codeabdeckung aus, um eine fehlerfreie Anwendung abzuliefern? Ganz klar: Nein. Auch 100% Abdeckung wären kein Garant dafür. Nachdem alle Einzelkomponenten einer Anwendung auf ihre Funktionalität hin geprüft sind, folgen in der Regel Integrations- und Akzeptanztests. Meist setzen sich ein paar Leute hin und "klicken" sich mal durch die Anwendung. Im besten Fall anhand definierter Testfälle. Dagegen ist auch nichts einzuwenden, schließlich kann das Design nur auf Sicht geprüft werden. Nun wissen wir alle aber auch, dass eine Anwendung quasi nie wirklich fertig ist. Sei es, dass nach dem Livegang doch noch Fehler gefunden werden oder dass das Business sich Features wünscht. Bei weiteren Releases werden in der Regel nicht wieder Tester mobilisiert, die sich durch die gesamte Anwendung klicken. Vom Business hört man dann gern – und auch zurecht – die Aussage: "Das hat doch schon funktioniert, warum soll ich den Testaufwand dafür nochmal bezahlen"? Hier kommt Behat ins Spiel.

Behavior Driven Design - was ist das nun schon wieder?

Behavior Driven Design beschreibt eine Art Anwendungstests, die in normaler Sprache formuliert und automatisch in technische Testfälle übersetzt werden. Behat bringt dieses Vorgehen auf elegante Weise in die PHP Welt ein und bildet zusammen mit Mink ein mächtiges Werkzeug zum automatisierten Testen von Web Applikationen. Wie das Ganze genau funktioniert, schaut ihr euch am besten auf den Seiten von Behat an, die Dokumentation ist wirklich gut und nach wenigen Minuten hat man sein erstes Feature formuliert und bekommt ein "Scenario passed" in der Console angezeigt. Begeistert bin ich vor allem von dem Zusammenspiel zwischen Behat und Mink. Ich habe schon des Öfteren Selenium Testcases mit der Selenium IDE im Firefox erstellt und auch aus PHPUnit heraus Selenium für Integrationstests verwendet. Wirklich zufrieden war ich damit aber nie, weil mir der Aufwand immer als zu hoch erschien und die Testfälle ziemlich unübersichtlich werden können, wenn man sie nicht entsprechend kommentiert. Behat und Mink schaffen da Abhilfe.

Testfälle dokumentieren sich selbst

Die Idee hinter BDD (Behavior Driven Design) ist so einfach wie genial. Man definiere ein Set von Schlüsselwörtern und Konventionen, die dafür sorgen, dass ein – in nativer Sprache – geschriebener Text automatisch in einen technischen Testfall übersetzt wird. Hier mal ein Beispiel, mit dem ich den "kaufen" Button eines Onlineshops teste:

Feature: Buy an Article
In order to buy an article
As a website user
I should be able to click the buy button and the article appears in the shopping cart

@javascript @insulated
Scenario: Click the buy button
Given I am on "/massiver-Holztisch-weiss.html"
When I press "buy"
And I wait for "5" seconds or ".article_count" element contains "1"
Then the ".shopping_cart" element should contain "massiver Holztisch weiß"

Ich schreibe einen Test und gleichzeitig beschreibe ich eine Funktion des Onlineshops. Mache ich dies konsequent für jede Funktionalität, die vom Business gewünscht ist, habe ich am Ende eine Sammlung von Integrationstests, die bei späteren Releases anschlagen, sollte sich das einmal definierte Verhalten des Onlineshops ändern. Gleichzeitig habe ich eine Dokumentation geschaffen, die sich leicht in ein Realisierungskonzept portieren lässt und auch vom Business verstanden wird.

BDD in der Softwareentwicklung

BDD ist natürlich prädestiniert für den Einsatz in agilen Entwicklungsprozessen. Wenn man sowieso User Stories definiert, warum nicht gleich mit der Gherkin Language. Aber auch beim konventionellen Vorgehen – Planung, Konzept, Implementierung, Tests, Abnahme – findet Behat seinen Platz. Jeder Entwickler, der eine Funktionalität umsetzen soll, kann mit dieser Technik die Anforderungen reflektieren und die Anwendung mit demselben Handgriff für zukünftige Anpassungen rüsten. Und selbst für private oder Hobbyprojekte lohnt sich der Einsatz. Gerade dort spart man sich oft jegliche Art Dokumentation und ein halbes Jahr später weiß man nicht mehr, wie die eigene Anwendung tickt.

Behat unter Windows

Dass sich Open Source und M$ nicht immer vertragen, ist für einen PHPler nichts Neues. Auch Behat läuft am besten auf einem *nix System und lässt sich dort in wenigen Minuten einrichten. Kommt man um Windows nicht herum, gibt es trotzdem die Möglichkeit, Behat laufen zu lassen. Zwei bis drei Punkte sollte man dennoch beachten. In den Beispielen der offiziellen Dokumentation wird Behat über die Console immer wie folgt aufgerufen: $> bin/behat, wobei das $ Zeichen für das Projektverzeichnis steht. Unter Windows klappt das nicht, denn bin/behat zeigt auf ein Shell-Script, das letztendlich PHP ausführt. Mit diesem Script kann Windows nichts anfangen. Abhilfe schafft jedoch ein Windows Batch-Script. Kopiert einfach das folgende Beispiel, erstellt eine behat.bat Datei im bin-Verzeichnis eurer Anwendung und anschließend solltet ihr den oben genannten Befehl auch auf Windows verwenden können.

@set SCRIPT_DIR=%~dp0

IF "%1" == "" GOTO call_without_param

php %SCRIPT_DIR%\behat %1

GOTO finish

:call_without_param

php %SCRIPT_DIR%\behat

:finish

Voraussetzung fürs Funktionieren dieses Scripts ist, dass der Pfad zur php.exe in der PATH Variable von Windows eingetragen ist. Mit dem Script kann behat auch mit einem Parameter aufgerufen werden, z.B. $> bin\behat -dl, um sich den FeatureContext anzeigen zu lassen. Wollt ihr mehr als einen Parameter beim Aufruf übergeben, müsstet ihr das Script entsprechend anpassen. Oder ihr geht erst gar nicht über die Batch-Datei sondern ruft Behat so auf: $> php bin\behat.

Fazit

In meinem Programmieralltag hat Behat - neben PHPUnit und QUnit - ab sofort einen festen Platz. BDD rocks.

Sie suchen einen Software Dienstleister für Ihr Projekt: Projektanfrage stellen

Blog Artikel mit ähnlichen Themen

Schade, es sind keine weiteren dazu passenden Texte online...
Auf der prooph blog Startseite findest du alle Blog Einträge.