Ausführbare Spezifikationen für Java

Testing mit Jnario

Dr. Sebastian Benz

Tests sind ein vielfach unterschätztes Hilfsmittel in der Softwareentwicklung. Sie sind nicht nur einfache Checks, ob auf eine Eingabe X eine Ausgabe Y erfolgt. Vielmehr geben sie Feedback darüber, wie gut das technische Design einer Anwendung ist, unterstützen die Entwicklung als hilfreiche Beispiele und dokumentieren die korrekte Verwendung von Schnittstellen. Mit Jnario gibt es nun eine DSL, die unter diesen Gesichtspunkten speziell für das Testen von Java-Anwendungen entwickelt wurde.

Eclipse Magazin

Der Artikel „Testing mit Jnario“ von Dr. Sebastian Benz ist erstmalig erschienen im

Eclipse Magazin 5.2012

Jnario [1] ist ein neues Testframework für Java-Anwendungen, das sich auf den Design- und Dokumentationsaspekt von Tests konzentriert. Es bietet zwei domänenspezifische Sprachen (DSL) zur Spezifikation von Anwendungsverhalten aus unterschiedlichen Perspektiven. Die eine DSL bietet eine für Nichtentwickler verständliche Sprache, mithilfe derer Features aus Nutzersicht spezifiziert werden können. Entwickler können diese Sprache nutzen, um gemeinsam mit Kunden ausführbare Akzeptanzkriterien zu erarbeiten. Die andere DSL unterstützt den Entwickler darin, Unit Tests ohne Boilerplate-Code zu schreiben, die gleichzeitig zur Dokumentation von APIs genutzt werden können. Der große Vorteil von Jnario liegt darin, dass die Spezifikationen in normale Java-Klassen kompiliert werden, was die Integration in Java-Projekte sehr einfach macht. Dieser Artikel gibt eine kurze Einführung in Jnario anhand eines kleinen Anwendungsbeispiels, indem wir exemplarisch eine Funktion mit Jnario spezifizieren und testen.

Jnario am Beispiel

Als Beispiel wollen wir einen Schaltpunktassistenten für ein Auto implementieren. Dieser soll den Fahrer anhand der derzeitigen Geschwindigkeit über den optimalen Gang informieren. Um die gewünschte Funktionsweise des Assistenten zu verstehen, beginnen wir damit, das gewünschte Verhalten aus der Perspektive des Nutzers in Form einer User Story zu beschreiben:

Feature: Car indicates best Gear 
  As a green driver
  I want to know the gear with the least gas consumption
  In order to reduce my carbon footprint

Die Aufgabe einer User Story ist es, das Ziel und den Nutzen des Features aus der Sicht des Anwenders zu beschreiben. In unserem Beispiel wird erst durch die User Story klar, dass das Ziel darin besteht, Benzin zu sparen. Das hat wiederum einen entscheidenden Einfluss auf die Implementierung, da eine Schaltpunktanzeige für einen ökologischen Fahrer nach komplett anderen Gesichtspunkten optimiert wird als für einen sportlichen Fahrer.

Für unsere User Story können wir nun daraus Akzeptanzkriterien für unser Feature ableiten. Wenn unsere Implementierung diese Kriterien erfüllt, wissen wir dass unser Feature fertig implementiert ist. In Jnario beschreiben wir Akzeptanzkriterien in Form von Szenarien. Ein Szenario beschreibt einen exemplarischen Nutzungsablauf anhand unterschiedlicher Schritte:

  • Ein Given-Schritt beschreibt einen gegeben Kontext.
  • Ein When-Schritt beschreibt ein Ereignis.
  • Ein Then-Schritt beschreibt den erwarteten Systemzustand.

Für unsere Schaltpunktanzeige haben wir zwei Beispielszenarien identifiziert (Listing 1).

Listing 1

Feature: Car indicates best Gear 
...
Scenario: Indicate to shift up
  Given I am driving in gear "4"
  When I accelerate to "100" km/h
  Then the display should indicate gear "5"

Scenario: Indicate to shift down
  Given I am driving in gear "4"
  When I decelerate to "40" km/h
  Then the display should indicate gear "3"

Das primäre Ziel einer Akzeptanzspezifikation ist nicht, einen ausführbaren Testfall zu schreiben, sondern eine Diskussionsgrundlage zwischen Entwickler und Kunden zu schaffen. Auf Basis dieser können dann die Features des zu entwickelnden Systems erarbeitet werden. Das ist auch der Grund, warum Akzeptanzspezifikationen in Jnario in Prosa verfasst werden, um auch für Kunden ohne Programmiersprachenkenntnisse verständlich zu sein. Wem das Ganze bekannt vorkommt, der hat natürlich recht, diese Form der Beschreibung von Akzeptanztests ist nichts Neues und wurde vor mehreren Jahren von Dan North [2] mit JBehave [3] eingeführt und ist seit dem mit Cucumber weiterentwickelt [4] worden.

Ein großer Unterschied zwischen Jnario und Cucumber ist die Art und Weise, wie Szenarien in ausführbare Spezifikationen umgewandelt werden. Ihren maximalen Nutzen entwickeln diese Spezifikationen erst, wenn sie automatisiert ausgeführt werden können. Die automatisierte Ausführung gibt kontinuierliches Feedback über den Entwicklungsfortschritt und schützt gleichzeitig während der fortschreitenden Entwicklung vor sich einschleichenden Regressionsfehlern. Um ein Szenario zu automatisieren, muss in Cucumber für jeden Schritt in einer separaten Datei eine entsprechende Parserregel implementiert werden, was den Wartungsaufwand beträchtlich erhöht. In Jnario kann der notwendige Code zur Ausführung direkt unter den Schritten in der Featuredefinition ergänzt werden. Diese Ausführungslogik wird in Xtend [5] implementiert. Xtend ist eine neue Sprache für die Java Virtual Machine (JVM), die auf dem Java-Typsystem basiert, dabei aber neue Konzepte wie Typinferenz und Closures einführt. Jnario erweitert die Syntax von Xtend um testspezifische Sprachelemente. Diese machen das Schreiben von Tests sehr effizient, aber gleichzeitig wird die Ausdrucksmächtigkeit von Xtend bewahrt. In Listing 2 sind die Szenarien mit der notwendigen Ausführungslogik angereichert.

Listing 2

Feature: Car indicates best Gear 
...
Scenario: Indicate to shift up
  val car = new Car
  Given I am driving in gear "4"
    car.start()
    car.shift(args.first.toInt)
  When I accelerate to "100" km/h
    car.accelerate(args.first.toInt)
  Then the car should indicate gear "5"
    car.proposedGear() => args.first.toInt

Scenario: Indicate to shift down
  Given I am driving in gear "4"
  When I decelerate to "40" km/h
    car.decelerate(args.first.toInt)
  Then the car should indicate gear "3"
Geschrieben von
Dr. Sebastian Benz
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.