Cucumber-js: agregar ganchos BeforeStep / AfterStep

Creado en 4 ene. 2018  ·  33Comentarios  ·  Fuente: cucumber/cucumber-js

Útil para validaciones después de que finaliza cada paso. this debería ser la instancia mundial

Comentario más útil

Hola a todos,

¿Alguna actualización sobre los ganchos Step? ¿O alguna solución para ejecutar algún código antes y/o después de la ejecución de cada paso?

Todos 33 comentarios

@charlierudolph Me gustaría ayudar aquí, pero necesito algún consejo sobre la forma adecuada de implementarlo. Creo que hubo AfterStep de azúcar sintáctico para registerHandler que se eliminó recientemente. Miré support_code_library_builder/define_helpers.js. Pero necesito algunos consejos sobre cómo implementar estos ganchos.
Gracias
Ali
PD Gracias por revertir el formato json del resultado.

Sin embargo, una pregunta aquí es ¿cómo afecta esto al flujo de trabajo? ¿Puede esto editar el estado del resultado del paso o actúa como otro paso que puede pasar/fallar?

El caso de uso que he visto en uno de los comentarios y que también quiero usar es crear una captura de pantalla después del paso. En Cucumber Ruby he usado el AfterStep que proporciona acceso al objeto Scenario.
En mi humilde opinión, el gancho posterior al paso solo debe usarse para casos de uso en los que el usuario desea introspeccionar el resultado del paso pero no debería poder cambiar el resultado. También creo que no debería ser otro paso que pueda pasar/fallar.

@charlierudolph También estoy buscando una solución similar.
Antes de que registerHandler quedara obsoleto, usé este código para tomar una captura de pantalla después de los pasos fallidos:

