Despliega con rapidez y confianza utilizando pruebas de contrato y Pact

Rate this content
Bookmark

Ya casi es 2021 y todavía confiamos en entornos integrados y grandes conjuntos de pruebas de extremo a extremo para lanzar aplicaciones complejas y distribuidas llamadas "software". En esta charla, Matt desmonta los argumentos de tal tontería y muestra una alternativa mejor, más rápida y más segura.

Matt Fellows
Matt Fellows
32 min
15 Jun, 2021

Video Summary and Transcription

La charla analiza el costo y los problemas de las pruebas de integración de extremo a extremo y los beneficios de utilizar pruebas de contrato con PACT. Explora los desafíos de escalar equipos y componentes y destaca las ventajas de utilizar PACT para probar microservicios. Se demuestra el marco de trabajo PACT, mostrando su capacidad para proporcionar comentarios rápidos y confiables, pruebas independientes y contratos versionados. La charla también aborda temas como la compatibilidad de las pruebas, la eliminación segura de campos y la integración de PACT con Cypress.

Available in English

1. Introducción y Agenda

Short description:

En esta parte, Matt Fellowes se presenta como un mantenedor principal de PACT y cofundador de PACTFlow. Discute la agenda de la charla, que incluye el problema con las pruebas de integración de extremo a extremo, cómo funciona PACT y los principios de las pruebas de contrato. También menciona el costo asociado con la forma actual de probar microservicios.

Bueno, gracias a todos por venir a mi charla sobre cómo implementar con velocidad y confianza utilizando las pruebas de contrato de PACT. Mi nombre es Matt Fellowes. Soy un mantenedor principal de PACT. También soy cofundador de PACTFlow, que es una plataforma de entrega continua de microservicios. Y saben, si no estuviera trabajando en TI, probablemente estaría trabajando en deportes y fitness para alejarme de todo. Si desean contactarme después de esta charla, pueden seguirme en mis redes sociales a continuación.

Entonces, la agenda para hoy, vamos a hablar sobre cómo lanzar software, y en particular sistemas distribuidos. Comenzaremos hablando sobre el problema con las pruebas de integración de extremo a extremo. Luego hablaremos sobre cómo funciona PACT y los principios de las pruebas de contrato. Y luego terminaremos con una demostración.

La forma antigua, o la forma actual en la que muchas empresas prueban sus microservicios, es hacer lo que llamamos pruebas integradas de extremo a extremo. Y lo que eso requiere es que pongas en marcha toda tu plataforma, algo así, y uses una herramienta de prueba de API funcional, como Postman o algo similar, y envíes solicitudes para todo el sistema. Por ejemplo, lo envías a través... tal vez no a través de una interfaz de usuario con Postman, pero lo envías a través de la plataforma, y pasará por todas las capas del sistema. Entonces, Microservicio A, Microservicio B, Microservicio C, y la solicitud pasará por todos los sistemas reales, pasará por redes reales, se comunicará con bases de datos reales, enviará correos electrónicos, lo que sea que tu aplicación real vaya a hacer. Ahora esto es genial, si el sistema funciona y las pruebas pasan, te brinda cierto nivel de confianza de que tu sistema está funcionando como se espera, pero este tipo de pruebas conlleva un costo enorme.

2. Problemas con las Pruebas de Integración de Extremo a Extremo

Short description:

Las pruebas de integración de extremo a extremo tienen varios problemas. Son lentas, frágiles y costosas de mantener. Identificar y resolver problemas puede llevar mucho tiempo y ser desafiante. Lograr una cobertura completa es difícil y las pruebas no escalan bien. Requieren implementar todo junto, lo que genera dependencias y retrasos entre los equipos.

El primer problema es que son lentas, testing para pasar con capas reales y necesitan hacer cosas reales, lo que puede ser lento, por supuesto. Pero también muchas veces no se pueden ejecutar en paralelo, y la razón de eso es la naturaleza estatal de este tipo de interacciones.

El segundo problema con este tipo de testing es que son frágiles y pueden ser no deterministas. Por lo tanto, esta propiedad de inestabilidad está muy presente en este tipo de testing. Incluso si pasan, pueden requerir varias ejecuciones para llegar a ese punto.

Por ejemplo, necesitas que todas las versiones de cada servicio en el sistema estén alineadas. Si alguna de ellas cambia, la prueba podría fallar. Si tienes la versión incorrecta de data, la versión incorrecta de las pruebas o la configuración incorrecta para tu entorno o simplemente alguien ha manipulado el entorno de antemano, es posible que tu prueba falle. Son muy costosas de mantener.

Y cuando encuentras problemas, o cuando tienes un problema, encontrar el problema real y la fuente del problema puede ser realmente costoso de hacer. Por ejemplo, si tienes una falla que está causando el problema en el Microservicio B, bueno, puede que no sea visible desde el exterior por qué esa prueba realmente falló. Es posible que necesites buscar en tus plataformas de registro como Splunk o Simulogic, debas rastrear algunos ID de correlación a través del sistema para descubrir cuál es el problema es. Y luego necesitas encontrar la versión del código para ese servicio en particular, ir al repositorio, y buscar.

Es básicamente como encontrar un problema en producción. Por lo que puede ser bastante costoso encontrar el error en sí mismo. Muchas veces falla solo por esas razones inestables que mencioné anteriormente. Del mismo modo, es difícil lograr una cobertura completa de esta manera. Lo que quiero decir con eso es que tienes múltiples sistemas aquí y tienes muchos escenarios potenciales diferentes que pueden ocurrir. Y al ejecutar tus pruebas de esta manera, es muy posible que no obtengas todas las pruebas que deseas. Porque a, tardan mucho tiempo en ejecutarse. B, son costosas de mantener. Y también simplemente no puedes ejecutar tantas pruebas en el tiempo disponible, porque las combinaciones se vuelven incontrolables.

Debido a que pruebas todo junto de esta manera, bueno, entonces realmente tienes que lanzar todo junto de esta manera. Porque no tienes confianza en que si implemento solo un componente, las cosas seguirán funcionando al final. Así que ahora necesitas implementar las cosas juntas. Y hacer eso significa que los equipos están acoplados entre sí en el momento de la implementación. Y eso significa que los equipos están esperando a que otros equipos terminen sus tareas. Y sabemos por la teoría ágil que eso no es muy bueno. Y este tipo de pruebas no escalan bien. Tienden a empeorar con el tiempo.

