step argument transformations specflow tables
Lernprogramm für Schrittargumenttransformationen und Specflow-Tabellen:
Unser vorheriges Specflow-Tutorial hat uns alles darüber informiert Geteilte und bereichsgebundene Bindungen, Haken und Wiederverwendung von Stufen im Detail. Hier in diesem Tutorial werden wir mehr über Schrittargumenttransformationen in Specflow erfahren.
Fühlen Sie sich frei, unsere zu lesen Kompletter Specflow-Schulungsleitfaden für Anfänger für ein klares Verständnis des Konzepts. Mit der Funktion zur Transformation von Schrittargumenten in Specflow kann ein Benutzer eine benutzerdefinierte Transformation für die in den Schritten angegebenen Parameter bereitstellen.
Es ermöglicht das Hinzufügen einer benutzerdefinierten Logik, um Eingabeparameter in einen bestimmten Parameter umzuwandeln. Zum Beispiel, Sie können direkt aus den Parametern ein Klassenobjekt erstellen und das erstellte Objekt aus der Transformationsfunktion zurückgeben.
Eine weitere Funktion von Specflow, die wir uns ansehen werden, sind Specflow-Tabellen, mit denen Eingabedaten in tabellarischer Form in einem einzigen Schritt übergeben werden können. Tabellenhelfer können sie nach Bedarf direkt einer Objektinstanz zuordnen.
Schau das Video:
Hier ist ein Video-Tutorial zu Schrittargumenttransformationen und Specflow-Tabellen:
Was du lernen wirst:
Schrittargumenttransformationen
Um die Argumenttransformationen besser zu verstehen, versuchen wir zunächst herauszufinden, wie genau Specflow mit den Parametern übereinstimmt. Wie wir in unseren vorherigen Artikeln gesehen haben, haben wir für das YouTube-Suchbeispiel den Suchbegriff als Parameter für das auszuführende Szenario übergeben.
Der Parameterabgleich erfolgt normalerweise über einen regulären Ausdruck, und der übereinstimmende reguläre Ausdruck führt dazu, dass der Methodenparameter im Schritt auf den angegebenen Suchbegriff gesetzt wird.
Versuchen wir zunächst zu verstehen, welche Konvertierungen in Specflow standardmäßig unterstützt werden und wann Argumenttransformationen hilfreich sein können.
Unterstützte Konvertierungen
Specflow unterstützt viele sofort einsatzbereite Konvertierungen, indem der Datentyp selbst nach der Regex-Übereinstimmung überprüft wird. Es kann sich automatisch um Konvertierungen wie - String, Integer, GUID, Enums usw. kümmern.
Nachfolgend sehen Sie ein Beispiel für einige davon:
Scenario: Get Transactions in my account Given I have entered customer name as Test Customer And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e And I select sorting order as DESCENDING And I select number of transactions to be displayed as 25 Then I should see my account transactions
Im obigen Codebeispiel haben wir verschiedene Eingabetypen hervorgehoben, die wir in den Schritten übergeben, und in den Schrittimplementierungen werden diese in die jeweiligen Datentypen konvertiert.
Sehen wir uns die Schrittimplementierungen für diese unten an (der Einfachheit halber haben wir gerade eine Konsole für jeden der Schritte erstellt, um zu veranschaulichen, dass das angegebene Argument automatisch in den erwarteten Typ konvertiert wird):
(Given(@'I have entered customer name as (.*)')) public void GivenIHaveEnteredCustomerNameAsTestCustomer(String customerName) { Console.Out.WriteLine(customerName); } (Given(@'I have entered customer account id as (.*)')) public void GivenIHaveEnteredCustomerAccountIdAs(Guid accountId) { Console.Out.WriteLine(accountId.ToString()); } (Given(@'I select sorting order as (.*)')) public void GivenISelectSortingOrderAsAscending(SortOrder sortOrder) { Console.Out.WriteLine(sortOrder.ToString()); } (Then(@'I should see my account transactions')) public void ThenIShouldSeeMyAccountTransactions() { Console.Out.WriteLine('success!'); } (Given(@'I select number of transactions to be displayed as (.*)')) public void GivenISelectNumberOfTransactionsToBeDisplayedAs(int p0) { Console.Out.WriteLine(p0.ToString());
Bei Ausführung des obigen Szenarios druckt die Ausgabe alle Werte erfolgreich, indem angezeigt wird, dass die automatische Konvertierung von Argumenten in die erwarteten Datentypen erfolgreich war.
So sieht die Ausgabe aus:
Given I have entered customer name as Test Customer Test Customer -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerNameAsTestCustomer('Test Customer') (0.0s) And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e 0f8fad5b-d9cb-469f-a165-70867728950e -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerAccountIdAs(0f8fad5b-d9cb-469...) (0.0s) And I select sorting order as DESCENDING DESCENDING -> done: SupportedSpecflowConversions.GivenISelectSortingOrderAsAscending(DESCENDING) (0.0s) And I select number of transactions to be displayed as 25 25 -> done: SupportedSpecflowConversions.GivenISelectNumberOfTransactionsToBeDisplayedAs(25) (0.0s) Then I should see my account transactions success! -> done: SupportedSpecflowConversions.ThenIShouldSeeMyAccountTransactions() (0.0s)
Argumenttransformationen
Sehen wir uns ein Beispiel in Aktion an, um dies zu verstehen. Support, Sie haben eine Anwendung, die die angegebene Zeit in Minuten umwandelt. Beispiel: Wenn die Benutzereingabe 1 Tag ist - die Ausgabe ist - 1440, wenn die Benutzereingabe 1 Tag 2 Stunden 2 Minuten ist, sollte die Ausgabe 1562 sein.
Es ist nun ersichtlich, dass zur Unterstützung verschiedener Arten von Eingaben je nach Art der Eingaben unterschiedliche Bindungsimplementierungen geschrieben werden müssen. Zum Beispiel: Für Eingaben mit nur einem Tagesabschnitt wird eine separate Schrittimplementierung durchgeführt, für Eingaben mit einem Tag-, Monatsteil wird eine separate Schrittimplementierung usw. durchgeführt.
Lassen Sie uns sehen, wie dies durch eine Einzelschrittimplementierung durch Schrittargumenttransformation implementiert werden kann. Die bereitgestellte Eingabe wird einfach in ein Zeitstempelobjekt konvertiert und zum ursprünglichen Schritt zurückgeführt, der als Schritttransformation bezeichnet wird.
Stellen Sie sich das als einen Regex-Scan der ersten Ebene für Ihre Eingabe vor, der den teilweise transformierten Wert an den aufrufenden Schritt zurückgibt.
Sehen Sie sich die Feature-Datei mit 3 verschiedenen Eingabevarianten mit einer einzigen Transformation an, indem Sie sie in ein vollständiges Zeitspannenobjekt konvertieren und zurückkehren.
Scenario: Convert timestamp to minutes - variant 1 Given I have entered 50 days into the timestamp to minute converter When I press calculate Then the result should be 72000.00 on the screen Scenario: Convert timestamp to minutes - variant 2 Given I have entered 1 day, 2 hours, 3 minutes into the timestamp to minute converter When I press calculate Then the result should be 1563.00 on the screen Scenario: Convert timestamp to minutes - variant 3 Given I have entered 1 day, 1 hour, 1 minute, 30 seconds into the timestamp to minute converter When I press calculate Then the result should be 1501.50 on the screen
Sehen Sie sich die hervorgehobenen Werte im obigen Codebeispiel an. All dies wird für genau dieselbe Transformation erledigt und das Endergebnis ist ein transformierter TimeSpan-Eingabewert, der an den aufrufenden Specflow-Schritt zurückgesendet wird.
Schauen wir uns die Implementierung der Transformation unten an:
(StepArgumentTransformation(@'(?:(d*) day(?:s)?(?:, )?)?(?:(d*) hour(?:s)?(?:, )?)?(?:(d*) minute(?:s)?(?:, )?)?(?:(d*) second(?:s)?(?:, )?)?')) public TimeSpan convertToTimeSpan(String days, String hours, String minutes, String seconds) { int daysValue; int hoursValue; int minutesValue; int secondsValue; int.TryParse(days, out daysValue); int.TryParse(hours, out hoursValue); int.TryParse(minutes, out minutesValue); int.TryParse(seconds, out secondsValue); return new TimeSpan(daysValue, hoursValue, minutesValue, secondsValue); }
Damit das Framework erkennt, dass es sich um eine Transformationsbindung handelt, muss das StepArgumentTransformation-Attribut der Methode hinzugefügt werden, die die Argumentkonvertierung implementiert.
Die anderen wichtigen Punkte, die bei der Argumentkonvertierung zu beachten sind, sind:
# 1) Schrittargumenttransformationen werden für jeden übereinstimmenden Schritt ausgeführt, d. H. Unabhängig von der Art des Schritts, d. H. Ob gegeben ist, wann oder dann wird die Transformation für jeden übereinstimmenden regulären Ausdruck durchgeführt.
#zwei) Abhängig vom Rückgabetyp der transformierten Ausgabe findet keine Transformation statt, wenn der tatsächliche aufrufende Schritt nicht den passenden Rückgabetyp für den Eingabeparameter hat.
Angenommen, der aufrufende Schritt erfordert eine transformierte Eingabe, hat jedoch den genannten Zeitstempel der Eingabe als etwas, das nicht mit dem Rückgabetyp der transformierten Methode übereinstimmt. Dann wird die Regex-Übereinstimmung überschrieben und die Konvertierung findet nicht statt.
Schauen wir uns die Implementierung des Aufrufs des 'Gegebenen' Schritts an:
private TimeSpan ts; (Given(@'I have entered (.*) into the timestamp to minute converter')) public void GivenIHaveEnteredDaysIntoTheTimestampToMinuteConverter(TimeSpan tsTransformed) { ts = tsTransformed; }
Sehen Sie sich hier den Typ des Eingabeparameters an, d. H. Den TimeSpan, der dem vom Transformationsschritt zurückgegebenen Typ entspricht, wenn dieser in einen anderen Typ geändert wird. Zum Beispiel String, dann findet die Argumentkonvertierung nicht statt und die Regex-Übereinstimmung wird von der ursprünglichen Step-Implementierung überschrieben.
Pro-Tipp: Ein wichtiger Punkt, der hier zu beachten ist, ist, dass der gesamte zu transformierende Text durch eine schrittweise Argumenttransformation eingespeist / abgeglichen werden sollte. Daher werden im Schritt 'Gegeben' jetzt alle möglichen Eingabeformate in eine einzelne Zeichenfolge eingeschlossen, und der Regex der Transformation konvertiert sie in ein TimeSpan-Objekt und kehrt zurück.Specflow-Tabellen
Specflow-Tabellen sind eine Möglichkeit, eine Liste der Werte an die Schrittimplementierungsfunktion zu übergeben. In unseren vorherigen Artikeln haben wir uns mit der Implementierung datengesteuerter Tests unter Verwendung von Szenarioübersichten und Beispielen befasst. Das sollte aber in erster Linie das Szenario mit unterschiedlichen Eingaben ausführen.
In Tabellen geht es darum, alle Daten gleichzeitig in Tabellenform an die Schrittimplementierung zu übergeben, die Daten liefert.
Stellen Sie sich zum Beispiel ein Beispiel vor, in dem Sie ein Studentenverwaltungssystem testen und zum Erstellen eines neuen Studentenobjekts viele Details wie Vorname, Nachname, Alter, Geburtsjahr usw. eingeben müssen.
Eine Möglichkeit besteht darin, jede dieser Informationen als separaten Schritt zu übergeben, bei dem es sich im Wesentlichen um viel Boilerplate-Code handelt. In jedem Schritt wird das gleiche Objekt aktualisiert, das getestet werden muss. Eine andere Möglichkeit besteht darin, einen komplexen regulären Ausdruck zu erstellen und zu versuchen, alle Daten im selben Schritt zu übergeben. Dies ist jedoch ziemlich fehleranfällig und unzuverlässig.
Hier helfen uns Tische. Alle schülerbezogenen Eingabedaten können über die Tabellenfunktion von specflow auf eine schöne tabellarische Weise in dieselbe Schrittimplementierung gesendet werden.
Im Folgenden finden Sie ein Codebeispiel für die Implementierung von Funktionen und Schritten:
Scenario: Pass data through Specflow tables for StudentInfo object Given I have entered following info for Student | FirstName | LastName | Age | YearOfBirth | | test | student | 20 | 1995 | When I press add Then i student should get added to database and entered info should be displayed on the screen
Tabellendaten werden im obigen Szenarioschritt hervorgehoben.
Agile Scrum Methodik Interview Fragen Antworten
Specflow bietet viele TableHelper, die direkt nützliche Funktionen wie das Erstellen einer Objektinstanz aus den vom Benutzer bereitgestellten Eingabedaten ermöglichen, anstatt jedes Feld einzeln zu analysieren.
Sehen wir uns die folgende Schrittimplementierung an:
private StudentInfo studInfo; (Given(@'I have entered following info for Student')) public void GivenIHaveEnteredFollowingInfoForStudent(Table table) { // converting supplied input data directly to instance of StudentInfo object studInfo = table.CreateInstance(); }
Schauen Sie sich den hervorgehobenen Abschnitt oben an. Hier ist nur eine kleine Codezeile, das gesamte StudentInfo-Objekt (ein POCO, das die Schülerdatenfelder enthält, d. H. Vorname, Nachname, Alter, Geburtsjahr usw.)
Einige andere Funktionen / Konzepte im Zusammenhang mit Specflow-Tabellen sind nachstehend aufgeführt:
# 1) Tabellen können horizontal oder vertikal sein. Vertikale Tabellen ähneln eher Schlüssel-Wert-Paaren und im obigen Szenario eher Name-Wert-Zuordnungen, während horizontale Tabellen alle Daten für ein Objekt in einer einzelnen Zeile enthalten (wie wir in unserem Beispiel gesehen haben).
#zwei) Vertikale Tabellen können nur einem einzelnen .NET-Objekt zugeordnet werden, während horizontale Tabellen auch einem Satz oder einer Sammlung von Objekten zugeordnet werden können.
#3) Jeder Feldwert in der Tabelle sollte atomar sein, da er einem einzelnen entsprechenden Feld im analysierten Objekt zugeordnet wird.
Ein wichtiger Punkt, den Sie hier beachten sollten, ist, dass auch wenn Sie automatisch generieren Bei Schrittbindungen mit den Tabellendaten berücksichtigt der Specflow-Bindungsgenerator solche Eingabetypen automatisch und erkennt sie als gültige Tabellendaten.
Fazit
In diesem Artikel haben wir versucht, zwei wichtige und praktische Konzepte in Specflow zu erläutern.
Der erste Schritt ist der Schrittargumenttransformationen Dies ermöglicht benutzerdefinierte Typkonvertierungen für Specflow-Argumente, um Boilerplate-Code zu vermeiden (und ermöglicht es dem Testskript, modularer und logischer auszusehen). Die zweite Funktion, die wir uns angesehen haben, ist Specflow-Tabellen Dies ist praktisch, wenn Sie viele Felder / Daten in einem einzigen Schritt in einem benutzerfreundlichen Tabellenformat übergeben müssen.
In unserem nächsten Tutorial erfahren Sie mehr darüber, wie Sie mithilfe von Specflow in verschiedenen Formaten mithilfe von Open-Source-Tools wie Pickles automatisch eine schöne Dokumentation erstellen können, die allen Projektbeteiligten eine einfache Referenz bietet.
PREV Tutorial | NÄCHSTES Tutorial
Literatur-Empfehlungen
- Bereitstellung in MongoDB: Schritt-für-Schritt-Anleitung
- Schrittweise Installation und Einrichtung von Appium Studio
- Specflow- und Selenium-Webdriver-End-to-End-Beispiel
- Eine Schritt-für-Schritt-Anleitung zur Integration von QTP in ALM / QC
- Die 15 beliebtesten Fragen zu Specflow-Interviews
- Erweiterte Specflow Shared & Scoped-Bindungen, Haken und Stufenwiederverwendung
- Installieren Sie MongoDB unter Windows: Eine Schritt-für-Schritt-Anleitung
- So integrieren Sie JIRA in qTest: Eine Schritt-für-Schritt-Anleitung