Cucumber-js: ajouter des crochets BeforeStep / AfterStep

Créé le 4 janv. 2018  ·  33Commentaires  ·  Source: cucumber/cucumber-js

Utile pour les validations après la fin de chaque étape. this devrait être l'instance mondiale

Commentaire le plus utile

Salut tout le monde,

Une mise à jour sur les crochets Step ? Ou une solution pour exécuter du code avant et/ou après l'exécution de chaque étape ?

Tous les 33 commentaires

@charlierudolph J'aimerais aider ici, mais j'ai besoin d'un pointeur sur la manière appropriée de l'implémenter. Je crois qu'il y avait du sucre syntaxique AfterStep pour registerHandler qui a été supprimé récemment. J'ai regardé support_code_library_builder/define_helpers.js. Mais besoin de quelques conseils sur la façon d'implémenter ces crochets.
Merci
Ali
PS Merci d'avoir inversé le format json du résultat.

Une question ici cependant est de savoir comment cela affecte-t-il le flux de travail ? Cela peut-il modifier l'état du résultat de l'étape ou agit-il comme une autre étape qui peut réussir/échouer ?

Le cas d'utilisation que j'ai vu dans l'un des commentaires et que je souhaite également utiliser est de créer une capture d'écran après l'étape. Dans Cucumber Ruby, j'ai utilisé l'AfterStep qui donne accès à l'objet Scenario.
À mon humble avis, le hook afterstep ne doit être utilisé que pour les cas d'utilisation où l'utilisateur souhaite introspecter le résultat de l'étape mais ne doit pas être en mesure de modifier le résultat. Je pense aussi qu'il ne faut pas une autre étape qui peut réussir/échouer.

@charlierudolph Je recherche également une solution similaire.
Avant que le registerHandler ne devienne obsolète, j'ai utilisé ce code pour prendre une capture d'écran après l'échec des étapes. :