3. Desafíos de Escalar Equipos y Componentes

Short description:

Aumentar el número de equipos y componentes conduce a una relación no lineal con el número de entornos o su complejidad. El tiempo de construcción, la complejidad de la construcción, la tasa de fallas y el riesgo asociado con el cambio aumentan. Esto resulta en que los desarrolladores estén inactivos, se formen colas y se produzcan retrasos en la finalización del trabajo. Estos problemas conllevan un costo significativo.

Entonces, digamos que aumentas el número de equipos y componentes con el tiempo de esta manera lineal. Lo que ves es esta relación no lineal con el número de entornos o la complejidad de los entornos que necesitas gestionar. Ves que el tiempo de construcción aumenta, o la complejidad de esas construcciones, y el fallo de esas construcciones comienza a aumentar. También ves que el riesgo asociado con el cambio se incrementa exponencialmente. Y, por supuesto, ahora tenemos desarrolladores inactivos, tenemos muchas colas, tenemos, ya sabes, tarjetas en la pared que hacen referencia a otros equipos esperando a que se complete su trabajo antes de que podamos completar el nuestro. Y todo esto tiene un costo enorme asociado.

4. Beneficios de Pact para Pruebas de Microservicios

Short description:

Las buenas pruebas son rápidas, aisladas, fáciles de entender y fáciles de mantener. Escribir pruebas unitarias separadas para el consumidor y el proveedor puede ser efectivo, pero puede que no reflejen la realidad. Los contratos proporcionan una solución al permitir que los consumidores especifiquen sus necesidades y que los proveedores las implementen. Este enfoque garantiza que los cambios no rompan a los consumidores y proporciona documentación. Pact es una herramienta de código abierto que combina mocks, pruebas unitarias y contratos para prevenir desviaciones. Está diseñado para probar microservicios y sistemas distribuidos y tiene como objetivo eliminar la necesidad de pruebas de extremo a extremo y entornos de prueba complejos.

Por supuesto, las buenas pruebas tienen propiedades completamente opuestas a las que acabamos de mencionar. Son rápidas, están aisladas, son fáciles de entender y fáciles de mantener. ¿Podrían los mocks venir al rescate aquí? Bueno, como probablemente todos hayan escrito, es muy simple escribir dos pruebas unitarias separadas a cada lado del límite del servicio. Podemos escribir una prueba unitaria para el consumidor, simulando al proveedor, y podemos escribir una prueba unitaria para el proveedor, simulando al consumidor. Y estas son geniales. Pueden ejecutarse muy rápido, son fáciles de corregir, fáciles de encontrar errores. Por supuesto, es posible que no representen lo que realmente sucede en producción, por lo que es bastante posible que pongas una suposición que no es válida, y como es una prueba unitaria, no estamos verificando esa suposición más adelante. Y así, tenemos esta buena propiedad, ya sabes, todas estas grandes propiedades, pero el nuevo problema es que en realidad no están representando la realidad. Es difícil mantener ambos lados sincronizados.

Y aquí es donde podemos hablar de los contratos. Probablemente estés familiarizado con el diseño basado en especificaciones, donde un productor de API especifica o crea un contrato utilizando Swagger u otra herramienta, y publica ese documento a todos sus consumidores. Esto tiene muchas propiedades excelentes. Pero uno de los inconvenientes es que cuando mueves, cambias o modificas esa versión del contrato o la especificación, es fácil romper accidentalmente a un consumidor porque no sabes qué partes de la API están utilizando. Requiere mucha diligencia asegurarse de no implementar cambios incompatibles hacia atrás. Aquí es donde podemos hablar de los contratos impulsados por el consumidor, que invierten esa relación. Los consumidores pueden especificar lo que necesitan del proveedor y escribirlo en su propio formato de contrato y dárselo al proveedor, cada consumidor teniendo su propio subconjunto potencial de la API. Luego, la API solo necesita implementar el superconjunto de todos esos contratos, y luego puede hacer su trabajo. Esto tiene algunos efectos secundarios o consecuencias realmente interesantes. El primero es que sabrás cuándo rompes a un consumidor, porque los consumidores te están diciendo qué están usando. Obtiene una forma de documentación, porque los consumidores te están dando exactamente lo que están usando cada vez que envían una compilación, y puedes probar las cosas de forma independiente.

Entonces, aquí es donde entra en juego la herramienta Pact. Combina la idea de mocks aislados y pruebas unitarias rápidas con contratos para garantizar que no haya desviaciones. Es una herramienta de pruebas de contrato impulsada por el consumidor de código abierto y está diseñada para ayudarte a probar tus microservicios y sistemas distribuidos de forma independiente. Sus casos de uso principales son en aplicaciones web JavaScript, aplicaciones móviles nativas que se comunican con servicios RESTful, JSON o XML, o que se comunican a través de colas de mensajes como Kafka o SNS. Sus objetivos son reducir o eliminar por completo la necesidad de pruebas integradas de extremo a extremo y reducir la dependencia de entornos de prueba complicados. Los beneficios de Pact son básicamente que, al tener un enfoque en un solo punto de integración, solo estás observando una cosa a la vez. No necesitas implementar, por lo que no necesitas un entorno de prueba para realizar esta forma de pruebas.

5. Framework Pact y Demo

Short description:

Retroalimentación rápida y confiable. Las pruebas se ejecutan rápidamente y escalan linealmente. Las pruebas independientes permiten lanzamientos independientes. Framework Pact: el consumidor escribe una prueba para definir las expectativas del proveedor. Pact simula al proveedor y simula su API. Las interacciones se registran como un contrato. Los contratos se comparten y versionan. Los contratos se reproducen en el proveedor para garantizar la simetría. Demostración utilizando un sitio web de catálogo de productos React y un backend ExpressJS. Prueba del endpoint de ID de producto. Los consumidores impulsan el diseño de la API. Flujo de trabajo del proveedor y control de lanzamiento con Can I Deploy?

Obtienes una retroalimentación rápida y confiable debido a esto. El error siempre se encontrará en tu máquina. No necesitas buscar en los registros. Esto significa que esas pruebas se ejecutan muy rápido y escalan linealmente. Y por último, debido a que estás probando cosas de forma independiente, ahora puedes lanzarlas de forma independiente.

