Cucumber-js: Fügen Sie BeforeStep / AfterStep-Hooks hinzu

Erstellt am 4. Jan. 2018  ·  33Kommentare  ·  Quelle: cucumber/cucumber-js

Nützlich für Validierungen, nachdem jeder Schritt beendet ist. this sollte die Weltinstanz sein

Hilfreichster Kommentar

Hallo zusammen,

Irgendwelche Neuigkeiten zu Step-Hooks? Oder eine Problemumgehung zum Ausführen von Code vor und/oder nach jeder Schrittausführung?

Alle 33 Kommentare

@charlierudolph Ich würde hier gerne helfen, brauche aber einen Hinweis auf die geeignete Art und Weise, es umzusetzen. Ich glaube, es gab syntaktischen Zucker AfterStep für registerHandler, der kürzlich entfernt wurde. Ich habe mir support_code_library_builder/define_helpers.js angesehen. Aber brauchen einige Hinweise, wie man diese Hooks implementiert.
Danke
Ali
PS Vielen Dank, dass Sie das Ergebnis im json-Format zurückgesetzt haben.

Eine Frage hier ist jedoch, wie sich dies auf den Workflow auswirkt. Kann dies den Ergebnisstatus des Schritts bearbeiten oder fungiert es als ein weiterer Schritt, der bestanden/fehlgeschlagen werden kann?

Der Anwendungsfall, den ich in einem der Kommentare gesehen habe und den ich auch verwenden möchte, ist, nach dem Schritt einen Screenshot zu erstellen. In Cucumber Ruby habe ich den AfterStep verwendet, der den Zugriff auf das Scenario-Objekt ermöglicht.
IMHO sollte der Afterstep-Hook nur für Anwendungsfälle verwendet werden, in denen Benutzer das Schrittergebnis selbst prüfen möchten, aber nicht in der Lage sein sollten, das Ergebnis zu ändern. Ich denke auch, dass es nicht ein weiterer Schritt sein sollte, der bestanden/fehlgeschlagen werden kann.

@charlierudolph Ich suche auch nach einer ähnlichen Lösung.
Bevor der registerHandler veraltet wurde, habe ich diesen Code verwendet, um nach fehlgeschlagenen Schritten einen Screenshot zu machen.:

```
this.registerHandler('StepResult', function (event, callback) {
var stepResult = event.getPayloadItem('stepResult');

if (stepResult.getStatus() == 'failed') {
  takeScreenshot()
    .then(function () {
      callback();
    });
} else {
  callback();
}});

````

Jetzt habe ich keine Lösung dafür.

Hallo,

Ich habe in den meisten Threads, die ich in Bezug auf BeforeStep/AfterStep-Hooks gelesen habe, gesehen, dass der Anwendungsfall einen Druckbildschirm erstellt. Dies ist nicht mein Anwendungsfall und ich möchte nur andere Anwendungsfälle für diese Hooks äußern:

Mein Projekt hat this.AfterStep Hook in Cucumber 1.x verwendet für:

  • Erhebung von Daten - wie alle externen Links:
    element.all(by.css('a')).each(function(link) { link.getAttribute('href').then(function(href) { ... }); });

Alle externen Links werden dann in einem separaten Testanzug getestet.

  • Überprüfung auf Duplikate von Element-IDs (um sicherzustellen, dass alle IDs eindeutig sind, um dem HTML-Standard zu entsprechen, und um das Erstellen von Tests zu vereinfachen)
  • Überprüfung auf Skriptfehler (AfterStep würde eine Variable für After Hook setzen, um das Szenario tatsächlich zu scheitern).
  • Ignorieren von Browserwarnungen. Bei einigen Testszenarien öffnet der Webbrowser ein Warnfenster, das wir möglicherweise ignorieren möchten. Dies gilt insbesondere, wenn Formular- und Eingabeelemente vorhanden sind, der Browser warnt ("Sie haben nicht gespeicherte Änderungen ...")

Derzeit werden Cucumber 4.0.0 und Protractor 4.0.14 verwendet

Nebenbemerkung: Unsere Anwendungsfälle funktionierten mit this.AfterStep() in Cucumber 1.xx nicht richtig, da es nicht dafür ausgelegt war, diese Art von Code zu enthalten, und wir sahen Probleme mit Race-Conditions. Daher haben wir auf Cucumber 4.0.0 aktualisiert und die AfterStep-Logik deaktiviert, bis es eine angemessene Unterstützung dafür gibt.

Hallo,

Irgendwelche Updates bezüglich dieser Hooks vor/nach dem Schritt?
Gibt es eine Problemumgehung für den AfterStep-Hook? Ich möchte einen Screenshot machen, wenn der jeweilige Test fehlgeschlagen ist.

„attach“ ist für mich nicht verfügbar, da wir den standardmäßigen World-Konstruktor https://github.com/cucumber/cucumber-js/blob/master/docs/support_files/world.md überschrieben haben

Danke

Hallo @gajo4256 ,

Ich verwende Gurke 4.0.0 und dieses Snippet:

After(function (scenario) {
  if (scenario.result.status === Status.FAILED) {
    const World = this;

    return browser.takeScreenshot().then(function (buffer) {
      return World.attach(buffer, 'image/png');
    });
  }});

Dadurch wird nach jedem fehlgeschlagenen Szenario ein Screenshot erstellt. (Es funktioniert für mich, denn mit Gurke schlägt das gesamte Szenario fehl, wenn ein Schritt fehlschlägt, also ist es fast identisch mit "nach dem Schritt fehlgeschlagen".

Ich hoffe es hilft.

Hallo @mracz ,

thnx, ich habe das tatsächlich versucht (obwohl es nach jedem Schritt besser für mich geeignet wäre).
Da ich den Standard-Weltkonstruktor überschrieben habe, wie kann ich Attach wieder für mich verfügbar haben, wie es im Normalfall ist?

Danke

Hallo @gajo4256 ,

Dies ist, was ich in meiner benutzerdefinierten Weltimplementierung habe:

const { setWorldConstructor } = require('cucumber');

function CustomWorld( { attach } ) {
  this.attach = attach;
}

setWorldConstructor(CustomWorld);

@mracz , ich mache das derzeit für jeden Schritt:

    When('I do something', function () {
        return takeScreenshot(this, () => {
            return $(...).click();
        });
    });

Wo die Funktion zum Aufnehmen von Screenshots ist:

export function takeScreenshot(world, stepToExecute: () => promise.Promise<any>): promise.Promise<any> {
    return stepToExecute().then(() => {
        return doTakeScreenshot(world);
    }).catch((err) => {
        return doTakeScreenshot(world).then(() => {
            throw err;
        });
    });
}

function doTakeScreenshot(world) {
    return browser.takeScreenshot().then((screenshot) => {
        world.attach(screenshot, 'image/png');
    }).catch((err) => {
        console.warn('Could not create screenshot', err);
    });
}

Ich war vielleicht zu defensiv in Bezug auf Ausnahmen, aber ich habe mein Bestes getan, damit der zusätzliche Code die tatsächlichen Testergebnisse nicht beeinträchtigt. Das Beste, was ich jetzt tun kann, wäre ein funktionierender AfterStep -Hook, der mich dazu bringen würde, weniger Boilerplate hinzuzufügen.

Was der Hook jedoch wahrscheinlich nicht tun würde, ist das Überspringen von Screenshots, wenn ich Behauptungen mache, die den Bildschirm nicht ändern (daher wäre der Screenshot nutzlos), z. B. Then some element is not shown . Ich denke, ein erweiterbares Weltobjekt könnte da draußen helfen.

Hier ist ein weiterer Anwendungsfall für AfterStep -Hooks: Warten Sie, bis sich die Peers synchronisieren (unter Verwendung von Vektoruhren oder Lamport-Zeitstempeln). /cc @tooky @jbpros

Hallo an alle.
Ich arbeite tatsächlich an diesem Thema.

Wir suchen nach einer Möglichkeit, Screenshots von all unseren verschiedenen Schritten zu machen.
Im Moment denken wir darüber nach, die StepDefinitions-Funktion von Cucumber zu überschreiben.

Ich weiß nicht, ob es der bestmögliche Weg ist, also zögern Sie bitte nicht, Ihre Meinung dazu abzugeben!

Für alle, die Probleme haben, gibt es hier eine Möglichkeit, dies mit dem Definitionsfunktions-Wrapper zu tun: https://github.com/PeerioTechnologies/peerio-icebear/blob/dev/test/e2e/code/hooks.js#L28

Unser Hauptanwendungsfall wäre wie andere hier: Screenshots, aber es eher als Debugging-Tool zu verwenden, damit wir die Ausgabe jedes Schritts sehen können, wenn wir den Debugging-Modus in unserer Konfiguration aktivieren.

Eine andere Verwendung: Wir haben einige Modals, die nach einer gewissen Zeit auf unserer Website erscheinen können. Wenn wir ein Szenario durchlaufen, möchten wir nach jedem Schritt Überprüfungen für diese Modale auf der Seite haben, um sicherzustellen, dass unsere Tests aufgrund dieser Modale nicht anfällig sind.

Ein weiterer Anwendungsfall: Wenn jemand ein Reporting-Tool komplett mit Dashboard erstellen möchte (derzeit laufende Teststatus, Testfälle, die zuvor ausgeführt wurden usw.), könnte Cucumber in den Step-Hooks an das Tool posten, um ein Update zum Fortschritt zu erhalten. Es ist ein ungewöhnliches Beispiel, ich weiß, aber es ist etwas, das ich gerne untersuchen möchte, nachdem ich darüber nachgedacht habe.

KyleFairns, ich brauche AfterStep für das Dashboard, wie Sie erwähnt haben

Hallo,

Wir möchten nach jedem Schritt prüfen, ob ein JavaScript-Fehler vorliegt. Nicht nur die gescheiterten Schritte.
(Bitte das gleiche wie @markus-lundin-86)
Jetzt können wir das nur nach jedem Szenario tun.
Ist das so auf der Roadmap oder hat jemand andere Lösungen?

Ich habe gerade entdeckt, dass WebDriverIO BeforeStep- und AfterStep-Hooks für Gurken hat, die mein Problem lösen.

Hoffentlich hilft das...

Hallo zusammen,

Irgendwelche Neuigkeiten zu Step-Hooks? Oder eine Problemumgehung zum Ausführen von Code vor und/oder nach jeder Schrittausführung?

Hallo zusammen,
In der gleichen Situation wie @Prasant-Sutaria.
Gibt es ein Update zu Step-Hooks oder Workarounds?
Vielen Dank im Voraus.

Keine Aktualisierungen. Ich warte immer noch darauf, dass jemand eine Pull-Anfrage dafür einreicht.

Gibt es dazu einen Fahrplan oder ähnliches? Da dies ein großer Schmerzpunkt ist, um diese Funktion zu haben, wäre vielleicht eine offizielle Erklärung schön.

@aslakhellesoy gibt es eine Checkliste oder etwas, was ein Pull-Request implementieren muss? AFAIK #1058 und #1121 versuchen, diese Funktion oder einige Möglichkeiten zur Problemumgehung bereitzustellen.

Hallo Leute,
Ich habe gerade eine PR zu diesem Problem erstellt: https://github.com/cucumber/cucumber-js/pull/1198.
Lassen Sie mich wissen, wenn Sie es nützlich finden.

@aslakhellesoy , ich habe den obigen PR (#1198) erstellt, um dieses Problem/diese Funktionsanfrage zu adressieren. Können Sie sich das bitte ansehen oder mir jemanden nennen, an den ich mich wenden kann?
cc: @charlierudolph

irgendwelche Updates? freue mich auch drauf :)

Ich sehe 2 PRs @leonardonelson91
Ich denke, sie haben nicht den besten Weg gefunden, diese Funktion zu implementieren
https://github.com/cucumber/cucumber-js/pull/1198
https://github.com/cucumber/cucumber-js/pull/1058

@charlierudolph haben Sie eine Ansicht darüber, ob die für BeforeStep und AfterStep registrierten Funktionen weiterhin ausgeführt werden sollten, wenn der Schritt abläuft?

Wie einige andere hier verwende ich setDefinitionFunctionWrapper , um das Screenshot-Ding zu erreichen, was großartig funktioniert, außer dass ich keine Möglichkeit habe, wenn Testschritte ablaufen - das Beste, was ich tun kann, ist ein kürzeres Timeout für die Browser-Instrumentierung, sodass es ausgelöst wird, während der Schritt noch aktiv ist. Ich hoffe, an einer Lösung für setDefinitionFunctionWrapper zu arbeiten, wollte aber auch wissen, was die Absicht hier war.

Ich würde erwarten, dass BeforeStep / AfterStep unabhängig davon ausgeführt wird, ob ein Schritt bestanden / fehlgeschlagen ist (aufgrund einer Zeitüberschreitung oder aus anderen Gründen).

Nur um einen weiteren Anwendungsfall hinzuzufügen, bei dem es nicht um Screenshots geht. Ich teste ein ereignisgesteuertes System und die Tests bewirken, dass Ereignisse generiert werden. Diese Ereignisse werden dann gelesen und erzeugen Änderungen am System.

Die folgenden Schritte bestätigen, dass sich das System im erwarteten Zustand befindet, was erfordert, dass alle Ereignisse verarbeitet wurden. Ich möchte die Möglichkeit haben, sicherzustellen, dass die Warteschlange vollständig verarbeitet wurde und sich nichts im Status „Ausstehend“ befindet, bevor ich mit dem nächsten Schritt fortfahre.

Derzeit führe ich einige Abfragen des Ereignisstroms in Validierungsschritten durch, aber es wäre schön, ihn einfach in einen Hook zu stecken. Da es eine allgegenwärtige Anforderung ist, dass sich das System in einem stabilen Zustand befindet, bevor mit dem nächsten Schritt fortgefahren wird.

@davidjgoss @charlierudolph Bitte können Sie mir mit einem Beispielcode von setDefinitionFunctionWrapper helfen, um die Screenshots von BeforeStep/AfterStep zu erreichen? Ich versuche es mit Nightwatch JS

Hallo @RArkasali , hier ist ein Ausschnitt aus einem Projekt, an dem ich arbeite:

import {setDefinitionFunctionWrapper} from "cucumber";

setDefinitionFunctionWrapper(function(fn) {
    return async function(...args) {
        try {
            return await fn.apply(this, args);
        } catch (ex) {
            await this.takeScreenshot();
            throw ex;
        }
    };
});

(Wobei takeScreenshot eine Methode auf Ihrem benutzerdefinierten World ist, die das eigentliche Screenshot-Zeug macht. Ich bin mit Nightwatch nicht vertraut genug, um zu wissen, wie das aussieht, aber ich bin sicher, Sie werden es tun Sein.)

Dadurch wird ein Screenshot erstellt, wenn innerhalb der Schrittfunktion ein Fehler (z. B. ein Assertion-Fehler) auftritt. Die Tatsache, dass wir das Ergebnis eines Nicht-Fehlers zurückgeben, ist wichtig - ich war eine Weile verwirrt, während ein Schritt mit return "pending" nicht behandelt wurde, bis ich merkte, dass ich den Rückgabewert verschluckte.

Hoffe das hilft

Hallo zusammen,
Wie ist der Stand dieses Problems? Braucht es noch Hilfe?
Ich interessiere mich für BeforeStep und AfterStep, weil es mir helfen würde, eine "Protokolldatei" mit allen Schrittnamen und zusätzlichen Protokollinformationen zu haben. Es ist etwas einfacher als die Erstellung eines benutzerdefinierten Formatierers.

Dies wurde als Teil von https://github.com/cucumber/cucumber-js/pull/1416 hinzugefügt

Schließen dieses Problems, da die Hooks in https://github.com/cucumber/cucumber-js/pull/1416 hinzugefügt wurden

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

kozhevnikov picture kozhevnikov  ·  6Kommentare

NoNameProvided picture NoNameProvided  ·  5Kommentare

lamartire picture lamartire  ·  6Kommentare

bmsoko picture bmsoko  ·  7Kommentare

edgarechm picture edgarechm  ·  5Kommentare