```
this.registerHandler('StepResult', fonction (événement, rappel) {
var stepResult = event.getPayloadItem('stepResult');

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

````

Maintenant, je n'ai pas de solution pour cela.

Salut,

J'ai vu dans la plupart des discussions que j'ai lues concernant le crochet BeforeStep/AfterStep que le cas d'utilisation prend un écran d'impression. Ce n'est pas mon cas d'utilisation et je veux juste exprimer d'autres cas d'utilisation pour ces crochets :

Mon projet a utilisé this.AfterStep hook dans le concombre 1.x pour:

  • collecte de données - comme tous les liens externes :
    element.all(by.css('a')).each(function(link) { link.getAttribute('href').then(function(href) { ... }); });

Tous les liens externes sont ensuite testés dans une combinaison de test séparée.

  • Vérification des doublons d'ID d'élément (le but est de s'assurer que tous les ID sont uniques pour se conformer à la norme HTML et facilite également la création de tests)
  • Vérification des erreurs de script (AfterStep définirait une variable pour After hook pour faire échouer le scénario).
  • Ignorer les alertes du navigateur. Quelques scénarios de test font que le navigateur Web ouvre une fenêtre d'alerte que nous voudrons peut-être ignorer. Cela s'applique particulièrement lorsqu'il y a des éléments de formulaire et d'entrée, le navigateur alertera ("Vous avez des modifications non enregistrées...")

Utilise actuellement Cucumber 4.0.0 et Protractor 4.0.14

Remarque : nos cas d'utilisation ne fonctionnaient pas correctement avec this.AfterStep() dans Cucumber 1.xx car il n'a pas été conçu pour contenir ce type de code et nous avons rencontré des problèmes avec les conditions de concurrence. Nous avons donc mis à niveau vers Cucumber 4.0.0 et désactivé la logique AfterStep jusqu'à ce qu'elle soit correctement prise en charge.

Salut,

des mises à jour concernant ces crochets d'étape avant/après ?
Existe-t-il une solution de contournement pour le crochet AfterStep ? Je voudrais prendre une capture d'écran si le test particulier avait échoué.

"attach" n'est pas disponible pour moi car nous avons remplacé le constructeur World par défaut https://github.com/cucumber/cucumber-js/blob/master/docs/support_files/world.md

Merci

Bonjour @gajo4256 ,

J'utilise concombre 4.0.0 et cet extrait:

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

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

Cela prendra une capture d'écran après chaque scénario échoué. (Cela fonctionne pour moi, car avec le concombre, chaque fois qu'une étape échoue, tout le scénario échoue, il est donc presque identique à "après l'échec de l'étape".

J'espère que ça aide.

Salut @mracz ,

thnx, j'ai effectivement essayé cela (bien qu'après chaque étape, ce serait plus approprié pour moi).
Étant donné que j'ai remplacé le constructeur World par défaut, comment puis-je avoir à nouveau une pièce jointe disponible pour moi comme c'est le cas normalement?

Merci

Bonjour @gajo4256 ,

Voici ce que j'ai dans mon implémentation du monde personnalisé :

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

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

setWorldConstructor(CustomWorld);

@mracz , je le fais actuellement pour chaque étape :

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

Où la fonction de prise de capture d'écran est-elle :

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);
    });
}

J'ai peut-être été trop défensif à propos des exceptions, mais j'ai fait de mon mieux pour que le code supplémentaire n'interfère pas avec les résultats réels des tests. Le mieux que je puisse faire en ce moment, un crochet AfterStep fonctionnel me ferait ajouter moins de passe-partout.

Cependant, ce que le crochet ne ferait probablement pas, c'est de sauter les captures d'écran lorsque je fais des affirmations qui ne changent pas l'écran (la capture d'écran serait donc inutile), par exemple Then some element is not shown . Je suppose qu'un objet mondial extensible pourrait aider là-bas.

Voici un autre cas d'utilisation pour les crochets AfterStep : attendez que les pairs se synchronisent (en utilisant des horloges vectorielles ou des horodatages lampport). /cc @tooky @jbpros

Bonjour à tous.
Je travaille actuellement sur ce problème.

Nous recherchons un moyen de prendre une capture d'écran de toutes nos différentes étapes.
À l'heure actuelle, nous envisageons de remplacer la fonction StepDefinitions du concombre.

Je ne sais pas si c'est la meilleure façon possible alors n'hésitez pas à donner votre avis à ce sujet !

Pour ceux qui ont du mal, voici un moyen de le faire avec le wrapper de fonction de définition : https://github.com/PeerioTechnologies/peerio-icebear/blob/dev/test/e2e/code/hooks.js#L28

Notre principal cas d'utilisation serait comme les autres ici : des captures d'écran, mais en l'utilisant davantage comme un outil de débogage afin que nous puissions voir le résultat de chaque étape si nous activons le mode de débogage dans notre configuration.

Autre utilisation : nous avons quelques modaux qui peuvent apparaître après un certain temps sur notre site Web. Si nous parcourons un scénario, nous voudrions avoir des vérifications en place pour les modaux présents sur la page après chaque étape pour nous assurer que nos tests ne sont pas fragiles à cause de ces modaux.

Autre cas d'utilisation : si quelqu'un souhaite créer un outil de création de rapports complet avec un tableau de bord (états de test en cours d'exécution, cas de test qui ont déjà été exécutés, etc.), le concombre peut publier sur l'outil dans les crochets d'étape pour une mise à jour sur la progression. C'est un exemple inhabituel, je sais, mais c'est quelque chose qui m'intéresse maintenant que j'y ai réfléchi.

KyleFairns, j'ai besoin d'AfterStep pour le tableau de bord comme vous l'avez mentionné

Bonjour,

Nous voulons vérifier s'il y a une erreur javascript après chaque étape. Pas seulement les étapes ratées.
(Un peu comme @markus-lundin-86)
Maintenant, nous ne pouvons le faire qu'après chaque scénario.
Alors est-ce sur la feuille de route, ou quelqu'un a-t-il d'autres solutions ?

Je viens de découvrir que WebDriverIO a des crochets beforeStep et afterStep pour le concombre qui résout mon problème.

J'espère que cela pourra aider...

Salut tout le monde,

Une mise à jour sur les crochets Step ? Ou une solution pour exécuter du code avant et/ou après l'exécution de chaque étape ?

Salut tout le monde,
Dans la même situation que @Prasant-Sutaria.
Une mise à jour sur les crochets d'étape ou une solution de contournement ?
Merci d'avance.

Aucune mise à jour. J'attends toujours que quelqu'un soumette une pull request pour cela.

Existe-t-il une feuille de route ou quoi que ce soit à ce sujet ? Comme il s'agit d'un problème majeur pour avoir cette fonctionnalité, peut-être qu'une déclaration officielle serait bien.

@aslakhellesoy existe-t-il une liste de contrôle ou quelque chose qu'une demande d'extraction doit mettre en œuvre ? AFAIK # 1058 et # 1121 essaient d'apporter cette fonctionnalité, ou des solutions de contournement.

Salut les gars,
Je viens de créer un PR concernant ce problème : https://github.com/cucumber/cucumber-js/pull/1198.
Faites-moi savoir si vous le trouvez utile.

@aslakhellesoy , j'ai créé le PR ci-dessus (#1198) pour résoudre ce problème/demande de fonctionnalité. Pouvez-vous s'il vous plaît y jeter un coup d'œil ou m'indiquer une personne à contacter ?
cc: @charlierudolph

les mises à jour? hâte de l'avoir aussi :)

Je vois 2 PR @leonardonelson91
Je pense qu'ils n'ont pas trouvé le meilleur moyen d'implémenter cette fonctionnalité
https://github.com/cucumber/cucumber-js/pull/1198
https://github.com/cucumber/cucumber-js/pull/1058

@charlierudolph savez-vous si les fonctions enregistrées contre BeforeStep et AfterStep doivent toujours être exécutées si l'étape expire ?

Comme quelques autres ici, j'utilise setDefinitionFunctionWrapper pour réaliser les captures d'écran, ce qui fonctionne très bien, sauf que je n'ai aucun moyen de savoir quand les étapes de test expirent - le mieux que je puisse faire est de fournir un délai d'attente plus court au l'instrumentation du navigateur afin qu'il soit lancé pendant que l'étape est toujours active. J'espère travailler sur un correctif pour setDefinitionFunctionWrapper mais je voulais savoir quelle était l'intention ici aussi.

Je m'attendrais à ce que BeforeStep / AfterStep s'exécute quoi qu'il arrive, qu'une étape réussisse ou échoue (en raison d'un délai d'attente ou autre)

Juste pour ajouter un cas d'utilisation supplémentaire à cela qui ne concerne pas les captures d'écran. Je teste un système piloté par les événements et les tests provoquent la génération d'événements. Ces événements sont ensuite lus et créent des modifications dans le système.

Les étapes qui suivent valident que le système est dans l'état attendu qui nécessite que tous les événements aient été traités. J'aimerais pouvoir m'assurer que la file d'attente a été entièrement traitée et qu'il n'y a rien en attente avant de passer à l'étape suivante.

Actuellement, je suis en train d'interroger le flux d'événements dans les étapes de validation, mais ce serait bien de simplement le mettre dans un crochet. Comme c'est une exigence omniprésente que le système soit dans un état stable avant de passer à l'étape suivante.

@davidjgoss @charlierudolph S'il vous plaît, pouvez-vous m'aider avec un exemple de code de setDefinitionFunctionWrapper pour réaliser les captures d'écran BeforeStep / AfterStep ?, J'essaie avec Nightwatch JS

Salut @Rarkasali , voici un extrait d'un projet sur lequel je travaille :

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;
        }
    };
});

(Où takeScreenshot est une méthode sur votre World personnalisé qui fait la prise de capture d'écran. Je ne connais pas assez Nightwatch pour savoir à quoi cela ressemble, mais je suis sûr que vous le ferez être.)

Cela prendra donc une capture d'écran s'il y a une erreur (comme un échec d'assertion) dans la fonction step. Le fait que nous retournions le résultat d'un non-erreur est important - j'étais confus pendant un moment alors qu'une étape avec return "pending" n'était pas gérée, jusqu'à ce que je réalise que j'avalais la valeur de retour.

J'espère que cela t'aides

Salut tout le monde,
quel est l'état de ce problème? A-t-il encore besoin d'aide ?
Je suis intéressé par BeforeStep et AfterStep, car cela m'aiderait à avoir un fichier "log" avec tous les noms d'étape et des informations de journal supplémentaires. C'est un peu plus facile que la création d'un formateur personnalisé.

Cela a été ajouté en dehors de https://github.com/cucumber/cucumber-js/pull/1416

Fermeture de ce problème depuis que les crochets ont été ajoutés dans https://github.com/cucumber/cucumber-js/pull/1416

Cette page vous a été utile?
0 / 5 - 0 notes