Ok, hablemos rápidamente de cómo funciona Pact y luego mostraremos cómo funciona en acción. Tenemos un sitio web consumidor... Perdón, tenemos un sitio web que se comunica con una API de productos. Llamamos al sitio web consumidor y a la API proveedor. Y los mensajes que se pasan entre ellos, la suma de esos mensajes, lo llamamos contrato. Es un framework de pruebas de contrato impulsado por el consumidor, por lo que lo primero que haremos es escribir una prueba desde el lado del consumidor para definir las expectativas del proveedor. Lo que hará Pact es simular al proveedor. Nunca los hacemos hablar entre sí. Pero Pact simulará la API del proveedor. Y el consumidor puede decir, dado que hago una solicitud para obtener 1, 2, 3, 4 para el endpoint de producto, espero recibir alguna respuesta. Y hacemos esto para todas las cosas que el consumidor necesita del proveedor. Al final de esa sesión, vamos a registrar esas interacciones en lo que llamamos un archivo Pact o un contrato. Vamos a compartir eso con una herramienta como el Pact broker o Pact flow, que nos ayudará a intercambiar el contrato y versionarlo en todo nuestro ecosistema. Y finalmente, en el lado del proveedor, lo que vamos a hacer es descargar los contratos de Pact flow, los vamos a reproducir en el proveedor. Y ahora Pact va a simular al consumidor. Va a reproducir esta solicitud, verificar las respuestas y si coinciden con lo que el consumidor hace, ahora tenemos simetría en ambos lados de esta interacción. Tenemos dos mocks rápidos y ahora tenemos un contrato que asegura que esos dos mocks son válidos.

Ok. Así que vamos a entrar en nuestra demostración. Vamos a utilizar un sitio web de catálogo de productos React que se comunica con un backend ExpressJS como ejemplo, vamos a probar el endpoint de producto con barra diagonal ID y mostrar cómo los consumidores pueden ayudar a impulsar el diseño de la API. Vamos a ver el flujo de trabajo del proveedor y también cómo podemos controlar los lanzamientos con una herramienta llamada Can I Deploy? Así que veamos la aplicación. Aquí está, es un sitio web muy poco interesante, lo siento, no es el mejor sitio web de React de todos los tiempos. Pero aquí puedes ver, la página de inicio simplemente lista los productos y podemos ver los detalles de un producto individual. Y vamos a acceder a dos endpoints diferentes. Vamos a probar el endpoint de esta página.

6. Prueba del Método Obtener Producto

Short description:

Nos centraremos en probar el método obtener producto de la clase API. El lado del proveedor también tiene una configuración similar con rutas y una prueba de Pact. Para ejecutar la prueba de Pact, levantamos el proveedor, especificamos los archivos de Pact y los reproducimos. El contrato se comparte con un broker de Pact, mostrando el estado actual de la interacción. Podemos realizar cambios y promoverlos a través de los entornos.

De acuerdo. Al observar nuestro código para esto. Vamos a pasar a la prueba del consumidor. Entonces, si miramos aquí en nuestra página de producto, este es nuestro componente React. Puedes ver aquí, para llenar esta página, necesitamos obtener algunos datos de un punto final. Ahora, en lugar de cargar esto de otra manera, vamos a comunicarnos con un punto final de la API y vamos a usar una clase para hacerlo. Entonces, esta clase de API tiene un método llamado obtener producto, y eso es lo que va a obtener los datos del producto para nosotros.

Desde el punto de vista de Pact, podemos probar este método, esto es lo que nos importa, esto es el objetivo de nuestra prueba de Pact, no necesitamos probar nada con React para hacer esta forma de prueba. Y puedes ver aquí, simplemente va a acceder al punto final producto barra diagonal id, va a enviar algunos encabezados y luego va a convertir los datos que regresan en una clase de producto, y la clase de producto se ve así.

En el lado del proveedor, tenemos algo similar, tenemos una definición de producto aquí, tenemos nuestras rutas que manejan los diferentes puntos finales, y también tenemos una prueba de Pact aquí. No vamos a entrar demasiado en la prueba de pacto aquí, porque es mucha configuración, pero básicamente para ejecutar la prueba de Pact en este lado, simplemente vamos a levantar el proveedor, decirle a Pact cómo encontrar los archivos de Pact y los reproduciremos contra el proveedor. Por último, vamos a compartir el contrato con un broker de Pact, en este caso, es un Pact flow publicado. Y nos mostrará el estado actual de la interacción a lo largo del tiempo. Entonces puedes ver aquí que la versión actual del consumidor está en el master, y ha sido implementada en producción y el proveedor también ha sido implementado en producción. Podemos profundizar en el Pacto y ver las diversas interacciones que son compatibles con este contrato. En este caso, al obtener un producto con ID 10, obtenemos el ID, el tipo y el nombre en el cuerpo. Pero lo más importante, lo usaremos para mostrar cómo podemos realizar cambios en el sistema y luego promoverlos a través de los entornos.

7. Prueba del Pacto del Consumidor

Short description:

Vamos a examinar la prueba del pacto del consumidor, donde seguimos el modelo de organizar, actuar y afirmar. Especificamos el producto esperado con ID 10, tipo tarjeta de crédito y nombre 28 grados. El comparador like asegura que las claves existan y sean del mismo tipo, permitiendo flexibilidad en los valores. Tenemos una biblioteca que simplifica los comparadores para uso futuro.

De acuerdo, vamos a ver primero la prueba del pacto del consumidor, porque aquí es donde empezamos. Esta es nuestra prueba de pacto aquí. Vamos a seguir el modelo estándar de organizar, actuar y afirmar solo para ver cómo funciona todo esto en conjunto. Así que primero, necesitamos decirle a Pact, necesitamos decirle a nuestra prueba unitaria qué es lo que nuestro código debe hacer. Como dije, Pact es una herramienta de marcado. Va a validar lo que realmente hacemos. Dado que existe un producto con ID 10, al hacer una llamada para obtener ese producto, utilizando el verbo GET en esta ruta. Esperamos recibir un HTTP 200 con algunos encabezados y un cuerpo que se ve como la línea 19. Puedes ver que el producto esperado es ID 10, tipo tarjeta de crédito, nombre 28 grados. El comparador like básicamente dice que no nos importan los valores aquí, solo nos importa que las claves existan y sean del mismo tipo. Así que más adelante, cuando el proveedor verifique esto, no vamos a fallar si se devuelven IDs diferentes o incluso productos diferentes. Tampoco vamos a entrar en los comparadores hoy, pero tenemos una biblioteca flexible que podemos usar para hacer esto mucho más simple.

