2013-12-12 10 views
5

Hier ist meine gherkin:Specflow Szenario Überblick nicht zu erwarten Schritt Codegenerierung

Scenario Outline: Login using valid email address 
Given I have not logged into the current computer 
And Username <username> and password <password> is a valid account 
When I start the client 
And Login using username <username> and password <password> 
Then The client should navigate to first time screen 

Examples: 
| username   | password | 
| [email protected] | password001 | 
| valid002   | password002 | 

Dies erzeugt den folgenden Schritt-Datei:

[Binding] 
public class UserLoginSteps 
{ 
    [Given(@"I have not logged into the current computer")] 
    public void GivenIHaveNotLoggedIntoTheCurrentComputer() 
    { 
     ScenarioContext.Current.Pending(); 
    } 

    [Given(@"Username valid(.*)@xyz\.com and password password(.*) is a valid account")] 
    public void GivenUsernameValidXyz_ComAndPasswordPasswordIsAValidAccount(int p0, int p1) 
    { 
     ScenarioContext.Current.Pending(); 
    } 

    [When(@"I start the client")] 
    public void WhenIStartTheClient() 
    { 
     ScenarioContext.Current.Pending(); 
    } 

    [When(@"Login using username valid(.*)@xyz\.com and password password(.*)")] 
    public void WhenLoginUsingUsernameValidXyz_ComAndPasswordPassword(int p0, int p1) 
    { 
     ScenarioContext.Current.Pending(); 
    } 

    [Then(@"The client should navigate to first time screen")] 
    public void ThenTheClientShouldNavigateToFirstTimeScreen() 
    { 
     ScenarioContext.Current.Pending(); 
    } 
} 

Die Probleme sind wie folgt:

  • generiert Regex für Benutzername basiert auf dem ersten Eintrag in der Beispielspalte. Dies ist nicht das, was ich will, da nicht alle Beispiele diesem Muster folgen.
  • Die Methodennamen verwenden den ersten Eintrag in der Beispielspalte (d. H. WhenLoginUsingUsernameValidXyz_ComAndPasswordPassword). Dies ist schwer zu lesen und wenn sich die Daten in der Beispieltabelle ändern, ist der Methodenname nicht mehr korrekt
  • Der Typ für die Parameter ist int. Sie sollten String sein.

Ich würde den Schritt Definition Generation zur Ausgabe etwas wie folgt erwartet:

[When(@"Login using username (.*) and password (.*)")] 
    public void WhenLoginUsingUsernameAndPassword(string p0, string p1) 
    { 
     ScenarioContext.Current.Pending(); 
    } 

bin ich etwas fehlt? Gibt es eine Möglichkeit, die Art zu beeinflussen, wie SpecFlow Schrittmethoden für Szenario-Outlines generiert? Wenn nicht, was ist der beste Weg, um dies zu beheben, ohne die Feature-generierten Code hinter Clobbering meine Änderungen

Antwort

4

Kurz gesagt, gute Nachrichten. Diese automatisch generierten Bindungen sind nur eine Annehmlichkeit und werden nicht automatisch neu generiert. Tatsächlich habe ich diese immer von Hand selbst gebaut.

Das bedeutet, Sie können sie gehen und ändern, ohne sich um sie zu Sorgen :-)

SpecFlow Werke von Auto-Erzeugungs verprügelt zu werden Dateien * .feature.cs jedes Mal, wenn eine * .feature Datei bearbeiten. Diese sollten niemals bearbeitet werden, aber wenn Sie sie durchsehen, können Sie sehen, dass sie im Grunde genommen die Linien "Gegeben, Wann und Dann" aus Ihren Szenarien nehmen und sie als Argumente an ihre eigenen internen Methoden übergeben. Hinter den Kulissen verwendet SpecFlow Reflection, um alle Ihre Klassen mit einem [Binding]-Attribut zu finden, und durchsucht dann alle Klassenmethoden mit den Attributen [Given], [When] oder [Then], um eine Liste von Regexes zu finden. Der am besten passende Regex identifiziert die aufzurufende Methode. Aus diesem Grund werden Bindungen oft als global beschrieben und sollten nicht wirklich mit Vererbung erstellt werden (da Sie mit mehreren identischen Regexes enden).

Zurück zu den generierten Bindungen, die Sie haben, werden diese nur im Editor erstellt, wenn SpecFlows VS-Plugin erkennt, dass Sie keine passende Regex haben und Sie versuchen, zu einer Definition (F12) in einer Feature-Datei zu navigieren . Sie sind wirklich Platzhalter, aus denen Sie bauen können.

+4

Einverstanden. Behandle die automatisch generierte Regex als nur einen Vorschlag, es wird nicht immer richtig verstanden (Verarbeitung natürlicher Sprache ist schwierig). Ein Tipp, wenn Sie Anführungszeichen um Dinge wie und in Ihren Schritten halten dann gibt es manchmal SpecFlow genug von einem Hinweis, dass es sinnvollere Ergebnisse generiert. Zum Beispiel 'Und Benutzername" "und Passwort" "ist ein gültiges Konto" wird SpecFlow erzeugen den Schritt mit '[Gegeben (@" Benutzername "" (. *) "" Und Passwort "" (. *) "" ist ein gültiges Konto ")]. –

0

Sie sollten einfache Anführungszeichen verwenden, um anzugeben, dass SpecFlow die ganze Zeichenfolge anstelle der Zahl verwenden muss.

Examples: 
| username   | password  | 
| '[email protected]' | 'password001' | 
| 'valid002'   | 'password002' |