Cucumber-js: Vorher/Nachher-Feature-Hooks und Hacks

Erstellt am 23. Aug. 2017  ·  10Kommentare  ·  Quelle: cucumber/cucumber-js

Ich verstehe die Gründe dafür, dass es keine BeforeFeature/AfterFeature-Feature-Hooks gibt. Tests sollten idealerweise isoliert durchgeführt werden. Aus praktischen Leistungsgründen kann es jedoch vorzuziehen sein, Dinge wie Datenbank-Fixtures einmal pro Feature einzurichten.

Die in #614 angegebene Problemumgehung ist unzureichend, weil:

  1. Es wird After nicht aufgerufen, wenn aufeinanderfolgende Features denselben Tag haben.
  2. After wird nicht aufgerufen, wenn das markierte Feature der letzte Test im Build war.

Vor Version 3.0.0 war es möglich, diese Funktionalität zu hacken, indem der als erstes Argument von registerHandler('BeforeFeatures') übergebene Kontext verwendet wurde.

Irgendwelche Gedanken darüber, einen PR für diese Funktionalität zu akzeptieren oder einen ähnlichen Kontext in 3.0 bereitzustellen, um den Hack zumindest wieder möglich zu machen?

Hilfreichster Kommentar

+1 für BeforeFeature/AfterFeature-Hooks
Ich stimme der Notwendigkeit zu, die Leistung mit der Testisolierung in Einklang zu bringen. So wie das Framework derzeit aufgebaut ist, gibt es nur sehr wenig, was die Szenarien in einem einzigen Feature verbindet, außer den Hintergrundschritten, die wiederholt werden. In einigen Fällen möchten wir möglicherweise nicht, dass die Hintergrundschritte wiederholt werden, sondern dass sie einmal zu Beginn des Features ausgeführt werden und erst dann abgerissen werden, wenn alle Szenarien abgeschlossen sind.

Alle 10 Kommentare

Es wird After nicht aufgerufen, wenn aufeinanderfolgende Features denselben Tag haben.

Ich verstehe nicht. Können Sie dazu bitte nähere Angaben machen? Sie könnten einen After -Hook erstellen, der spezifisch für das vorhandene Tag ist oder nicht. Beachten Sie, dass sich die Tag-Syntax geändert hat, seit diese Problemumgehung gegeben wurde.

After wird nicht aufgerufen, wenn das markierte Feature der letzte Test im Build war.

Auch das verstehe ich nicht, bitte erklären Sie mehr. Sie sollten in der Lage sein, einen After-Hook zu verwenden, aber Sie verlieren den Kontext, ob dies der letzte Hook ist oder nicht. Idealerweise müssen Sie hier keinen Teardown durchführen.


Außerdem versuchen Sie, Szenarien miteinander zu verbinden, was nicht empfohlen wird. Ich würde einen der folgenden vorschlagen:

  • Trennen Sie die Szenarien
  • Führen Sie cucumber-js mehrmals aus, laden Sie verschiedene Support-Dateien und verwenden Sie BeforeAll / AfterAll

Um klar zu sein, die Problemumgehung, auf die ich mich beziehe, ist:

this.Before({ tags: ['<strong i="6">@featurehook</strong>'] }, function () {
  // log user in (if needed)
})

this.Before({ tags: ['~<strong i="7">@featurehook</strong>'] }, function () {
  // log user out (if needed)
})

Betrachten Sie einige Funktionen:

<strong i="11">@featurehook</strong>
Feature: feature 1
   Scenario: scenario 1

<strong i="12">@featurehook</strong>
Feature: feature 2
   Scenario: scenario 2

Feature: feature 3
   Scenario: scenario 3

<strong i="13">@featurehook</strong>
Feature: feature 4
   Scenario: scenario 4

Wenn sie in der obigen Reihenfolge ausgeführt werden, findet der Teardown nicht zwischen Feature 1 und Feature 2 statt. Der Teardown findet auch nicht nach Feature 4 statt, da es keinen anderen passenden Test gibt ~ @featurehook (zugegebenermaßen kann dies mit behoben werden Letztendlich).

Ich versuche nicht, Szenarien miteinander zu verbinden, für mich ist es die Freiheit, mich für einen Kompromiss zwischen Isolation und Leistung zu entscheiden.

Nehmen wir das Beispiel eines Tests, der einen Test-SMTP-Server mit unterschiedlichen Konfigurationen einrichtet:

<strong i="20">@smtpConfig1</strong>
Feature: ....

<strong i="21">@smtpConfig2</strong>
Feature: ....

Es kann Nebenwirkungen zwischen Szenarien geben, wenn es nicht abgerissen wird, aber der Kompromiss zwischen Reinheit und Leistung könnte sich in diesem Fall lohnen.

Tut mir leid, aber das ist nichts, was meiner Meinung nach unterstützt werden sollte. Es besteht die Möglichkeit, den Zustand über alle Szenarien und über ein einziges Szenario hinweg zu teilen, was die überwiegende Mehrheit der Fälle abdeckt. Ihr Beispiel im letzten Kommentar (mit @featurehook) wird sowieso nicht durch BeforeFeature / AfterFeature gelöst.

