Verbesserte JBehave Steps mit Varianten

In einem früheren Post wurde bereits eine kleine Einführung in das JBehave Projekt zur Automatisierung von Akzeptanztests gegeben. Während sich dieser Artikel mit der Installation und der allgemeinen Verwendung des Frameworks beschäftigte, konzentriere ich mich heute auf eine Erweiterung, die ich kürzlich zum Projekt beigesteuert habe, und die es erlaubt, Test Stories in noch natürlicherer Sprache abzufassen, als bislang möglich.

Bisher bei LOST JBehave

Ein kurzer Rückblick: In JBehave werden Tests in Sätzen in natürlicher Sprache verfasst, die zur Ausführungszeit auf korrespondierende Methoden abgebildet werden. Folgendes Beispiel stammt aus der JBehave Dokumentation (übersetzt):

@When("der Artikelpreis $preis ist")
@Aliases(values={"der Artikelpreis $preis beträgt"
             "der Artikelpreis $preis entspricht"}) // mehrere Aliase
public void derPreisIst(double preis) {
    // ...
}

Diese Methode wird aufgerufen, wenn in einer Test-Story eine der folgenden Zeilen steht:

  • Wenn der Artikelpreis 10 ist
  • Wenn der Artikelpreis 10 beträgt
  • Wenn der Artikelpreis 10 entspricht

Die Bereitstellung dieser verschiedenen Formulierungen, die jeweils das identische technische Verhalten auslösen, ist für Tester aus verschiedenen Gründen von großem Vorteil. Zunächst muss sich der Autor der Tests nicht exakt an die genaue Schreibweise eines Testschritts erinnern, um die gewünschte Operation auszulösen. Diesem Problem ließe sich mit besserer Editorunterstützung begegnen, z. B. mit dem JBehave Eclipse Plugin.

Darüber hinaus – und meiner Meinung nach ist dies der wichtigere Aspekt – erlaubt es, Test-Stories zu verfassen, die sowohl einfacher zu lesen, aber auch zu schreiben sind. Eine strikte Beschränkung auf genau eine gültige Formulierung pro Testschritt reißt Testautoren tendenziell aus dem Schreibfluss.

Im oben genannten Beispiel ist die Ähnlichkeit zwischen den drei Alternativen sehr deutlich. Sie beginnen alle mit der gleichen Einleitung, gefolgt von einer Variablen $preis, sowie einem jeweils unterschiedlichen Wort am Ende.

Diese Wiederholung von Text führt zu erheblicher Unordnung im Java Source und ist eine hervorragende Quelle für später schwer zu findende Copy und Paste Fehler.

Neu: jetzt mit noch mehr Varianten

Um dem Wiederholungsproblem zu begegnen, schlug ich den JBehave Autoren eine erste Idee vor und stellte einen Patch bereit, um deren Umsetzbarkeit zu demonstrieren. Nach einer kurzen Diskussion – in deren Verlauf mir die Unzulänglichkeiten meines ersten Ansatzes klar wurden – entstand die Idee einer allgemeineren Muster-Syntax. Die Implementierung derselben habe ich als Patch zur Verfügung gestellt, und sie wird Teil des 3.6er Releases sein. Sie erlaubt das oben genannte Beispiel wie folgt zu vereinfachen:

@When("der Artikelpreis $preis {ist|beträgt|entspricht}")
public void derPreisIst(double preis) {
    // ...
}

Der Wert der @When Annotation enthält nun ein paar geschweifter Klammern, das mehrere an dieser Stelle zulässige Worte einschließt. Intern erzeugt JBehave alle Permutationen, die sich durch diese Option ergeben und behandelt sie gleichwertig, so als wären sie explizit ausformuliert. Natürlich ist diese Syntax auch in “normalen” @Alias Deklarationen möglich.

Es ist durchaus möglich, mehr als einen dieser Blöcke mit Optionen in einer Schritt-Definition mit @Given, @When oder @Then zu verwenden. Hier ein etwas komplexeres Beispiel:

@Then("{Muss|Sollte|Soll} A $x sein, {außer|es sei denn} es ist {Teil von|enthalten in} {der |}Liste $y")