8. Llamando a la API y Agregando el Campo de Precio

Short description:

Configuramos nuestro cliente de API para comunicarse con el servicio simulado de PACKT. Llamamos al método, que se comunica con PACKT en lugar de la API real. Escribimos las afirmaciones de prueba unitaria para esta llamada. Agregamos un nuevo campo, precio, para mostrar en el componente React. Simulamos un proceso de CI, pero el proveedor aún no ha implementado el nuevo campo, por lo que no es seguro lanzarlo. La prueba pasa y el contrato se publica en PACKFLOW. Se crea un nuevo contrato llamado FeetAddPrice, pero aún no se ha verificado. La versión del Consumidor no se puede implementar hasta que el proveedor implemente las nuevas características.

Lo segundo es llamar realmente a la API. Configuramos nuestro cliente de API y en lugar de comunicarnos con el cliente de producción, vamos a comunicarnos con el servicio simulado de PACKT. Luego, en la línea 42, llamamos al método. Ese método va a llamar a un punto final HTTP real, pero en este caso, va a comunicarse con PACKT en lugar de la cosa real. Y luego, en la línea 45, todo lo que tenemos que hacer es escribir nuestras afirmaciones de prueba unitaria para esta llamada.

Entonces, vamos a fingir que PACKT no existe. Bueno, ¿qué deberíamos probar en esta prueba unitaria para asegurarnos de que nuestro código hizo lo que pensamos que hizo? Esta prueba ya está pasando, como viste antes. Ya se ha publicado en PACKT flow. Lo que queremos hacer es agregar un nuevo campo. ¿Qué sucede cuando evolucionamos esta API? Entonces, este es un sitio web de productos. Sería bueno mostrar un precio para el producto, ¿verdad? Así que agreguemos el precio a la mezcla. Agregaremos esta nueva expectativa en el producto aquí, la agregaremos a nuestra clase de producto también, y luego tendremos el precio disponible para poder mostrarlo en el componente React. Y lo que voy a hacer es crear una nueva rama, mi código, y voy a cerrar esos procesos.

Creemos un nuevo campo, feet, add price. Lo que voy a hacer aquí es simular un proceso de CI como si estuviéramos haciendo una implementación continua. Estamos en una rama, por lo que este será un flujo de solicitud de extracción, y lo que puedo hacer es ejecutar un CI falso. Y lo que esto va a hacer, es ejecutar la prueba, va a publicar el contrato en PACKFLOW. Luego vamos a ejecutar una herramienta llamada ¿Puedo implementar y decir, ¿es seguro lanzar este cambio? Y la respuesta será no, porque este es un nuevo campo, el proveedor nunca ha verificado el contrato, de hecho, el proveedor aún no lo ha implementado. Entonces se nos dirá que aún no es seguro lanzar esto. Así que volviendo a mi terminal, puedes ver que la prueba pasó allí arriba. Hemos publicado los paquetes, y hemos dicho, ¿podemos implementar, y no podemos implementar. Entonces la compilación ha fallado con un código de salida distinto de cero. Puedes ver, sin embargo, en nuestra base de código hay un PACKFLOW que se está creando, y puedes ver que ahora tiene la propiedad de precio capturada en ese archivo de contrato. No vamos a hablar demasiado sobre el archivo de contrato por ahora. Solo sepa que existe, y eso es lo que usamos para mediar todo este proceso. Ahora que hemos agregado la propiedad de precio, echemos un vistazo a PACKFLOW y veamos lo que ve. Genial. Podemos ver que se ha creado un nuevo contrato aquí arriba llamado FeetAddPrice. Aún no se ha verificado. Entonces esta versión del Consumidor no se puede implementar en ningún lugar todavía porque ningún proveedor ha implementado sus características.

9. Desplegando el Proveedor y Pasando a Producción

Short description:

Agreguemos el precio a la clase y al repositorio de Producto. Haremos push de los cambios al proveedor y ejecutaremos las pruebas. Desplegaremos el proveedor en producción. Verificaremos la nueva rama de características y la fusionaremos con la línea principal. Ejecutaremos el proceso de CI y desplegaremos en producción. Ahora estamos en producción.

Entonces, sigamos adelante y hagamos eso en el proveedor ahora. Ahora tengo algunos cambios en el stash para evitar problemas. Pero lo que vamos a hacer es agregar el precio a la propiedad, la clase Producto y agregarlo también al repositorio, así que hay data.

Entonces, ahí vamos. Podemos ver que se ha agregado el precio. Ahora, en teoría, podemos hacer push a esto en la rama principal. Veamos cómo se ve cuando hacemos commit y push a este cambio. El proveedor debería ejecutar las pruebas descargando los contratos de PacFlow. Compartirá los resultados de esa verificación de vuelta a PacFlow para decir si pasó o tuvo éxito. Luego ejecutará la verificación para determinar si puedo desplegar esta versión del proveedor en producción. La respuesta debería ser sí, porque ya es compatible con la versión actual del consumidor. Y también tiene la nueva funcionalidad para esta nueva rama. Así que lo desplegamos en producción.

De acuerdo, puedes ver que el proveedor se ha ejecutado. Un montón de afirmaciones han ocurrido gracias al framework PAC. Ha publicado los resultados en el broker y ha ejecutado la verificación de si puedo desplegar. La verificación dice que sí. Esta versión del proveedor satisface la versión de producción actual del consumidor al que se desplegará, por lo que se despliega en producción. Si vuelvo a PacFlow y actualizo esta página, verás que esta nueva rama de características ha sido verificada por el proveedor. Y la versión del proveedor que satisface este contrato es la misma que satisface el contrato de producción del consumidor. Por lo tanto, básicamente ahora es seguro fusionar este cambio en la línea principal y hacer push a producción. Así que voy a fingir que he fusionado esto. Vuelvo a la rama principal. Y ejecuto el proceso de CI como si acabara de fusionar esto en la rama principal ahora. Y lo que debería suceder es que ahora el consumidor ejecutará sus pruebas, publicará el contrato. El contrato no ha cambiado. Por lo tanto, cualquier verificación que se haya realizado anteriormente sigue siendo válida. Ejecutará una verificación de si puedo desplegar. Dice, ¿puedo mover este cambio a producción? Y debido a que hay una versión del proveedor que satisface estas necesidades, es seguro hacer eso. Y luego lo desplegamos. Y listo, ahora estamos en producción.

10. Testing Compatibility and Safe Removal of Fields

Short description:

La versión de producción del contrato ahora incluye la propiedad de precio. La eliminación de un campo del proveedor se puede probar localmente sin realizar ningún cambio. PACT puede detectar si un consumidor está utilizando una propiedad y si su eliminación causaría un fallo. PACT también puede identificar las propiedades que se pueden eliminar de forma segura si ningún consumidor las está utilizando.

Así que actualicemos esto, la versión de producción del contrato ahora tiene la propiedad de precio, como puedes ver aquí. ¿Qué sucede si eliminamos un campo del proveedor? ¿Qué pasa entonces? ¿Encontraremos un error? Bueno, por ejemplo, si elimino el campo ID, lo siento, voy al proveedor y lo comento, ahora puedo ejecutar NPMT localmente sin realizar ningún cambio y descubrir si voy a romper a alguno de mis consumidores. Ahí lo tienes. Encontró correctamente que un consumidor está utilizando esta propiedad y si la eliminamos, fallaría. Pero si elimino la propiedad de versión, ¿qué va a suceder aquí? Bueno, como sabemos, actualmente no hay consumidores que estén utilizando esta propiedad, por lo que es seguro eliminarla. Ahí vamos. Esa es una propiedad interesante de PACT. PACT es capaz de detectar cambios de esta manera a nivel de atributo para determinar la compatibilidad.

11. Cost of End-to-End Tests

Short description:

Hoy hablamos sobre el costo de las pruebas integradas de extremo a extremo, los beneficios de las pruebas de contrato y cómo funciona PACT. También abordamos los desafíos de las pruebas de integración y los puntos problemáticos comunes asociados con ellas. Además, respondimos una pregunta sobre el uso de PACT con diferentes tecnologías de consumidores y proveedores, destacando su capacidad para admitir entornos políglotas.

De acuerdo. Hoy hablamos sobre el costo de las pruebas integradas de extremo a extremo. Vimos que tienen un alto costo de mantenimiento y que no escalan bien. Vimos cómo las pruebas de contrato pueden ayudar con las pruebas de integración al combinar los enfoques de pruebas unitarias rápidas y aisladas con contratos para evitar la desviación. Vimos cómo funciona PACT y cómo podemos controlar las versiones usando ¿Puedo implementar?

Espero que esta charla haya sido útil. Agradezco mucho su participación. Si desean hablar más, no duden en ponerse en contacto conmigo en los datos que aparecen allí. Muchas gracias.

Hola Matt. Hola a todos. Gracias por tenerme aquí. ¿Los resultados de la encuesta te sorprenden o lo esperabas? No, eso suena normal. Mira, no todos están sufriendo tanto como para tener que comprar café a granel y comprarse una máquina de café como yo en casa. Pero, ya sabes, la mayoría de las personas encuentran las pruebas de integración, o al menos las pruebas de integración de extremo a extremo testing, lo suficientemente desafiantes como para tener que dedicarles algo de tiempo y generalmente necesitan algo para superar ese dolor, debido a las pruebas inestables, porque lleva tiempo gestionarlas, porque hay que resolver los problemas. Siempre hay una excusa para no querer investigar esas pruebas y escribir esas pruebas y mantener esas pruebas, así que no es del todo sorprendente, pero también es bueno escuchar que no todos están sufriendo tanto como para necesitar, ya sabes, tener cafeína inyectada en sus venas solo para pasar el día.

Sí, pero las pruebas inestables siempre son una buena excusa para tomar otra taza de café.

Hay algunas preguntas. Manuel Zambrano preguntó, ¿podemos usar PacFlow con diferentes tecnologías de consumidores y proveedores? Quiero decir, por ejemplo, un frontend de React y un backend de Python que sirve la API? Esa es una buena pregunta. Probablemente sea la razón principal por la que las personas eligen Pact en lugar de otros marcos alternativos de testing de contratos, por lo que vale la pena mencionar rápidamente Spring Cloud Contract. Entonces, si estás usando Java aquí, porque esta es una conferencia de testing para JavaScript, pero si usas Java, Spring Cloud Contract es una opción decente, está hecho por los chicos de Spring. Tienen soporte para otros lenguajes, pero la forma en que funciona es que aún tienes que escribir scripts groovy, así que técnicamente probablemente sigas escribiendo cosas de JVM. Pero una de las ventajas de Pact es que utiliza una especificación que te permite trabajar en diferentes lenguajes. Desde el principio, los primeros mantenedores reconocieron que esto sería un desafío, que las arquitecturas políglotas eran una realidad y que las pruebas de contrato necesitaban admitir entornos políglotas desde el principio. De hecho, hay una especificación que rige la forma en que se produce la coincidencia de manera independiente del lenguaje. Eso significa que se pueden escribir consumidores diferentes para proveedores diferentes y, de alguna manera, en este entorno, pero la forma en que se produce la coincidencia y la verificación, trasciende los lenguajes. Así que sí, es completamente posible tener un frontend de JavaScript, un frontend de iOS, un frontend de Swift, que se comunica con un backend de Java o un backend de Ruby o un backend de .NET. Puedes combinar y mezclar lenguajes como desees.

Increíble. Steve, probablemente esté pronunciando mal eso. Lo siento.

12. Contract Testing vs. Applying JSON Schema

Short description:

Las pruebas de contrato y la aplicación de un esquema JSON a cada solicitud tienen algunas diferencias. Las pruebas de esquema se centran en los cuerpos de las solicitudes y a menudo no cubren otros elementos HTTP como el verbo, la ruta, la cadena de consulta y las cabeceras. Asegurar la compatibilidad entre los esquemas del consumidor y del proveedor puede ser un desafío. Las pruebas de contrato con herramientas como PACT permiten la versión y etiquetado de contratos, asegurando transiciones suaves entre versiones. Si bien puedes construir tu propia herramienta de pruebas de esquema, los marcos de pruebas de contrato ya proporcionan muchas características necesarias. Esta estrategia puede ser efectiva para la mayoría de los casos de uso.

Me preguntaron qué tan diferentes, slash, relacionadas son las pruebas de contrato en comparación con la aplicación de un esquema JSON a cada solicitud que realizas, por ejemplo, usando Postman? Sí, esa es una excelente pregunta. De hecho, recibimos esa pregunta con frecuencia. Tengo algunos artículos a los que puedo dirigir a las personas después, que hablan sobre la diferencia entre las pruebas de esquema y las pruebas de contrato. Se profundiza un poco más. Una de las primeras cosas con las pruebas de esquema, en primer lugar, es que normalmente solo te enfocas en los cuerpos de las solicitudes. No estás viendo las otras cosas de HTTP, como el verbo, la ruta, la cadena de consulta, las cabeceras, por ejemplo, generalmente no se incluyen en tus pruebas de contrato. También son obviamente una parte muy importante de ese contrato. Pero obviamente, puedes hacerlo. Lo segundo es que incluso si estás usando un esquema JSON en un lado del contrato, ¿qué te garantiza que eso es exactamente lo que el proveedor necesita en el otro lado? Entonces, debes asegurarte de tener una forma de fijar el esquema que utilizas en ambos lados del contrato y garantizar que esos esquemas sean compatibles. Por ejemplo, supongamos que tienes la versión uno del esquema en el lado del consumidor, luego el proveedor actualiza su esquema, debes asegurarte de que esos esquemas estén ahora sincronizados. Entonces, básicamente, puedes hacer eso, pero debes asegurarte de que los esquemas siempre sean los mismos. Y luego, el segundo desafío con eso es si piensas en algo como las pruebas de contrato con PACT, la forma en que quiere funcionar es utilizando tus intermediarios a través de algo como el PACT broker o PACT flow. Y lo que eso hace es permitirte versionar y etiquetar tus contratos, al igual que lo harías con el código Git. Entonces, supongamos que tienes código, ¿verdad? Estás a punto de implementar esto en producción, la versión dos de tu código está en Git, al igual que la versión uno, y necesitas migrar la producción de la versión uno a la versión dos. Entonces, necesitas un proceso para asegurarte de que puedas hacer una transición suave de uno a dos. Y, nuevamente, si vas a usar tu propia herramienta de pruebas de esquema, deberás crear tu propio proceso para evolucionar ese esquema de la versión uno a la versión dos. Cuando tienes múltiples componentes en el sistema. Nuevamente, no es que no puedas hacer eso. Pero deberás construir muchas cosas que los marcos de pruebas de contrato ya tienen incorporadas. Lo que diré, sin embargo, es que es una estrategia que parece estar empleando y, ya sabes, probablemente puedas llegar al 70% del camino y eso podría ser suficiente para la mayoría de los casos de uso de las personas.

QnA

Contract Testing en la Pirámide de Pruebas

Short description:

Las pruebas de contrato se ajustan a dos lugares en la pirámide de pruebas. En el lado del consumidor, se asemeja a una prueba unitaria, centrándose en una sola función. En el lado del proveedor, generalmente se encuentra en el centro de la pirámide, superponiendo la prueba de contrato en la capa de servicio o prueba de integración. Las pruebas de contrato eliminan la colaboración y las pruebas de comunicación de las pruebas de extremo a extremo, reduciéndolas. La confianza del consumidor en el proveedor se aborda trasladando las pruebas relevantes a la base de código del proveedor. Las pruebas restantes se pueden colocar en pruebas sintéticas de producción u otro lugar.

Muchas gracias por esta respuesta detallada. Richard Fordshow pregunta: ¿Las pruebas de contrato son principalmente para pruebas unitarias o para pruebas de extremo a extremo, como con Cypress? Supongo que la pregunta se refiere a dónde se ubicarían las pruebas de contrato en la pirámide de pruebas. Sí, es una buena pregunta. Probablemente haya dos preguntas. Una es dónde encaja en la pirámide. ¿Puedes usar herramientas como herramientas de pruebas de extremo a extremo, que creo que es, creo que como comunidad, necesitamos solucionar eso, las pruebas de extremo a extremo significan demasiadas cosas? Tenemos que solucionar eso. No podemos tener una situación en la que Cypress signifique prueba de extremo a extremo y realmente solo esté probando la capa de interfaz de usuario. Y también podemos referirnos a las pruebas de extremo a extremo que pasan por toda la plataforma. Así que lanzo ese desafío para que alguien intente solucionarlo. Pero hablemos de la primera pregunta. En cuanto a dónde encajan las pruebas de contrato en la pirámide, encajan en dos lugares en el lado del consumidor. Perdón, es mucho más parecido a una prueba unitaria. Básicamente, debes elegir una sola función como viste en la charla y ejecutar una prueba unitaria para esa función. Por lo general, eso es bastante sencillo. En el lado del proveedor, tienes algunas opciones más sobre qué tan arriba y abajo de la pirámide puedes ir. Por lo general, se encuentra en el medio. Normalmente superponemos la prueba de contrato en el medio de esa pirámide, la prueba de servicio o la capa de prueba de integración, donde básicamente ejecutarías tu proveedor como una caja negra, iniciarías cualquier dependencia de terceros y comenzarías el servicio y luego PACT hablaría con ese servicio, a través de mecanismos HTTP, pasando probablemente por múltiples capas de tu aplicación, pero por lo general aún se ejecutan muy rápidamente. Son más parecidos a una prueba unitaria, pero no son realmente una prueba unitaria, porque tienen que pasar por algunas capas. Eso es generalmente donde encajan en la pirámide. Además de eso, lo que normalmente hacemos es complementar, para eliminar las pruebas de extremo a extremo, complementamos esas pruebas de contrato. O si lo piensas, tenemos que deshacernos de las pruebas de integración de extremo a extremo. Las pruebas de contrato eliminan las pruebas de las pruebas de extremo a extremo que tienen las pruebas para la colaboración y la comunicación. ¿Pueden comunicarse entre sí? Todos los aspectos del contrato desaparecen. Por lo tanto, reducimos un poco las pruebas de extremo a extremo. Luego, miramos allí y decimos, bueno, en realidad, generalmente lo que encuentras es que en las pruebas de extremo a extremo, muchas de ellas son en realidad el consumidor que no confía en el proveedor. Entonces, lo que haces es sacar esas pruebas y decir, no, no deberían estar ahí. Deben estar en la base de código del proveedor. Su trabajo es asegurarse de que su código funcione, no es trabajo del consumidor. Luego, lo reducimos a solo unas pocas pruebas y es entonces cuando podemos preguntarnos, ¿cuál es el valor de tener estas pocas pruebas restantes? Tal vez podamos ponerlas en pruebas sintéticas de producción o en otro lugar.

Integración de PACT con Cypress

Short description:

Sí, puedes integrar PACT con Cypress, pero hay desafíos debido a la posible superposición de escenarios. El equipo de PACT está trabajando para optimizar este proceso y planea lanzar un complemento de Cypress en el futuro.

O podemos eliminarlos por completo porque no están agregando valor y podemos avanzar más rápido. Ahora, la segunda parte de esa pregunta creo que se refiere a si se puede integrar con algo como Cypress. La respuesta corta es sí, se puede integrar con Cypress. Hay algunos desafíos al hacer esto y actualmente estamos trabajando para que sea menos problemático hacerlo para las pruebas con Cypress. Pero en resumen, porque típicamente con las pruebas de Cypress, vas a tener mucha superposición. Realmente no quieres capturar demasiados escenarios superpuestos en tus pruebas de contrato porque deben reproducirse contra el proveedor. Y eso puede convertirse en una carga para el proveedor si agregas demasiados. Pero nuevamente, estamos trabajando para optimizar ese proceso y hacer que sea más fácil usar Cypress para escribir pruebas y verificar el lado del proveedor. Y debo mencionar que, literalmente, en PackFlow, ahora estamos escribiendo pruebas usando Cypress para algunas de nuestras interfaces de usuario y también estamos experimentando con generar contratos a través de eso. Y sospecho que en los próximos meses probablemente lanzaremos un complemento para Cypress como ejemplo que se podría replicar para otros. De acuerdo, genial. Así que creo que tenemos tiempo para una pregunta más y Auto Gibbon pregunta, ¿cómo puedo, cómo se puede integrar el flujo de trabajo de implementación en suites de entrega continua? ¿Hay una respuesta corta para esta pregunta? Si la respuesta es más larga, tal vez podamos llevarla a la sala de oradores. Lamento interrumpirte. La respuesta corta. Sí, es bastante común. Es muy simple. Tenemos algunas herramientas de línea de comandos que puedes usar y generalmente es solo cuestión de agregar la herramienta de línea de comandos en ese paso donde quieras poner ese paso. Y como viste, simplemente tomando la versión de la pieza de software actual, el entorno al que deseas implementar y simplemente realizar esa llamada y devolverá un código de salida de cero o uno, cero significa éxito, uno significa fallo, y eso es todo. Y eso es generalmente lo que harás. Un código de salida distinto de cero debería cancelar tu canalización. De acuerdo, impresionante. Así que hubo algunas preguntas más. Y Matt se dirigirá a la sala de oradores en un horario especial. Así que si hay preguntas sin respuesta, asegúrate de unirte. Y Matt, nuevamente, muchas gracias por unirte hoy. Fue un placer tenerte aquí. Sí. Gracias. Gracias a todos por acompañarme, Anna.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Network Requests with Cypress
TestJS Summit 2021TestJS Summit 2021
33 min
Network Requests with Cypress
Top Content
Whether you're testing your UI or API, Cypress gives you all the tools needed to work with and manage network requests. This intermediate-level task demonstrates how to use the cy.request and cy.intercept commands to execute, spy on, and stub network requests while testing your application in the browser. Learn how the commands work as well as use cases for each, including best practices for testing and mocking your network requests.
Testing Pyramid Makes Little Sense, What We Can Use Instead
TestJS Summit 2021TestJS Summit 2021
38 min
Testing Pyramid Makes Little Sense, What We Can Use Instead
Top Content
Featured Video
Gleb Bahmutov
Roman Sandler
2 authors
The testing pyramid - the canonical shape of tests that defined what types of tests we need to write to make sure the app works - is ... obsolete. In this presentation, Roman Sandler and Gleb Bahmutov argue what the testing shape works better for today's web applications.
Full-Circle Testing With Cypress
TestJS Summit 2022TestJS Summit 2022
27 min
Full-Circle Testing With Cypress
Top Content
Cypress has taken the world by storm by brining an easy to use tool for end to end testing. It’s capabilities have proven to be be useful for creating stable tests for frontend applications. But end to end testing is just a small part of testing efforts. What about your API? What about your components? Well, in my talk I would like to show you how we can start with end-to-end tests, go deeper with component testing and then move up to testing our API, circ
Test Effective Development
TestJS Summit 2021TestJS Summit 2021
31 min
Test Effective Development
Top Content
Developers want to sleep tight knowing they didn't break production. Companies want to be efficient in order to meet their customer needs faster and to gain competitive advantage sooner. We ALL want to be cost effective... or shall I say... TEST EFFECTIVE!But how do we do that?Are the "unit" and "integration" terminology serves us right?Or is it time for a change? When should we use either strategy to maximize our "test effectiveness"?In this talk I'll show you a brand new way to think about cost effective testing with new strategies and new testing terms!It’s time to go DEEPER!
Playwright Test Runner
TestJS Summit 2021TestJS Summit 2021
25 min
Playwright Test Runner
Top Content
Everyone Can Easily Write Tests
TestJS Summit 2023TestJS Summit 2023
21 min
Everyone Can Easily Write Tests
Let’s take a look at how Playwright can help you get your end to end tests written with tools like Codegen that generate tests on user interaction. Let’s explore UI mode for a better developer experience and then go over some tips to make sure you don’t have flakey tests. Then let’s talk about how to get your tests up and running on CI, debugging on CI and scaling using shards.

Workshops on related topic

Designing Effective Tests With React Testing Library
React Summit 2023React Summit 2023
151 min
Designing Effective Tests With React Testing Library
Top Content
Featured Workshop
Josh Justice
Josh Justice
React Testing Library is a great framework for React component tests because there are a lot of questions it answers for you, so you don’t need to worry about those questions. But that doesn’t mean testing is easy. There are still a lot of questions you have to figure out for yourself: How many component tests should you write vs end-to-end tests or lower-level unit tests? How can you test a certain line of code that is tricky to test? And what in the world are you supposed to do about that persistent act() warning?
In this three-hour workshop we’ll introduce React Testing Library along with a mental model for how to think about designing your component tests. This mental model will help you see how to test each bit of logic, whether or not to mock dependencies, and will help improve the design of your components. You’ll walk away with the tools, techniques, and principles you need to implement low-cost, high-value component tests.
Table of contents- The different kinds of React application tests, and where component tests fit in- A mental model for thinking about the inputs and outputs of the components you test- Options for selecting DOM elements to verify and interact with them- The value of mocks and why they shouldn’t be avoided- The challenges with asynchrony in RTL tests and how to handle them
Prerequisites- Familiarity with building applications with React- Basic experience writing automated tests with Jest or another unit testing framework- You do not need any experience with React Testing Library- Machine setup: Node LTS, Yarn
How to Start With Cypress
TestJS Summit 2022TestJS Summit 2022
146 min
How to Start With Cypress
Featured WorkshopFree
Filip Hric
Filip Hric
The web has evolved. Finally, testing has also. Cypress is a modern testing tool that answers the testing needs of modern web applications. It has been gaining a lot of traction in the last couple of years, gaining worldwide popularity. If you have been waiting to learn Cypress, wait no more! Filip Hric will guide you through the first steps on how to start using Cypress and set up a project on your own. The good news is, learning Cypress is incredibly easy. You'll write your first test in no time, and then you'll discover how to write a full end-to-end test for a modern web application. You'll learn the core concepts like retry-ability. Discover how to work and interact with your application and learn how to combine API and UI tests. Throughout this whole workshop, we will write code and do practical exercises. You will leave with a hands-on experience that you can translate to your own project.
Detox 101: How to write stable end-to-end tests for your React Native application
React Summit 2022React Summit 2022
117 min
Detox 101: How to write stable end-to-end tests for your React Native application
Top Content
WorkshopFree
Yevheniia Hlovatska
Yevheniia Hlovatska
Compared to unit testing, end-to-end testing aims to interact with your application just like a real user. And as we all know it can be pretty challenging. Especially when we talk about Mobile applications.
Tests rely on many conditions and are considered to be slow and flaky. On the other hand - end-to-end tests can give the greatest confidence that your app is working. And if done right - can become an amazing tool for boosting developer velocity.
Detox is a gray-box end-to-end testing framework for mobile apps. Developed by Wix to solve the problem of slowness and flakiness and used by React Native itself as its E2E testing tool.
Join me on this workshop to learn how to make your mobile end-to-end tests with Detox rock.
Prerequisites- iOS/Android: MacOS Catalina or newer- Android only: Linux- Install before the workshop
API Testing with Postman Workshop
TestJS Summit 2023TestJS Summit 2023
48 min
API Testing with Postman Workshop
Top Content
WorkshopFree
Pooja Mistry
Pooja Mistry
In the ever-evolving landscape of software development, ensuring the reliability and functionality of APIs has become paramount. "API Testing with Postman" is a comprehensive workshop designed to equip participants with the knowledge and skills needed to excel in API testing using Postman, a powerful tool widely adopted by professionals in the field. This workshop delves into the fundamentals of API testing, progresses to advanced testing techniques, and explores automation, performance testing, and multi-protocol support, providing attendees with a holistic understanding of API testing with Postman.
1. Welcome to Postman- Explaining the Postman User Interface (UI)2. Workspace and Collections Collaboration- Understanding Workspaces and their role in collaboration- Exploring the concept of Collections for organizing and executing API requests3. Introduction to API Testing- Covering the basics of API testing and its significance4. Variable Management- Managing environment, global, and collection variables- Utilizing scripting snippets for dynamic data5. Building Testing Workflows- Creating effective testing workflows for comprehensive testing- Utilizing the Collection Runner for test execution- Introduction to Postbot for automated testing6. Advanced Testing- Contract Testing for ensuring API contracts- Using Mock Servers for effective testing- Maximizing productivity with Collection/Workspace templates- Integration Testing and Regression Testing strategies7. Automation with Postman- Leveraging the Postman CLI for automation- Scheduled Runs for regular testing- Integrating Postman into CI/CD pipelines8. Performance Testing- Demonstrating performance testing capabilities (showing the desktop client)- Synchronizing tests with VS Code for streamlined development9. Exploring Advanced Features - Working with Multiple Protocols: GraphQL, gRPC, and more
Join us for this workshop to unlock the full potential of Postman for API testing, streamline your testing processes, and enhance the quality and reliability of your software. Whether you're a beginner or an experienced tester, this workshop will equip you with the skills needed to excel in API testing with Postman.
Testing Web Applications Using Cypress
TestJS Summit - January, 2021TestJS Summit - January, 2021
173 min
Testing Web Applications Using Cypress
WorkshopFree
Gleb Bahmutov
Gleb Bahmutov
This workshop will teach you the basics of writing useful end-to-end tests using Cypress Test Runner.
We will cover writing tests, covering every application feature, structuring tests, intercepting network requests, and setting up the backend data.
Anyone who knows JavaScript programming language and has NPM installed would be able to follow along.
Best Practices for Writing and Debugging Cypress Tests
TestJS Summit 2023TestJS Summit 2023
148 min
Best Practices for Writing and Debugging Cypress Tests
Workshop
Filip Hric
Filip Hric
You probably know the story. You’ve created a couple of tests, and since you are using Cypress, you’ve done this pretty quickly. Seems like nothing is stopping you, but then – failed test. It wasn’t the app, wasn’t an error, the test was… flaky? Well yes. Test design is important no matter what tool you will use, Cypress included. The good news is that Cypress has a couple of tools behind its belt that can help you out. Join me on my workshop, where I’ll guide you away from the valley of anti-patterns into the fields of evergreen, stable tests. We’ll talk about common mistakes when writing your test as well as debug and unveil underlying problems. All with the goal of avoiding flakiness, and designing stable test.