08.042015

Behaviour-Driven-Development - Teil 1 - Gherkin und Cucumber

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.