Pero eso no es todo, ¿verdad? Hemos analizado componentes pequeños. ¿Por qué no tomar una captura de todo el tablero de juego, ¿verdad? Después de todo, nuestro juego es un árbol de componentes y realmente habremos escrito pruebas para los componentes pequeños, ¿por qué no escribir una prueba para el componente de la aplicación? En una sola captura, confirmarías con todo el tablero con todos los datos y todos los componentes y todos los elementos de la interfaz de usuario se ven iguales. Pero no es tan fácil porque cada vez que haces clic en un nuevo juego, ¿verdad? En realidad, crea un nuevo juego por definición. Entonces genera un tablero diferente y no puedes comparar ambos tableros, ¿verdad? Siempre tendrán diferencias de píxeles debido a los números diferentes. ¿Entonces, cómo simulamos la generación del tablero? Bueno, tenemos que mirar nuestro código fuente. En este juego, quiero decir, este archivo game.js, podemos ver que getUniqueSudoku se importa de otro módulo. Luego se utiliza para generar una matriz inicial de números y una matriz resuelta de números. Entonces, fui a DevTools y en una iteración del juego, simplemente tomé esas variables y las guardé exactamente como archivos JSON en la carpeta de accesorios de Cypress. Luego, dentro de mi prueba, importo ese módulo como un objeto. Y luego en ese objeto, puedo usar un side stop, ya sabes, el mismo enfoque que uso para detener los controladores de clic. Y dije, en ese módulo, detén el método getUniqueSudoku y siempre úsalo en las mismas matrices. Ahora, congela el reloj, toma la captura. A partir de ahora, cada vez que ejecute el juego, generará exactamente el mismo tablero. Puedo construir sobre eso. Si tengo el mismo tablero, puedo hacer un movimiento, confirmar que se hizo y luego tomar otra captura y ahora hay una captura de un tablero con un solo movimiento. Aún mejor, Cypress tiene un depurador de viaje en el tiempo. Entonces, cuando trabajamos con pruebas de componentes, puedo pasar el mouse sobre cada comando y ver qué sucedió durante la prueba. ¿Qué hice clic? ¿Cómo ha cambiado el tablero? ¿Cómo se ve ahora? Puedo ver todo lo que está sucediendo durante mi prueba de componente React. Ahora hablé sobre pruebas de componentes, mostré cómo configurar pruebas de captura visual y hablé sobre cómo controlar tus datos para obtener las mismas imágenes píxel por píxel. Ahora hablemos de cómo funciona localmente y en CI. El primer problema, si ejecuto Cypress en modo interactivo, veo los resultados y miro la captura de pantalla que guardé, puedo ver que su resolución es realmente el doble que si ejecutara Cypress en modo headless en Mac debido a la densidad de píxeles. Entonces, el primer truco que hago cuando trabajo con capturas localmente es desactivarlas. No las tomo en modo interactivo porque su resolución será el doble que en modo headless, incluso en el mismo mapa. Entonces, en su lugar, las omito, puedo ver dónde las omito y cada vez que quiero agregar una nueva imagen de captura, simplemente ejecuto Cypress run headlessly. Si tengo una captura actualizada y realmente quiero guardar una nueva imagen, ejecuto Cypress headlessly y establezco una variable de entorno que le indica al complemento que actualice la captura y no falle en las diferencias. Bueno, esto es lo que hago localmente, ¿verdad? Pero luego subo mi código y mis imágenes de captura al servidor de integración continua. Y adivina qué, hay una diferencia píxel por píxel. Incluso el temporizador, a la izquierda puedes ver la salida de una captura de pantalla headless en Mac. A la derecha, ves la salida de una captura de pantalla headless en Linux. En el medio, hay pequeñas diferencias en la representación de fuentes, en la restauración, en el aliasing.
Comments