Wenn man das kurz durchrechnet, ergeben sich daraus insgesamt 24 Permutationen (oder eben “Varianten”, wie sie im JBehave Sprachgebrauch Einzug gehalten haben):

  • Drei mögliche Werte für das erste Klammernpaar (“Muss”, “Sollte”, “Soll”)
  • Zwei mögliche Werte für das zweite Klammernpaar (“außer”, “es sei denn”)
  • Zwei mögliche Werte für das dritte Klammernpaar (“Teil von”, “enthalten in”)
  • Zwei mögliche Werte für das vierte Klammernpaar (“der” und ein Leerstring, womit das Wort “der” an dieser Stelle effektiv optional wird)

Diese Varianten alle einzeln in den Source zu schreiben wäre sowohl initial als auch aus Wartungssicht nicht praktikabel. Die neue, sehr prägnante Schreibweise erlaubt es hingegen, dem Entwickler das Leben deutlich zu erleichtern, und gleichzeitig den Testautoren ein großes Maß an Flexibilität einzuräumen.

Das Eclipse Plugin

Gemeinsam mit Arnauld, dem Autoren des JBehave Eclipse Plugin (Sourcecode hier), habe ich außerdem dafür gesorgt, dass im Plugin eine Snapshot Version von JBehave aufgenommen wurde, die die Varianten-Syntax unterstützt. Damit lässt sich ausprobieren, wie sich das Schreiben von Tests unter Ausnutzung des neuen Features anfühlt. Allerdings ist zu beachten, dass zur Ausführung der Testfälle derzeit noch kein JBehave Release zur Verfügung steht. Hierfür muss man sich die JBehave Quellen von GitHub clonen und selbst einen Snapshot bauen.

Sollten Sie das in der Vergangenheit (insbesondere unter Windows) schon einmal versucht haben, und dabei gescheitert sein, dürfte interessant sein zu wissen, dass das zugrundeliegende Problem dabei inzwischen behoben sein sollte.

Einsatzbereit

In den vergangenen Wochen habe ich das neue Feature in einem Kundenprojekt produktiv eingesetzt und keine Probleme festgestellt – von daher gehe ich davon aus, dass es sich um eine produktiv einsetzbare Funktion handelt. Da sich Snapshot Versionen naturgemäß häufig und ggf. deutlich unterscheiden, lässt sich daraus allerdings keine allgemeingültige Freigabe ableiten. Hier ist also Vorsicht geboten, und je nach persönlicher Einstellung oder Unternehmensvorgabe könnte es angebracht sein, für den tatsächlichen Einsatz auf das finale JBehave 3.6 Release zu warten.

Nichtsdestotrotz hoffe ich, dass dieses neue Feature Anklang finden wird. Über jede Art von Feedback würde ich mich freuen.

Update: Nur ein paar Tage nach der Veröffentlichung dieses Beitrags wurde das 3.6 Release freigegeben. Jetzt steht dem Einsatz dieses neuen Features also nichts mehr im Wege. :-)

  • Facebook
  • Delicious
  • Digg
  • StumbleUpon
  • Reddit
  • Blogger
  • LinkedIn
Daniel Schneller

4 Antworten auf Verbesserte JBehave Steps mit Varianten

  1. Mauro Talevi sagt:

    Hi Daniel, nice writeup.

    JBehave 3.6.x releases are out. Perhaps it’s be useful to update the post to this effect.

  2. Madhup Kumar sagt:

    While this is a definite improvement over repeated strings, it does hamper readability of the string. Does JBehave still support having one extra string to serve as an “easy on the eyes” readable example i.e.


    @When("the item price {is|becomes|equals|hits|rises to|} $price", "the item price equals $price")

  3. Frank Neblung sagt:

    Prima Sache.
    > @When(“der Artikelpreis $preis {ist|beträgt|entspricht}”)
    Ist das nicht eher ein @Given als ein @When?
    Und genau bei den @Given könnte JBehave m.E. flexibler sein, zumindest, wenn man es in Deutsch nutzt.
    Statt ‘Gegeben heute ist der 07.09.2013′ würde ich lieber
    ‘Angenommen heute ist der 07.09.2013′ schreiben dürfen.

    Gruß, Frank

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>