Behaviour-Driven-Development (kurz BDD, zu deutsch verhaltensgetriebene Softwareentwicklung) ist wie auch testgetriebene Entwicklung eine Technik der agilen Programmierung. In dieser mehrteiligen Reihe möchte ich euch Methoden und Werkzeuge vorstellen, um BDD als Teil projektbezogener Softwareentwicklung umzusetzen.
BDD setzt sich hierbei aus den folgenden Elementen zusammen:
- Einbeziehung der Stakeholder in den Entwicklungsprozess von Beginn an
- Spezifikation des Verhaltens der Software durch Fallbeispiele (Szenarien)
- Automatisiertes Testen der Fallbeispiele unter Verwendung von Mock-Objekten
- Iterative implementierung von Funktionalität und Ersetzung der Mock-Objekte
Als zentralen Teil des Entwicklungsprozesses wird den Verhaltensbeschreibung besondere Aufmerksamkeit gewidmet. Diese sollen für alle an der Softwareentwicklung beteiligten Parteien ohne Fachwissen verständlich sein. Außerdem muss es möglich sein diese möglichst direkt automatisiert zu testen. Im ersten Teil dieser Serie schauen wir uns die Spezifikationssprache Gherkin und Cucumber als Werkzeug zum automatisierten Testen an
Da Gherkin ohne weitere Erklärung verständlich sein sollte beginnen wir direkt mit 2 Szenarien wie sie bei einer Online-Videothek zu finden sein könnten
Feature: Rent a movie In order to spend a fun movie night As a user of the video on-demand service I want to be able to rent a movie Scenario: Pay rental fee Given I navigated to a movies page And my balance is high enough to rent the movie When I press the rent-button Then the movie is watchable for 24 hours Scenario: Balance too low for rental Given I navigated to a movies page And my balance is too low to rent the movie When I press the rent-button Then I recieve a message telling me to charge my balance
Die Beschreibungen sind (je nach Entwicklungsteam und Kunden) in Englisch oder wahlweise einer anderen natürlichen Sprache verfasst. So können auch Laien Beispiele verstehen und ergänzen.
Gherkin gibt hierbei eine Grundstruktur mittels bestimmter Schlüsselworte vor
Given - Vorbedingung eines Beispiels
When - Aktion die Ausgeführt wird
Then - Erwartete Reaktion des Systems
And - in Verbindung mit anderen Schlüsselworten um diese zu ergänzen
Pro Szenario wird immer nur ein fester Fall eines Features abgedeckt. Mehrere Szenarien werden genommen um ein Feature des Systems ausführlich zu beschreiben. Feature erhalten eine eigenständige Beschreibung. Diese wird nicht automatisiert verarbeitet, dennoch haben sich unter anderem die folgenden Schlüsselworte durchgesetzt:
In order - Zweck des Features
As a - Zielgruppe dieses Features
I want - Funktionsbeschreibung
Beginnt man erst einmal das System mit Fallbeispielen zu beschreiben so lässt sich sehr einfach sowohl gewünschtes als auch problematisches Verhalten (Sonderfälle) erkennen: Was passiert wenn ein User noch keinen Account hat? Was passiert wenn ein Nutzer einen ausgeliehener Film nach Ablauf der 24 Stunden erneut anschauen möchte? ...
Um aus einer textuellen Beschreibung wie oben gegeben auch automatisierte Tests zu erzeugen ist es notwendig eine Definition der beschriebenen Schritte zu entwickeln.
Für Ruby, Java, .NET, Flex oder Webanwendungen übernimmt ein Teil dieser Aufgabe Cucumber. Die Definition einzelner Schritte auch glue (Kleber) genannt bindet ausführbaren Code der Zielsprache an einzelne Definitionsschritte. In Java könnte ein solcher Schritt so aussehen:
@Given("^I navigated to a movies page$") public void userExists(String name, String password) { final Browser browser = Browser.getInstance(); browser.navigate("/movies/a-nice-movie"); }
Um das System ausführlich zu testen sind natürlich eine Reihe von Werkzeugen und Bibliotheken vorhanden die genutzt werden können um entsprechende Schritte zu schreiben. Für Java-basierte Webanwendungen kann beispielsweise Seleniums WebDriver genutzt werden. Für Ruby existieren bereits fertige Pakete wie etwa selenium-cucumber die viele gebräuchliche Schritte schon definieren.
Auch für Sprachen, die nicht direkt von Cucumber unterstützt werden existieren Tools um BDD umzusetzen. Für PHP ist die beispielsweise Kahlan während für JS beispielsweise Jasmine genutzt werden kann. Je nach Framework setzen diese Bibliotheken allerdings auf Szenarien, die direkt in der Zielsprache beschrieben werden, weshalb die Lesbarkeit für nicht-Programmierer leidet.
Nach dieser kurzen Einführung lernen wir das nächste mal weitere Bibliotheken und Werkzeuge kennen, die sich bei verhaltensgetriebene Softwareentwicklung als äußerst nützlich erweisen werden.