+1 für BeforeFeature/AfterFeature-Hooks
Ich stimme der Notwendigkeit zu, die Leistung mit der Testisolierung in Einklang zu bringen. So wie das Framework derzeit aufgebaut ist, gibt es nur sehr wenig, was die Szenarien in einem einzigen Feature verbindet, außer den Hintergrundschritten, die wiederholt werden. In einigen Fällen möchten wir möglicherweise nicht, dass die Hintergrundschritte wiederholt werden, sondern dass sie einmal zu Beginn des Features ausgeführt werden und erst dann abgerissen werden, wenn alle Szenarien abgeschlossen sind.

Da ich einen Dienst wie Browserstack verwende, der ständig langsam und mühsam zu bedienen ist (und andere Remote-Server-Anbieter wie Saucelabs auch), verwende ich normalerweise BeforeFeature- und AfterFeature-Event-Handler, um Selenium-Sitzungen und Teardown pro Feature-Datei einzurichten.

Daher werden die Szenarien, die sich auf das in meiner Datei erwähnte Feature beziehen, zusammen ausgeführt, und um nach jedem Szenario neu zu beginnen, aktualisiere ich den Browserbildschirm, und der Status meiner App wird für meine Tests aktualisiert. Sie sind also gewissermaßen isoliert und es hat auch keinen Einfluss auf die Testleistung.

Dies sollte als ein Fall betrachtet werden, um die Vorher/Nachher-Feature-Hooks wieder zu verwenden, anstatt wie oben vorgeschlagen cucumberjs pro Feature-Datei auszuführen.

BeforeFeature/AfterFeature -Hooks sind für e2e/uat/bdd/call-it-whatever-you-want-Tests unerlässlich, für die Gurken gemacht sind.

Die großen "Konkurrenten" von Cucumber unterstützen dies (z. B. JBehave, RobotFramework) und das ohne irgendwelche Hacks; es ist ein richtiges Feature des Frameworks.

Dieses Problem ist definitiv ein Blocker für die Verwendung von Cucumber.

Hallo... Ich stehe vor einem diesbezüglichen Problem. In meinem Fall verwende ich getaggte Before- und After-Hooks, um Daten zu erstellen/zu löschen, die zum Testen der Benutzeroberfläche verwendet werden. Im Before-Hook treffe ich einen API-Endpunkt und erstelle die Daten, und im After-Hook treffe ich einen anderen API-Endpunkt, um ihn zu löschen (ich speichere die IDs der Objekte, die in der Create-Antwort zurückgegeben werden, und erstelle dann die Löschnutzlast mit diesen IDs )

Das Problem ist, dass, wenn das Szenario, das diese Daten verwendet (und die Hooks auslöst), das letzte ist, das ausgeführt wird, der After-Hook nie ausgelöst wird ...

Irgendeine Möglichkeit, dies zu umgehen??

Danke

+1 für Vorher-Nachher-Funktion.
Unser Anwendungsfall ist folgender: Wir finden Fehler in bestimmten Browsern, die in anderen nicht auftauchen.

Wir möchten eine Funktion wie folgt markieren:

@ie-8-only
Business Need: IE8 should have limited functionality, but what is displayed, should be displayed correctly

@no-access @ssl-insecurity <strong i="8">@security</strong> @BUG-1876
Scenario: No access
   Given I am on the home page
   When I see that my browser is not supported
   Then I should not be able to access the core site functionality

@formatting-issue <strong i="9">@bugs</strong> @BUG-1210
Scenario: The menu should not be formatted like a staircase
   For the users to be able to navigate to the about us / contact us area of the site, the site navigation should be active
   Given I am on the home page
   When I see the menu
   Then it should be displayed in a line

Dadurch können wir den Browser schließen und den IE in einem BeforeFeature-Hook öffnen und den Browser, den wir für den Rest der Suite verwenden, im AfterFeature-Hook erneut öffnen. Das Schließen und erneute Öffnen des Browsers nimmt viel Zeit in Anspruch, wenn Sie dies für jedes Szenario tun, was dies zu einer großartigen Funktion machen würde.

Notiz:
Ich weiß, dass es Alternativen gibt, die das Weltobjekt beinhalten (aktuellen Browser dort einstellen und nur schließen, wenn der Browser nicht das ist, was wir im beforeAll-Hook dafür brauchen), aber es scheint einfacher zu sein, es auf diese Weise zu tun, und es muss so sein bereits in einem Haken fertig oder Selenium entscheidet, dass es die Hälfte der Zeit einen zischenden Anfall auslösen wird.

Es gibt andere Fälle, in denen Sie Text an das Feature als zusätzliche Beschreibung in einem BeforeFeature-Hook anhängen möchten, was ein weiteres Beispiel dafür ist, wo dies nützlich wäre

Ich denke auch, dass Vorher/Nachher-Feature-Hooks bei bestimmten Arten von Tests nützlich wären. Beispielsweise hat Specflow, die Cucumber-Bibliothek für .NET, diese implementiert:
https://specflow.org/documentation/Hooks/

Dieser Thread wurde automatisch gesperrt, da es nach seiner Schließung keine Aktivitäten mehr gegeben hat. Bitte öffnen Sie ein neues Problem für verwandte Fehler.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen