Vor einigen Monaten wurde die Cucumber JVM 3.0.0 veröffentlicht. Die neue Version soll die Arbeit mit diesem BDD-Framework offensichtlicher und flexibler machen. In diesem Artikel werde ich über Änderungen und neue Funktionen sprechen und Beispiele für deren Verwendung geben.
Implementierung von Gurkenausdrücken
In der dritten Version der Cucumber JVM ist jetzt Cucumber Expressions verfügbar, eine einfache Ausdruckssprache zum Suchen von Teilzeichenfolgen im Text. Im Gegensatz zu regulären Ausdrücken ist diese Sprache für die Lesbarkeit optimiert, was im Kontext von Cucumber sinnvoller ist. Wenn Sie Flexibilität benötigen, können Sie weiterhin reguläre Ausdrücke verwenden.
Zum Beispiel haben wir die folgende Funktion:
# language: ru : : * 15 * "" * hello
Um Argumente daraus zu erhalten, können Sie die folgende Beschreibung der Schritte verwenden:
@(" {int}") public void giveInt(Integer int1) { System.out.println(int1); } @(" {string}") public void giveString(String string) { System.out.println(string); } @(" {word}") public void giveWord(String string) { System.out.println(string); }
Wie Sie dem Beispiel entnehmen können, besteht Cucumber Expressions aus zwei geschweiften Klammern, die die Art des übertragenen Werts angeben.
Standardmäßig sind folgende Arten von Ausrüstung erhältlich:
- {int}
- {float}
- {string}
- {Wort}
- {biginteger}
- {bigdecimal}
- {Byte}
- {kurz}
- {long}
- {double}
{string} entspricht einer Zeichenfolge in Anführungszeichen und {word} einem einzelnen Wort ohne Anführungszeichen (zum Zeitpunkt des Schreibens können nur Wörter in lateinischen Buchstaben an den Ausdruck {word} gesendet werden).
Sie können Ihren eigenen Datentyp erstellen. Beispielsweise möchten wir ein LocalDate-Klassenobjekt von einem Feature übertragen:
# language: ru : : * 01.06.2018
@(" {localdate}") public void ___(LocalDate localdate) { System.out.println(localdate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))); }
Dazu müssen Sie in dem in glue angegebenen Paket eine Klasse erstellen, die die TypeRegistryConfigurer-Schnittstelle implementiert, und über diese Ihren Datentyp zur Registrierung hinzufügen:
public class TypeRegistryConfiguration implements TypeRegistryConfigurer { @Override public Locale locale() {
Die Klasse, die die TypeRegistryConfigurer-Schnittstelle implementiert, muss eine im Projekt sein, andernfalls wird eine Ausnahme ausgelöst.
Mit Gurkenausdrücken können Sie auch optionalen Text in Klammern angeben:
@("Hello, world(s)!") public void getHello() { System.out.println("Hello world!"); }
Sie können keine Leerzeichen in Klammern verwenden (zum Zeitpunkt des Schreibens wird nur das lateinische Alphabet unterstützt).
Alternativer Text wird durch einen Schrägstrich angegeben:
@("/ ") public void getAlternative() { System.out.println("Hello world!"); }
# language: ru : : * *
Sie können {} und () mit einem Backslash entkommen.
Sie können reguläre Ausdrücke und Gurkenausdrücke nicht in derselben Schrittdefinition verwenden.
XStream-Aufgabe
In der ersten und zweiten Version von Cucumber wurden reguläre Ausdrücke und die XStreamsConverters-Bibliothek verwendet, um den Typ der übertragenen Daten zu bestimmen. In der dritten Version von Cucumber haben Entwickler die Verwendung der XStreamsConverters-Bibliothek aufgegeben.
Der Grund für den Verzicht auf XStreamConverters war eine schlechte Dokumentation, die Unfähigkeit, Objektzuordnungen von Drittanbietern zu verwenden, und die mangelnde Unterstützung für Java 9.
Annotations Delimiter, Format, Transformer und andere Annotationen von XStream funktionieren nicht mehr. Stattdessen müssen Sie jetzt ParameterType oder DataTableType verwenden.
Datentabelle
Der Datentyp DataTable wurde ebenfalls geändert.
Wie in früheren Versionen übernimmt Cucumber 3 die Konvertierung einer Datentabelle mit einer Spalte in Liste, zwei Spalten in Karte usw. problemlos. Dies funktioniert jedoch nur, wenn Sie die Daten in einen der folgenden Typen konvertieren: String, Integer, Float, Double, Byte, Short, Long, BigInteger oder BigDecimal.
Wenn Sie ein Objekt einer anderen Klasse aus einer DataTable erstellen möchten, müssen Sie wie bei einem benutzerdefinierten Datentyp einen eigenen Konverter schreiben:
# language: ru : DataTable : | | | 09.02.1887 | | | | 23.02.1890 |
User.java import java.time.LocalDate; public class User { private String firstName; private String lastName; private LocalDate birthDay; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public LocalDate getBirthDay() { return birthDay; } public void setBirthDay(LocalDate birthDay) { this.birthDay = birthDay; } @Override public String toString() { return "User{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", birthDay=" + birthDay + '}'; } }
@(" ") public void ___(List<User> users) { System.out.println(users); }
Der Konverter wird auf die gleiche Weise wie im Beispiel mit dem Benutzerdatentyp zur Registrierung hinzugefügt:
public class TypeRegistryConfiguration implements TypeRegistryConfigurer { @Override public Locale locale() { return new Locale("ru"); } @Override public void configureTypeRegistry(TypeRegistry typeRegistry) {
Vor und nach Schritt Haken
Eine weitere Neuerung ist vor und nach dem Schritt. Jetzt können Sie Hooks definieren, die vor und / oder nach jedem Schritt des Skripts aufgerufen werden.
Step-Hooks folgen denselben Regeln wie Hooks auf Skriptebene:
- Tags können an Hooks gehängt werden, um sie nur in bestimmten Szenarien auszuführen.
- Sie können die Ausführungsreihenfolge von Hooks festlegen.
- AfterStep wird auch dann ausgeführt, wenn der Schritt, nach dem es ausgeführt werden sollte, unterbrochen wird.
# language: ru : @hooks : , @only_scenario_hooks : @only_step_hooks :
Abschließend möchte ich sagen, dass selbst wenn Sie die Funktionen von XStream in Ihren Projekten und beim Übergang zur neuen Version von Cucumber verwendet haben, kleine Verbesserungen erforderlich sind, ich dies empfehle. Gurke wird unterstützt und aktiv entwickelt, und neue Funktionen machen ihre Verwendung flexibler und verständlicher.
Update 23.09.2008Heute wurde Cucumber 4.0.0 veröffentlicht. Ich werde nicht alle Änderungen beschreiben, ich werde nur sagen, dass jetzt die russische Sprache normalerweise in Gurkenausdrücken unterstützt wird und dass das Beispiel, das ich mit {string} und {word} geschrieben habe, nicht mehr funktioniert. Tatsache ist, dass {word} jetzt jedes Nicht-Leerzeichen enthalten kann, was bei der Suche nach einem Implementierungsschritt zu einem Konflikt führt:
# language: ru : : * "" * hello
@(" {string}") public void giveString(String string) { System.out.println(string); } @(" {word}") public void giveWord(String string) { System.out.println(string); }
Referenzen:
→
Beispiele aus dem Artikel→
Mein Artikel zur ersten Version der Cucumber JVM