Esto es algo que todavía hará que sus pruebas sean inestables o no deterministas, porque 10,000 milisegundos o 10 segundos pueden funcionar en un caso. Y si tarda 11 segundos, ya no va a funcionar. Y si tarda menos de 10 segundos, entonces estás esperando más de lo que deberías.
También está la razón de local versus integración continua. Cuando estás ejecutando tareas en tu computadora local, tienes diferentes poderes computacionales, recursos computacionales que en CI y esto podría causar inestabilidad también.
Estado del componente. Por ejemplo, que estás intentando interactuar con un botón que aún no está habilitado o un campo de entrada que no es visible o hay alguna animación o transición ocurriendo. Si eres usuario de Cypress, la forma de hacerlo en Cypress, por ejemplo, para un botón que no está habilitado, podrías antes de intentar interactuar con el botón, hacer algo como lo que hago aquí, donde decides obtener el botón, asegurarte de que debería estar habilitado y luego haces clic en él.
Y finalmente, otra razón para que las tareas se vuelvan no deterministas es cuando tienes dependencia entre ellas. Entonces, si por ejemplo, intentas poner un punto solo en la segunda, ya que depende de la primera para ejecutarse, fallará. Y queremos tener tareas independientes entre sí porque entonces vamos a tener resultados deterministas.
¿Y cómo puedes encontrar estas tareas no deterministas o inestables? Una forma de hacerlo es con reintentos de prueba, pero quiero decir que deberías usar reintentos de prueba como una forma de identificar las tareas no deterministas y no como una forma de enmascararlas.
Hay diferentes formas en las que puedes quemar tus tareas antes de hacerlas parte de la suite oficial de tareas. Algunas de ellas, tenía más opciones aquí, pero tuve que cortar algunas diapositivas.
Si eres usuario de Cypress, Cypress viene junto con Lodash, que es una biblioteca de utilidades que tiene muchas funciones de utilidad, y una de ellas es dot times. Entonces puedes envolver tu bloque it, que es tu caso de prueba, dentro de Cypress dot Lodash dot times, y luego, como primer argumento, pasas cuántas veces quieres que se ejecute esta prueba. Y el segundo argumento es la función de devolución de llamada. Tu suite de pruebas estará dentro de la función de devolución de llamada. Por ejemplo, si quiero estar seguro de que mi prueba es lo suficientemente estable, la ejecutaría tres veces, cinco veces, diez veces el tiempo que creas que sería suficiente para asegurarte de que es estable.
Otra forma de hacerlo, si usas Cypress también, soy embajador de Cypress, así que todos los ejemplos que tengo aquí están relacionados con Cypress. Cypress mantiene una biblioteca llamada grep, que te permite añadir etiquetas a tus pruebas como esta, donde añadí una etiqueta llamada at burn, y luego en la línea de comandos, puedes ejecutar tu prueba con cypress run dash dash env grep tags igual al nombre de tu etiqueta. Y luego puedes poner coma burn y el número de veces que quieres que se ejecute esta prueba.
Esto es algo que me encantaría ver a la gente haciendo en CI porque lo que mencioné al principio, no queremos que la prueba solo pase localmente. Queremos verlas pasar en CI también. Así que si las quemamos en CI, podemos estar seguros de que no estamos introduciendo pruebas inestables en nuestra suite.
Muy pronto Cypress lanzará, probablemente a principios del próximo año, creo, una funcionalidad llamada burn in, que quemará inteligentemente tus pruebas si nota que tu prueba es nueva o es una prueba que acaba de cambiar. Entonces, si es nueva, no tiene ningún historial. Y por eso, quieres quemarla antes de hacerla parte de tu suite de pruebas. No quieres simplemente fusionar una nueva prueba si no sabes si es determinista, porque si lo haces y te das cuenta de que es no determinista después, ya es demasiado tarde.
Nuestro equipo comenzará a investigar pruebas inestables.
Comments