2013-10-15 1 views
9

zu haben Ich schreibe Abnahmetests in Gurke, wo ich für mehrere Änderungen in der Benutzeroberfläche einer Webanwendung basierend auf einer ersten Aktion testen möchte. Hier ein Beispiel:Ist es in Ordnung, mehrere Gruppen von Gegebenheit/Wann/Dann in einem einzigen Gurken-Szenario

 Scenario: Cancel editing a new text asset 
      Given the user "[email protected]" is logged in 
      When the user navigates to "/build/" 
      And the user clicks the "Sandbox" link 
      And the user inputs "Test story for canceling editing of a new text asset" for the "title" field 
      And the user inputs "Test User" for the "byline" field 
      And the user inputs "My summary, so exciting!" for the "summary" textarea 
      And the user clicks on "Untitled Section" in the section list 
      And the user clicks the "Text" icon in the "center" container 
      And the user inputs the following text in the rich text editor: 
        """ 
        Test text for asset. This is cool. 
        """ 
      And the user clicks the "cancel" button 
      Then the following text is not present: 
        """ 
        Test text for asset. This is cool. 
        """ 
      And the "Image" icon is present 
      And the "Text" icon is present 
      When the user refreshes the browser 
      And the user clicks on "Untitled Section" in the section list 
      Then the following text is not present: 
        """ 
        Test text for asset. This is cool. 
        """ 
      When the user opens the asset drawer 
      Then the following text is not present: 
        """ 
        Test text for asset. This is cool. 
        """ 

Hinweis, dass es mehrere Gruppen von Wenn/Dann Schritten zum Antworten der anfänglichen Aktion zu testen. Während die meisten Implementierungen von Schritten das Präfix-Schlüsselwort ignorieren, und ich bin mir ziemlich sicher, dass ich diesen Test ausführen kann, gibt es eine bessere Möglichkeit, die verschiedenen Ergebnisse zu testen? Ist es besser, mehrere Szenarien mit demselben Setup, aber unterschiedlichen "Then" -Anweisungen zu schreiben?

+0

Hmm. Beantwortet nicht die Frage, ob es möglich ist oder nicht. Jetzt auf mehr Google-Suche ... – djangofan

+0

Mögliche Duplikate von [Ist es akzeptabel, einen "Gegeben wenn dann wenn wenn dann" Test in Gurke schreiben?] (Https://stackoverflow.com/questions/12060011/is-it-acceptable- zu schreiben-ein-gegeben-wenn-dann-wann-dann-test-in-gherkin) –

+0

Ich stimme der akzeptierten Antwort nicht zu; Ich fügte [meine Antwort] (https://stackoverflow.com/a/45245799/634576) zu der Frage hinzu, von der dieses ein Duplikat ist. –

Antwort

19

Denken Sie daran, dass Sie nur EINES Verhalten/Feature gleichzeitig testen sollten. Faustregel ist, dass Sie nur ein, wenn Schritt verwenden sollte:

Given some state before action 
    And some other state before action 
    ... 
When only one action 
Then assert correct output 
    And assert correct output 
    ... 

Sie sehen - nur eine Zeile Wenn, ohne Ands unter Wann. Wenn Sie stattdessen viele When-Schritte verwenden, erstellen Sie ein Testskript, keine Spezifikation. Ihre Tests werden schwer zu verstehen sein und Sie werden feststellen, dass Sie mehr und mehr Schritte hinzufügen, wenn sich die zugrunde liegende Implementierung ändert.

Sie müssen auch die zugrunde liegende Logik verborgen halten, da Sie sie nicht jedes Mal ändern möchten, wenn Sie etwas Irrelevantes ändern. Beispiel:

Und der Benutzereingaben "Meine Zusammenfassung, so aufregend!" für die "Zusammenfassung" Textfeld

Was passiert, wenn Sie das Zusammenfassungsfeld von einem Textfeld zu einem Eingabetyp ändern? Sie müssen das Szenario ändern (Wartungsalarm) oder das Szenario liegen lassen (schlimmer als kein Szenario). Sie sollten stattdessen schreiben:

When the user describes it as "so exciting!" 

Aber immer noch ist die Struktur des gesamten Szenarios schlecht. Stellen Sie sich die Frage: Was ich überprüfen möchte? Wenn ich eine Person war, die die Geschäftslogik des Merkmals verstehen will, würde Ich mag so etwas wie sehen:

Scenario: Cancel editing a new text asset 
    Given I edit the Sandbox details with some data 
    When I cancel editing 
    Then Sandox details should be empty 

Das ist es!

Wie erreichen? Verschieben Sie alle irrelevanten Logik tiefer, verwenden Sie die PageObject pattern usw. Und lesen Sie über Specification By Example

+0

danke für Ihre hilfreiche Antwort. Ich habe gehört, was Sie damit sagen, dass die Spezifikationen die Kerngeschäftslogik eines Features widerspiegeln und sie dadurch zukunftssicherer machen. Ist es dann unangemessen, mit Features/Scenarios bestimmte UI-Implementierungen um ein Feature zu testen? Wenn ja, was passt besser? Ich verstehe, dass in meinem Beispiel einige Unklarheiten zwischen der Grenze zwischen dem Feature und einer bestimmten UI-Komponente gibt. –

+0

1. Verwenden Sie Gurken nur für UI-Tests, wenn dies (aufgrund der verwendeten Tools, des Frameworks usw.) der schnellste Weg ist. 2.Wenn Sie Gurke zur Kommunikation mit anderen verwenden, konzentrieren Sie sich auf Benutzerziele, nicht auf die Benutzeroberfläche, und verwenden Sie PageObjects, um die zugrunde liegende Logik zu umbrechen. Für Erstere verwenden Sie das schnellste Werkzeug - die meisten Leute kümmern sich nicht um Unterschiede zwischen Textfeldern und Eingabefeldern. Ich verwende zum Beispiel nur PageObjects + Javascript-Unit-Tests, um die UI-Logik zu testen, weil dies in unserem Fall der schnellste Ansatz ist. –

+1

Gherkin soll Ihre Geschäftsregeln abdecken, nicht Ihren Code. Bei BDD geht es um Anwendungsdesign, nicht um Anwendungstests. Wenn Sie funktionale Elemente benötigen, die Sie testen müssen, verwenden Sie ein funktionales Testframework oder einen umfassenden Satz von Komponententests. –

Verwandte Themen