data driven parameterized testing with spock framework
Entdecken Sie die Möglichkeiten zum Schreiben datengesteuerter oder parametrisierter Tests mit dem Spock Framework:
In diesem Kostenlose Spock Training Tutorial Serie haben wir alles erkundet Unit Testing in Spock und Testvorrichtungen, Behauptungen und Berichte in unserem vorherigen Tutorial.
In diesem Tutorial werden wir versuchen zu verstehen, was parametrisierte Tests sind und wie Sie die integrierten Funktionen von Spock nutzen können, um datengesteuerte Tests zu erzielen.
Lasst uns beginnen!!
Sehen Sie sich das Video-Tutorial an
Was du lernen wirst:
- Was sind parametrisierte Tests?
- Parametrisierte Tests mit Spock schreiben
- Lebenszyklus des Wo-Blocks
- Tipps
- Fazit
- Literatur-Empfehlungen
Was sind parametrisierte Tests?
Für alle, die mit Automatisierungs- / Komponententests gearbeitet haben, ist datengesteuertes Testen kein neuer Begriff.
Parametrisierte Tests sind nichts anderes als Tests, die dieselbe Ausführungslogik verwenden und sich in einigen Fällen nur in den Eingabedaten und Ergebnissen unterscheiden.
Beispiel: Angenommen, Sie haben eine Taschenrechneranwendung. Um die Funktionalität vollständig zu testen, möchten Sie Ihre Tests möglicherweise für verschiedene Eingabesätze ausführen.
Beispiel: Negative Werte, Bruchzahlen, normale Ganzzahlen, Ganzzahlen, die sich dem maximal zulässigen Bereich nähern usw. Unabhängig davon, welche Eingabewerte Sie haben, möchten Sie dieselbe Ausführungslogik ausführen.
Ein weiterer guter Grund, parametrisierte Tests zu schreiben, besteht darin, dass nicht nur ein glücklicher Pfad getestet wird, sondern auch ein Fehlerpfad oder negative Szenarien.
Beispiel: Angenommen, es gibt eine Anwendung, die zurückgibt, ob eine bestimmte Dateierweiterung gültig ist oder nicht. Mit datengesteuerten Tests kann der Entwickler schnell Tests für unterstützte Dateierweiterungen und Fehlerszenarien oder Tests mit negativen Eingaben ausführen.
Traditionell können Sie daran denken, die Tests für mehrere Eingabewerte zu schreiben oder zu kopieren. Dies ist jedoch nicht der richtige oder intelligente Weg, um diese Art der Testausführung zu erreichen. Darüber hinaus wird es schwierig, diese Tests zu verwalten, wenn die Anzahl der Tests in Ihrer App zunimmt.
Parametrisierte Tests mit Spock schreiben
Das Wo: Block
Der where-Block in einem Spock-Test ist der Block, der Daten für den parametrisierten Test enthält. Es kann optional sowohl Eingabe- als auch erwartete Ausgabewerte enthalten. Ein wichtiger Punkt bei diesem Block ist, dass dies der letzte Block in einem Spock-Test sein sollte.
Allerdings kann es wie angegeben mit allen anderen Blöcken kombiniert werden, wenn & dann, sollte aber der letzte Block sein.
Schauen wir uns ein Beispiel an, um es besser zu verstehen
Wir werden eine Taschenrechneranwendung verwenden, die 2 Eingabeparameter verwendet und die Summe der bereitgestellten Eingaben zurückgibt. Wir werden einen parametrisierten Test schreiben, der mehrere Eingaben und erwartete Ausgabewerte liefert.
def 'sample parameterized test'() input2
Im obigen Codebeispiel sehen Sie Folgendes:
- Block 'where', der die Daten enthält, die der Test ausführen soll.
- Der 'where' -Block ist der letzte Block des Tests.
- 'Wo' wird mit den anderen Blöcken kombiniert, d. H. Gegeben, wann und dann.
- Die Datendarstellung ist ein spezielles Format namens Datentabellen, auf das wir in den nächsten Abschnitten dieses Lernprogramms näher eingehen werden.
- Die Kopfzeile der Daten sind im Wesentlichen die Eigenschaften / Eingabevariablen, die direkt im Test verwendet werden können. Z.B. Lesen Sie die Anweisung im Block 'Wann', in dem wir sie direkt verwendet haben input1 und input2 als Eingabeparameter, ohne sie explizit zu definieren.
Datentabellen verwenden
Versuchen wir jetzt, Datentabellen im Detail zu verstehen. Jede Zeile der Datentabelle repräsentiert Daten für ein einzelnes Szenario (Testausführung).
Konventionell, d. H. Den Eingabewerten geht eine einzelne Pipe ('|') voraus, während den Ausgabewerten eine doppelte Pipe ('||') vorausgeht. Dies hat keine logische Bedeutung, ist jedoch eine Konvention und verbessert die Lesbarkeit. Somit gelten beide folgenden Beispiele.
input1 |input2 |expectedResult 10 |15 |25 -4 |6 |2 input1 |input2 || expectedResult 10 |15 || 25 -4 |6 || 2
Die Kopfzeile hat, wie oben gezeigt, einen Namen für jeden der Parameter, die als zu testende Daten angegeben werden. Es ist wichtig zu beachten, dass diese Parameternamen nicht mit vorhandenen lokalen / globalen Variablen im Test kollidieren sollten, da dies sonst der Fall sein wird Fehler bei der Kompilierung Variablennamen aufzulösen.
Ein wichtiger Punkt bei der Verwendung von Datentabellen ist, dass mindestens 2 Spalten erforderlich sind. Wenn Sie nur eine Spalte benötigen, ist eine leere Spalte mit Werten als Unterstrich eine Problemumgehung wie unten.
input1 ||_ 10 ||_ -4 ||_
Der Vorteil dieses Formats ist Einfachheit, Lesbarkeit und Erweiterbarkeit. Das Hinzufügen einer neuen Dateneingabe ist so einfach wie das Hinzufügen einer neuen Zeile mit Datenwerten.
Ein weiterer Punkt, den Sie hier beachten sollten, ist, dass Datentabellen verwendet werden können, um alle Arten von Variablen, Klassen, Objekten, Aufzählungen usw. zu speichern, wodurch sie noch leistungsfähiger werden. Da groovy eine optional typisierte Sprache ist, implizieren die Variablen in der Datentabelle, wenn kein expliziter Typ angegeben ist, abhängig von der Art der bereitgestellten Daten.
Mal sehen, ein anderer Beispiel Verwenden von Datentabellen mit einer Liste von Zeichenfolgen als Eingabe und Ausgabe als Anzahl von Elementen in der Zeichenfolge.
def 'sample parameterized test with list data type'() when: def actualCount = input1.size() then: actualCount == expectedCount where: input1
Im obigen Beispiel können Sie feststellen, dass wir die Eingabe als Array-Liste mit Zeichenfolgen bereitgestellt haben und die Ausgabe die Größe dieser Array-Liste hat. Somit bietet es viel Flexibilität, Eingabedaten verschiedener Typen zu haben.
Sie können auch einfach alle Ausdrücke erwähnen, die Daten des jeweiligen Eingabetyps zurückgeben und auch direkt in Datentabellen verwenden.
Lebenszyklus des Wo-Blocks
Bei Tests, die Block- und Datenproben in Form von Datentabellen enthalten, repräsentiert jede Datenzeile eine Ausführung der Testmethode.
Zum Beispiel, Wenn es 5 Datenzeilen gibt und der Test 'gegebene' und 'wann' Blöcke enthält, werden die Testblöcke für eine solche Datenzeile einmal ausgeführt. Insgesamt gibt es also insgesamt 5 Ausführungen der Testmethode.
Tipps
Sehen wir uns einige Tipps und Tricks für parametrisierte Tests an, während Sie mit diesen Datentabellen arbeiten.
# 1) Anzeigen der Ergebnisse der einzelnen Zeilenausführung separat. Wie wir im Abschnitt zum Lebenszyklus gesehen haben, gibt es für jede Datenzeile eine Ausführung des Testcodes. Um diese Zeilen oder Ergebnisse für jede dieser Zeilen separat anzuzeigen, kann für solche Tests die Annotation '@Unroll' verwendet werden.
Versuchen wir dies anhand eines Beispiels zu verstehen:
Wir werden dieselbe Taschenrechneranwendung verwenden, wobei 3 Sätze von Eingabedaten für die zu testende Methode bereitgestellt werden.
kostenlose Videokonverter für Windows 10
def 'sample parameterized test'() -20
Lassen Sie uns ohne die Annotation '@Unroll' sehen, wie das Ergebnis im Terminal aussieht (sowie in den HTML-basierten Berichten). Bei dieser Art von Ausgabe wird es schwierig herauszufinden, welche Eingabe den Test fehlgeschlagen hat.
Lassen Sie uns nun sehen, wie die Testausgabe für jede Zeile separat gemeldet wird, nachdem der Testmethode (die Datentabellen als Dateneingabe enthält) die Anmerkung '@Unroll' hinzugefügt wurde.
#zwei) Lassen Sie uns nun verstehen, wie Sie diesen datengesteuerten Tests aussagekräftige Informationen hinzufügen können (anstelle einiger automatisch angehängter Indizes wie im obigen Screenshot).
Wir können Platzhalter für die Eingabe- und Ausgabeeigenschaften verwenden (gemäß Datentabelle) und dann die Werte sehen, die in Testnamen mit Daten aus Datentabellen gefüllt sind.
Verwenden wir dasselbe Beispiel und aktualisieren Sie den Testnamen, um Daten von der Eingabe und der erwarteten Ausgabe zu erhalten, wie in den Datentabellen angegeben:
@Unroll def 'result of adding #input1 & #input2 should be #expectedResult'() given: def app = new CalculatorApp() when: def resultSum = app.add(input1, input1) then: resultSum == 2 * input1 where: input1
Nun wollen wir sehen, wie die Ausgabe im Terminal und in den HTML-basierten Berichten aussieht:
Wie Sie hier sehen können, werden die Daten von Eingabe und Ausgabe jetzt zusammen mit den Testnamen angezeigt, wenn sie ausgeführt werden. Auf diese Weise wird die Fehlerbehebung und das Debuggen erheblich vereinfacht, da deutlich wird, durch welche Eingabe der Test fehlgeschlagen ist oder sich schlecht verhält.
Fazit
In diesem Tutorial haben wir gelernt, wie parametrisierte Tests mit dem Spock-Framework geschrieben werden. Wir haben auch verschiedene Funktionen von Datentabellen und deren Verwendung erörtert.
In unserem kommenden Tutorial erfahren Sie, wie Sie Mocks and Stubs mit Spock verwenden können.
PREV Tutorial | NÄCHSTES Tutorial
Literatur-Empfehlungen
- Unit-Tests mit Spock Framework schreiben
- Spock Interview Fragen mit Antworten (am beliebtesten)
- Spock für Integration und Funktionstests mit Selen
- Spock Mocking and Stubbing (Beispiele mit Video-Tutorials)
- Spock Tutorial: Testen mit Spock und Groovy
- Datengesteuertes Framework in Selenium WebDriver mit Apache POI
- So führen Sie datengesteuerte Tests mit dem TestComplete-Tool durch
- Funktionsweise datengesteuerter Tests (Beispiele für QTP und Selen)