ruby - tutorial - Gurkenschritte wiederverwenden




cucumber testautomatisierung (4)

Ich möchte einige Gurkenschritte wiederverwenden, finde aber nicht den richtigen Weg.

Ich möchte einen Schritt schreiben wie:

Given /^I login with (.*) credentials$/ |type|
  # do stuff with type being one of "invalid" or "valid"
end

Aber dann einen weiteren Schritt wie:

Given /^I login successfully$
  # call "Given I login with valid credentials"
end

Also kann ich beim Testen der Benutzerauthentifizierung das erstere verwenden, aber die meisten anderen Orte kann ich letzteres verwenden und muss nicht wirklich neu codieren.

Gibt es eine Möglichkeit, diesen anderen Schritt zu nennen, oder lege ich einfach die Logik in eine Hilfsmethode und rufe diese Methode für jede Aufgabe auf (im Grunde ein Methodenextraktions-Refactoring, das mich nach dem Lesen meiner Frage glauben lässt, dass es der beste Weg ist sowieso)?


Am besten verpacken Sie Ihre Schritte in% {} statt in Anführungszeichen. Dann müssen Sie doppelte Anführungszeichen nicht umgehen, die Sie häufig verwenden müssen .:

Given /^I login successfully$
  step %{I login with valid credentials}
end

Given /^I login with (.*) credentials$/ |type|
  # do stuff with type being one of "invalid" or "valid"
end

Beachten Sie, dass sich die Methode zum Aufrufen von Schritten innerhalb von Schritten in den letzten Versionen von gurke geändert hat. Sie sehen einen Fehler wie "WARNUNG: Verwenden von 'Gegeben / Wann / Dann' in Schrittdefinitionen ist veraltet, verwenden Sie 'Schritt' zu Rufen Sie stattdessen andere Schritte auf: /path/to/step_definitions/foo_steps.rb: 631: in `block in '". Siehe das Gurken Wiki für Details.

Das Wesentliche der Änderung ist, dass Sie jetzt die step oder step verwenden sollten.

When /^I make all my stuff shiny$/
  step "I polish my first thing"
end

When /^I make all my stuff shiny$/
  steps %Q{
    When I polish my first thing
    When I shine my second thing
  }
end

Verwenden Sie Keywords erneut in Feature-Dateien, die eine Wiederverwendbarkeit von Code ermöglichen.

Es wird NICHT empfohlen, Step Defs innerhalb von Step Defs aufzurufen.

Ich würde meine Feature-Datei auf diese Weise schreiben,

Scenario Outline: To check login functionality
    Given I login with "<username>" and "<password>"
    Then I "<may or may not>" login successfully

Examples:
    |username|password|may or may not|
    |paul    |123$    |may           |
    |dave    |1111    |may not       |

In meiner Schrittdefinition (Dies ist Java)

@Given(I login with \"([^\"]*)\" and \"([^\"]*)\"$)
public void I_login_with_and(String username, String password){

   //login with username and password

}

@Then(I \"([^\"]*)\" login successfully$)
public void I_login_successully_if(String validity){

    if(validity.equals("may")){
        //assert for valid login
    }
    else
    if(validity.equals("may not")){
        //assert for invalid login
    }
}

Auf diese Weise gibt es eine Menge Code-Wiederverwendbarkeit. Ihre gleichen Given und Then behandelt sowohl gültige als auch ungültige Szenarien. Zur gleichen Zeit macht Ihre Feature-Datei für die Leser Sinn.


UPDATE : Die unten beschriebene Methode ist veraltet. Der empfohlene Weg, einen Schritt innerhalb eines anderen Schrittes aufzurufen, sieht nun so aus:

Given /^I login successfully$/
    step "I login with valid credentials" 
end 

Alte, veraltete Methode (als Referenz):

Sie können Schritte von anderen Schritten wie folgt aufrufen:

Given /^I login successfully$/
  Given "I login with valid credentials"
  Then "I should be logged in"
end

Wenn alle Szenarios innerhalb eines Features dies (oder andere Schritte) erfordern, können Sie den einzelnen Features auch einen Hintergrund hinzufügen, beispielsweise:

Background:
  Given I log in with valid credentials

Scenario: Change my password
  Given I am on the account page