```
this.registerHandler('StepResult', función (evento, devolución de llamada) {
var stepResult = event.getPayloadItem('stepResult');

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

````

Ahora no tengo solución para esto.

Hola,

He visto en la mayoría de los hilos que leí sobre el gancho BeforeStep/AfterStep que el caso de uso está tomando una pantalla de impresión. Este no es mi caso de uso y solo quiero expresar otros casos de uso para estos ganchos:

Mi proyecto ha usado este gancho AfterStep en pepino 1.x para:

  • recopilación de datos, como todos los enlaces externos:
    element.all(by.css('a')).each(function(link) { link.getAttribute('href').then(function(href) { ... }); });

Luego, todos los enlaces externos se prueban en un traje de prueba separado.

  • Comprobación de duplicados de ID de elementos (el propósito es asegurarse de que todos los ID sean únicos para cumplir con el estándar HTML y también facilita la creación de pruebas)
  • Comprobación de errores de secuencia de comandos (AfterStep establecería una variable para After hook para que realmente falle el escenario).
  • Ignorar las alertas del navegador. Algunos escenarios de prueba hacen que el navegador web abra una ventana de alerta que es posible que deseemos ignorar. Esto se aplica especialmente cuando hay elementos de formulario y de entrada, el navegador alertará ("Tiene cambios sin guardar...")

Actualmente usando Cucumber 4.0.0 y Protractor 4.0.14

Nota al margen: Nuestros casos de uso no funcionaron correctamente con this.AfterStep() en Cucumber 1.xx porque no fue diseñado para tener este tipo de código y vimos problemas con las condiciones de carrera. Por lo tanto, actualizamos a Cucumber 4.0.0 y deshabilitamos la lógica AfterStep hasta que haya soporte adecuado para ella.

Hola,

¿Alguna actualización con respecto a estos ganchos antes/después del paso?
¿Hay alguna solución para el gancho AfterStep? Me gustaría tomar una captura de pantalla si la prueba en particular hubiera fallado.

"adjuntar" no está disponible para mí porque hemos anulado el constructor mundial predeterminado https://github.com/cucumber/cucumber-js/blob/master/docs/support_files/world.md

Gracias

Hola @gajo4256 ,

Estoy usando pepino 4.0.0 y este fragmento:

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

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

Esto tomará una captura de pantalla después de cada escenario fallido. (Funciona para mí, porque con el pepino, cada vez que falla un paso, todo el escenario fallará, por lo que es casi idéntico a "después del paso fallido".

Espero eso ayude.

Hola @mracz ,

Gracias, en realidad probé esto (aunque después de cada paso sería más adecuado para mí).
Dado que he anulado el constructor mundial predeterminado, ¿cómo puedo hacer que la conexión vuelva a estar disponible para mí como en el caso normal?

Gracias

Hola @gajo4256 ,

Esto es lo que tengo en mi implementación de Custom world:

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

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

setWorldConstructor(CustomWorld);

@mracz , actualmente hago esto para cada paso:

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

Donde la función de captura de pantalla es esta:

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

Es posible que haya estado demasiado a la defensiva con respecto a las excepciones, pero hice todo lo posible para que el código adicional no interfiriera con los resultados reales de la prueba. Lo mejor que puedo hacer en este momento, un gancho AfterStep que funcione me haría agregar menos repetitivo.

Sin embargo, lo que el enlace probablemente no haría es saltar capturas de pantalla cuando hago afirmaciones que no cambian la pantalla (por lo tanto, la captura de pantalla sería inútil), por ejemplo, Then some element is not shown . Supongo que un objeto mundial extensible podría ayudar.

Aquí hay otro caso de uso para ganchos AfterStep : esperar a que los pares se sincronicen (usando relojes vectoriales o marcas de tiempo de lamport). /cc @tooky @jbpros

Hola a todos.
De hecho, estoy trabajando en este tema.

Estamos buscando una manera de tomar capturas de pantalla de todos nuestros diferentes pasos.
En este momento, estamos pensando en anular la función StepDefinitions de pepino.

No sé si es la mejor manera posible, así que por favor, ¡no dudes en dar tu opinión al respecto!

Para cualquiera que tenga problemas, aquí hay una manera de hacerlo con el contenedor de funciones de definición: https://github.com/PeerioTechnologies/peerio-icebear/blob/dev/test/e2e/code/hooks.js#L28

Nuestro principal caso de uso sería como otros aquí: capturas de pantalla, pero usándolo más como una herramienta de depuración para que podamos ver el resultado de cada paso si activamos el modo de depuración en nuestra configuración.

Otro uso: tenemos algunos modales que pueden aparecer después de cierto tiempo en nuestro sitio web. Si ejecutamos un escenario, nos gustaría tener controles para que esos modales estén en la página después de cada paso para garantizar que nuestras pruebas no sean frágiles debido a estos modales.

Otro caso de uso: si alguien quisiera crear una herramienta de informes completa con un tablero (estados de prueba actualmente en ejecución, casos de prueba que se ejecutaron anteriormente, etc.), Cucumber podría publicar en la herramienta en los ganchos de paso para obtener una actualización del progreso. Es un ejemplo inusual, lo sé, pero es algo que me interesa investigar ahora que lo he pensado.

KyleFairns, necesito AfterStep para el tablero como mencionaste

Hola,

Queremos verificar si hay algún error de javascript después de cada paso. No sólo los pasos fallidos.
(Un poco lo mismo que @markus-lundin-86)
Ahora solo podemos hacer eso después de cada escenario.
Entonces, ¿está esto en la hoja de ruta, o alguien tiene otras soluciones?

Acabo de descubrir que WebDriverIO tiene enlaces beforeStep y afterStep para pepino, lo que resuelve mi problema.

Espero que ayude...

Hola a todos,

¿Alguna actualización sobre los ganchos Step? ¿O alguna solución para ejecutar algún código antes y/o después de la ejecución de cada paso?

Hola a todos,
En la misma situación que @Prasant-Sutaria.
¿Alguna actualización sobre los ganchos escalonados o alguna solución alternativa?
Gracias por adelantado.

Sin actualizaciones. Todavía estoy esperando que alguien envíe una solicitud de extracción para esto.

¿Hay alguna hoja de ruta o algo para esto? Como este es un problema importante para tener esta característica, tal vez sería bueno una declaración oficial.

@aslakhellesoy , ¿hay una lista de verificación o algo que una solicitud de extracción debe implementar? AFAIK # 1058 y # 1121 intentan traer esta característica, o algunas formas de solucionarlo.

Hola chicos,
Acabo de crear un PR con respecto a este problema: https://github.com/cucumber/cucumber-js/pull/1198.
Avísame si lo encuentras útil.

@aslakhellesoy , he creado el PR anterior (n.º 1198) para abordar este problema/solicitud de funciones. ¿Puedes echarle un vistazo o señalarme a alguien a quien deba contactar?
cc: @charlierudolph

¿alguna actualización? Yo también estoy deseando tenerlo :)

Veo 2 relaciones públicas @leonardonelson91
Creo que no encontraron la mejor manera de implementar esta función.
https://github.com/cucumber/cucumber-js/pull/1198
https://github.com/cucumber/cucumber-js/pull/1058

@charlierudolph , ¿tiene una opinión sobre si las funciones registradas en BeforeStep y AfterStep aún deben ejecutarse si el paso se agota?

Al igual que algunos otros aquí, estoy usando setDefinitionFunctionWrapper para lograr las capturas de pantalla, lo que funciona muy bien, excepto que no tengo forma de saber cuándo se agotan los pasos de la prueba; lo mejor que puedo hacer es proporcionar un tiempo de espera más corto para el instrumentación del navegador, por lo que se lanzará mientras el paso aún está activo. Espero trabajar en una solución para setDefinitionFunctionWrapper pero también quería saber cuál era la intención aquí.

Espero que BeforeStep/AfterStep se ejecute sin importar si un paso pasa/falla (debido a un tiempo de espera o de otra manera)

Solo para agregar un caso de uso adicional a esto que no se trata de capturas de pantalla. Estoy probando un sistema controlado por eventos y las pruebas hacen que se generen eventos. Luego, esos eventos se leen y crean cambios en el sistema.

Los pasos que siguen validan que el sistema esté en el estado esperado, lo que requiere que se hayan procesado todos los eventos. Me gustaría poder asegurarme de que la cola se haya procesado por completo y que no haya nada en estado pendiente antes de pasar al siguiente paso.

Actualmente estoy haciendo un sondeo del flujo de eventos en los pasos de validación, pero sería bueno simplemente ponerlo en un gancho. Como es un requisito omnipresente que el sistema esté en estado estable antes de pasar al siguiente paso.

@davidjgoss @charlierudolph Por favor, ¿pueden ayudarme con un ejemplo de código de setDefinitionFunctionWrapper para lograr las capturas de pantalla BeforeStep/AfterStep? Estoy intentando con Nightwatch JS

Hola, @RArkasali , aquí hay un fragmento de un proyecto en el que trabajo:

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

(Donde takeScreenshot es un método en su World personalizado que hace las capturas de pantalla reales. No estoy lo suficientemente familiarizado con Nightwatch para saber cómo se ve eso, pero estoy seguro de que lo sabrá ser.)

Entonces, esto tomará una captura de pantalla si hay un error (como una falla de afirmación) desde dentro de la función de paso. El hecho de que devolvamos el resultado de uno sin error es importante: estuve confundido por un tiempo mientras no se manejaba un paso con return "pending" , hasta que me di cuenta de que me estaba tragando el valor devuelto.

Espero que esto ayude

Hola a todos,
¿Cuál es el estado de este problema? ¿Todavía necesita ayuda?
Estoy interesado en BeforeStep y AfterStep, porque me ayudaría tener un archivo de "registro" con todos los nombres de los pasos e información de registro adicional. Es un poco más fácil que la creación de un formateador personalizado.

Cerrando estos problemas ya que se agregaron los ganchos en https://github.com/cucumber/cucumber-js/pull/1416

¿Fue útil esta página
0 / 5 - 0 calificaciones