Cucumber-js: Antes/después de la función ganchos y trucos

Creado en 23 ago. 2017  ·  10Comentarios  ·  Fuente: cucumber/cucumber-js

Entiendo el razonamiento detrás de no tener ganchos de función BeforeFeature/AfterFeature. Idealmente, las pruebas deben ser aisladas. Sin embargo, por motivos prácticos de rendimiento, puede ser preferible configurar cosas como accesorios de base de datos una vez por función.

La solución alternativa especificada en #614 es inadecuada porque:

  1. No llamará a After cuando las funciones consecutivas tengan la misma etiqueta.
  2. No llamará a After si la función etiquetada fue la última prueba de la compilación.

Antes de la versión 3.0.0, era posible hackear esta funcionalidad usando el contexto pasado como el primer argumento de registerHandler('BeforeFeatures').

¿Alguna idea sobre aceptar un PR para esta funcionalidad, o proporcionar un contexto similar en 3.0 para al menos hacer que el hack sea posible nuevamente?

Comentario más útil

+1 para ganchos BeforeFeature/AfterFeature
Estoy de acuerdo con la necesidad de equilibrar el rendimiento con el aislamiento de prueba. Por la forma en que está construido el marco en este momento, hay muy poco que conecte los escenarios en una sola función, excepto los pasos de fondo que se repiten. En algunos casos, es posible que no queramos que se repitan los pasos en segundo plano, sino que se repitan una vez al comienzo de la función y se eliminen solo una vez que se hayan completado todos los escenarios.

Todos 10 comentarios

No llamará a After cuando las funciones consecutivas tengan la misma etiqueta.

No entiendo. ¿Puede dar más detalles sobre esto? Puede crear un gancho After que sea específico para que la etiqueta esté presente o no. Tenga en cuenta que la sintaxis de la etiqueta ha cambiado desde que se proporcionó esa solución.

No llamará a After si la función etiquetada fue la última prueba de la compilación.

Nuevamente, no entiendo esto, por favor explique más. Debería poder usar un gancho posterior, pero pierde el contexto de si este es o no el último. Idealmente, no necesita hacer ningún desmontaje aquí.


También está tratando de hacer que los escenarios estén conectados, lo cual no se recomienda. Sugeriría uno de los siguientes:

  • desconectar los escenarios
  • ejecute cucumber-js varias veces cargando diferentes archivos de soporte y use BeforeAll / AfterAll

Para ser claros, la solución a la que me refiero es:

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

Considere algunas características:

<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

Si se ejecutan en el orden anterior, el desmontaje no ocurrirá entre la función 1 y la función 2. El desmontaje tampoco ocurrirá después de la función 4 porque no habrá otra coincidencia de prueba ~ @featurehook (es cierto que esto se puede arreglar con Después de todo).

No estoy tratando de conectar los escenarios, para mí es ser libre de decidir sobre una compensación entre aislamiento y rendimiento.

Tome el ejemplo de una prueba que configura un servidor SMTP de prueba con diferentes configuraciones:

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

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

Puede haber efectos secundarios entre escenarios al no derribarlo, pero la compensación entre pureza y rendimiento podría valer la pena en este caso.

Lo siento, pero esto no es algo que creo que debería ser compatible. Existe la posibilidad de compartir el estado en todos los escenarios y en un solo escenario que cubre la gran mayoría de los casos. Su ejemplo en el último comentario (con @featurehook) no se resuelve teniendo BeforeFeature/AfterFeature de todos modos.

+1 para ganchos BeforeFeature/AfterFeature
Estoy de acuerdo con la necesidad de equilibrar el rendimiento con el aislamiento de prueba. Por la forma en que está construido el marco en este momento, hay muy poco que conecte los escenarios en una sola función, excepto los pasos de fondo que se repiten. En algunos casos, es posible que no queramos que se repitan los pasos en segundo plano, sino que se repitan una vez al comienzo de la función y se eliminen solo una vez que se hayan completado todos los escenarios.

Dado que uso un servicio como Browserstack, que es permanentemente lento y doloroso para trabajar (al igual que otros proveedores de servidores remotos como Saucelabs), normalmente uso los controladores de eventos BeforeFeature y AfterFeature para configurar sesiones de selenio y desmontar por archivo de función.

Por lo tanto, los escenarios relacionados con esa función mencionada en mi archivo se ejecutan juntos y, para comenzar de nuevo, publique cada escenario, actualizo la pantalla del navegador y el estado de mi aplicación se actualiza para mis pruebas. Entonces, en cierto modo, están aislados y tampoco afecta el rendimiento de la prueba.

Esto debe considerarse como un caso para volver a usar los ganchos de función Antes/Después de ejecutar cucumberjs por archivo de función como se sugirió anteriormente.

Los ganchos BeforeFeature/AfterFeature son esenciales para las pruebas e2e/uat/bdd/call-it-whatever-you-wan para las que está hecho el pepino.

Los principales "competidores" de Cucumber admiten esto (por ejemplo, JBehave, RobotFramework), y sin ningún truco; es una característica propia del marco.

Este problema definitivamente bloquea el uso de Cucumber.

Hola... Estoy enfrentando un problema relacionado con esto. En mi caso, utilizo ganchos antes y después etiquetados para crear/eliminar datos que se utilizarán para probar la interfaz de usuario. En el enlace Antes, presiono un punto final de la API y creo los datos, y en el enlace Después, presiono otro punto final de la API para eliminarlo (guardo las identificaciones de los objetos devueltas en la respuesta de creación y luego construyo la carga útil de eliminación con esas identificaciones). )

El problema es que, cuando el escenario que usa esos datos (y activa los ganchos) es el último en ejecutarse, el gancho posterior nunca se activa...

¿Alguna forma de solucionar esto?

Gracias

+1 para la función Antes y Después.
Nuestro caso de uso es este: encontramos errores en ciertos navegadores que no aparecen en otros.

Queremos etiquetar una función así:

@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

Esto nos permitirá cerrar el navegador y abrir IE en un gancho BeforeFeature, y volver a abrir el navegador que estamos usando para el resto de la suite en el gancho AfterFeature. Cerrar y volver a abrir el navegador toma mucho tiempo cuando lo hace para cada escenario, lo que haría que esta característica sea excelente para usar.

Nota:
Sé que hay alternativas que involucran el objeto mundial (configurar el navegador actual allí, y solo cerrar si el navegador no es lo que necesitamos en beforeAll Hook para estos), pero parece más simple hacerlo de esta manera, y tiene que ser hecho en un gancho ya o Selenium decide que va a lanzar un silbido la mitad del tiempo.

Hay otras ocasiones en las que es posible que desee adjuntar texto a la función como una descripción adicional para ella en un enlace de antes de la función, que es otro ejemplo de dónde sería útil.

Creo que los ganchos de función antes/después también serían útiles en ciertos tipos de pruebas. Por ejemplo, Specflow, la biblioteca Cucumber para .NET, tiene estos implementados:
https://specflow.org/documentation/Hooks/

Este hilo se ha bloqueado automáticamente ya que no ha habido ninguna actividad reciente después de que se cerró. Abra un nuevo problema para los errores relacionados.

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