Una inmersión profunda en cómo construimos soporte para ejecutar pruebas de VTest en el runtime de Cloudflare Workers. Comenzaremos dando una visión general de la plataforma de desarrollo de Cloudflare, incluyendo nuestro runtime de JavaScript de código abierto workerd y el simulador local Miniflare. A continuación, hablaremos sobre cómo funciona VTest y proporciona soporte para runtimes personalizados, utilizando Node.js como controlador para ejecutar pruebas en otro entorno. Describiremos los detalles de nuestro pool personalizado de VTest y cómo agregamos soporte para evaluación de código dinámico a nuestro runtime. Por último, hablaremos sobre cómo mejoramos la ergonomía del desarrollador con almacenamiento aislado por prueba, ayudantes de prueba para acceder directamente a las instancias de Durable Object y soporte para simulación declarativa de solicitudes HTTP, y cómo creamos un servicio para construir tipos para las configuraciones de compatibilidad específicas de los usuarios.
Probando Runtimes Alternativos con Node y VTest
Video Summary and Transcription
Bienvenidos a mi charla sobre la prueba de runtimes alternativos con Node y VTest. VTest es un popular framework de pruebas que permite la evaluación de código dinámico y se ejecuta dentro de los workers de Cloudflare. Los objetos duraderos proporcionan instancias de clases JavaScript distribuidas con identificadores únicos y almacenamiento persistente para una mejor experiencia de desarrollo. El framework de pruebas en los workers de Cloudflare deshace automáticamente las escrituras en el almacenamiento y admite la generación de datos. También es posible simular solicitudes fetch salientes en los workers de Cloudflare.
1. Introducción a Cloudflare Workers y Pruebas
Bienvenidos a mi charla sobre la prueba de entornos de ejecución alternativos con Node y VTest. Soy Brendan, un ingeniero de sistemas en Cloudflare. Los workers de Cloudflare son un entorno de ejecución para implementar código de manejo de HTTP. Utilizamos un entorno de ejecución personalizado basado en V8 llamado workerd y una biblioteca de Node llamada Miniflare. Hablemos sobre las pruebas. Tenemos un nuevo sistema que admite tanto pruebas de integración como pruebas unitarias.
Hola a todos. Bienvenidos a mi charla sobre la prueba de entornos de ejecución alternativos con Node y VTest. Esto será una inmersión profunda en cómo construimos la integración de VTest en los workers de Cloudflare, pero las técnicas también serán aplicables a otros entornos de ejecución. Soy Brendan. Creé Miniflare, un simulador completamente local para los workers de Cloudflare. Ahora soy un ingeniero de sistemas en Cloudflare, enfocándome específicamente en las herramientas de desarrollo de los workers. Ya he mencionado los workers de Cloudflare varias veces antes, pero ¿qué son? Escriben un código de manejo de HTTP, lo publican en nuestra plataforma, y luego les proporcionamos una URL para ejecutarlo. Nuestro entorno de ejecución proporciona API estándar similares a las que encontrarían en un navegador web. Implementamos su código en todas las ubicaciones de Cloudflare, por lo que sus usuarios obtienen un acceso de baja latencia sin importar dónde se encuentren. Importante, prácticamente no hay tiempo de inicio en frío. Nuestro entorno de ejecución se basa en aislamientos de V8, no en contenedores o máquinas virtuales. Si les interesa cómo hacemos esto, hay una excelente charla del arquitecto de los workers de Cloudflare, Kenton, llamada Fine Grain Sandboxing with V8 Isolates. Debería ser uno de los primeros resultados si lo buscan en Google. Además de las API web estándar, también proporcionamos API de tiempo de ejecución para acceder al resto de la plataforma de desarrollo de Cloudflare, por ejemplo, el acceso al almacenamiento clave-valor. Aquí, el almacenamiento es un enlace a un espacio de nombres KB de un worker. Podemos obtener, poner, eliminar y listar valores como se esperaría. Y también hay otros tipos de enlaces. Cosas como almacenes de blobs, bases de datos SQLite, y otros workers también. Utilizamos un entorno de ejecución personalizado basado en V8 llamado workerd para ejecutar su código. Luego construimos esta cosa llamada Miniflare, que es una biblioteca de Node que proporciona una API de JavaScript en la parte superior de workerd, y también proporciona simuladores locales para el resto de la plataforma de desarrollo.
Ahora que hemos explicado los conceptos básicos de los workers, hablemos sobre las pruebas. Supongamos que tenemos este worker que suma dos números y nos gustaría escribir pruebas para verificar que su comportamiento sea correcto. Hay un par de formas en las que podríamos hacer esto. Podríamos escribir una prueba de integración que inicie una instancia local de nuestro entorno de ejecución, envíe una solicitud HTTP y verifique la respuesta, o podríamos escribir una prueba de unidad que importe funciones directamente de un worker y verifique sus valores de retorno. Para admitir pruebas de unidad, necesitamos acceder a las API de tiempo de ejecución de los workers dentro del ejecutor de pruebas para que la función se ejecute con el ámbito global correcto. Proporcionamos algunas formas diferentes de hacer esto en la actualidad, pero tienen sus limitaciones. Esta charla explicará cómo construimos un nuevo sistema que admite ambos tipos de pruebas. Antes de continuar, repasemos los puntos clave que acabamos de cubrir. Tenemos un entorno de ejecución personalizado basado en V8 que implementa principalmente API estándar web como los navegadores, por ejemplo, fetch, request, response, web crypto. También implementamos algunas API no estándar, específicamente para casos de uso en el lado del servidor.
2. Descripción general e implementación de VTest
Hoy, cubriremos cómo funciona VTest, la evaluación de código dinámico en tiempo de ejecución, la ejecución de VTest en el tiempo de ejecución del worker, la mejora de la experiencia del desarrollador y la simulación declarativa de solicitudes. VTest es un popular marco de pruebas con ejecuciones rápidas y utiliza un grupo de hilos de trabajadores de nodo de forma predeterminada. Para ejecutar pruebas dentro de los workers, ejecutamos el ejecutor de pruebas dentro de workerd y utilizamos WebSockets para la comunicación. VTest proporciona una API para implementar grupos personalizados.
3. VTest Worker Thread and Test Runner
Creamos un canal RPC y usamos un canal de mensajes para la comunicación. Se ensambla y se pasa datos al nuevo hilo de trabajador. En el trabajador, se importa el script de trabajador de VTest y se llama al método run. Se esperan y resuelven las promesas para informar de cualquier error. VTest utiliza un host de nodo para orquestar pruebas e informar resultados, y el código del ejecutor de pruebas está diseñado para ejecutarse en el entorno de un trabajador. VTest también utiliza la evaluación de código dinámico dentro del ejecutor de pruebas.
4. Custom Pool and Dynamic Code Execution
Los mensajes entre el grupo y el trabajador incluyen los métodos RPC fetch y resolve ID. Fetch agrupa el código en una ruta especificada utilizando VT para la ejecución dinámica en el trabajador. Resolve ID devuelve la ruta del archivo a un módulo para la importación dinámica. Necesitamos ejecutar código JavaScript desde una cadena e importar módulos desde el disco.
Si volvemos a nuestro grupo personalizado anterior, veamos los mensajes que se envían entre el grupo y el trabajador. Veremos que hay algunos métodos RPC diferentes. Los dos más relevantes para nosotros son fetch, que transforma una ruta con VT en el host. Entonces, básicamente agrupa todo el código en esa ruta utilizando VT. Luego devuelve los resultados para ser ejecutados dinámicamente en el trabajador. Ten en cuenta que estas importaciones se han reemplazado con llamadas especiales a las funciones de VT. Así es como VT implementa los límites de reemplazo de módulos en la simulación de módulos. El otro método relevante es resolve ID, que toma un especificador y un referente, y luego devuelve la ruta del archivo a un módulo. Si está en el directorio de módulos de nodo, VTest intentará importarlo dinámicamente. Con esto en mente, tenemos dos requisitos. Necesitamos poder ejecutar código JavaScript arbitrario desde una cadena y necesitamos poder importar módulos arbitrarios desde
5. Dynamic Code Evaluation and Module Fallback
Por razones de seguridad, agregamos una vinculación de evaluación insegura solo local para permitir la evaluación de código dinámico controlado. Esta seguridad basada en capacidades permite la ejecución segura de código que depende de eval. Aunque este enfoque funciona para el código JavaScript, no puede evaluar directamente los módulos ES. Para manejar la carga de módulos, introdujimos un servicio de respaldo de módulos que resuelve las importaciones mediante solicitudes HTTP. Este servicio proporciona un mecanismo de respaldo para las importaciones no resueltas y admite la resolución similar a la de Node con la capacidad de detectar exportaciones con nombre.
6. Request Context and Durable Objects
Cada solicitud entrante en Workers tiene su propio contexto de solicitud, que se elimina cuando se devuelve una respuesta. Para solucionar esto, necesitamos extender la vida útil del contexto de solicitud para el trabajo en segundo plano. Afortunadamente, los objetos duraderos proporcionan instancias de clase JavaScript distribuidas con identificadores únicos y almacenamiento persistente. Estas instancias se pueden utilizar para almacenamiento volátil en memoria y son similares a los actores. Los objetos duraderos permiten la construcción de aplicaciones colaborativas con instancias ubicadas más cerca de cada usuario. El objetivo futuro es permitir que los objetos duraderos se muevan entre centros de datos.
Ahora digamos que mi colega en Estados Unidos quiere crear un documento. En lugar de usar un nuevo identificador único, llaman a la función de identificador a partir del nombre. Como no sabemos si ya existe un objeto con ese identificador, el sistema primero debe hacer una búsqueda global. Ahora que estamos seguros de que el objeto aún no existe, podemos crear una nueva instancia nuevamente en el centro de datos más cercano a mi colega. Y finalmente, digamos que tengo otro colega en Australia. Ellos quieren acceder a mi documento, así que les comparto el identificador. Utilizan el método de cadena de identificador para obtener un identificador de objeto duradero y se conectan a mi instancia existente. Debido a que están al otro lado del mundo, su latencia es bastante alta. Aún no hemos implementado esto, pero en el futuro, estamos
7. Integration Tests and Durable Object Context
Los objetos duraderos reutilizan el mismo contexto de solicitud, lo que permite la ejecución de pruebas sin preocuparse por esperas y tiempos de espera. Las pruebas de integración para Cloudflare utilizan un módulo de prueba que devuelve el entorno actual. Al importar los controladores de los workers y llamarlos directamente, el comportamiento de las pruebas coincide con el de producción. Los usuarios pueden configurar un punto de entrada principal para la recarga en caliente de módulos, lo que garantiza que los módulos se invaliden y las pruebas se vuelvan a ejecutar con un nuevo código.
Este es un objeto duradero que hace eso. Comenzaremos creando un par de WebSockets, que es una API de workers no estándar, algo así como MessageChannel, pero para WebSockets. Te quedas con una mitad y devuelves la otra mitad en la respuesta. Luego extraemos los datos para este worker de una cabecera utilizando una versión más avanzada de JSON.parse que admite tipos estructurados con referencias circulares. Utilizamos una clase de puerto de mensajes WebSocket personalizada para adaptar un WebSocket con una interfaz de puerto de mensajes. Nuevamente, con soporte para tipos serializables estructurados. Todavía estamos tratando de ejecutar código diseñado para Node aquí, pero afortunadamente tenemos esta bandera de compatibilidad con Node.js que habilita el soporte para un subconjunto de los módulos integrados de Node y luego, al rellenar algunos módulos integrados más con el servicio de módulos, podemos hacer que VTest se ejecute en WorkerD. Esto nos permite ejecutar pruebas que importan funciones básicas, las llaman y verifican sus valores de retorno, lo cual es un buen comienzo, pero ¿qué pasa con esos parámetros de entorno y contexto que mencioné antes? ¿Cómo escribimos pruebas que dependan de ellos? Para esto, definiremos un módulo de prueba de Cloudflare que se devuelve mediante el servicio de fallback de módulos. Usamos una variable de nivel de módulo para almacenar el entorno actual y exportamos una función para establecerlo. Nuestro módulo de prueba de Cloudflare reexporta un subconjunto de un módulo interno para que los usuarios no puedan manipular cosas ocultas. La variable de entorno se establece utilizando el segundo parámetro del constructor de nuestros objetos de ejecución y con eso, tenemos pruebas de integración. Podemos importar controladores de workers y llamarlos directamente. ¿Recuerdas lo que dije sobre el contexto de solicitud antes? El ejecutor de pruebas se está ejecutando dentro de un contexto de objeto duradero, por lo que no tenemos que preocuparnos por esperas y tiempos de espera. Debido a que estamos llamando a los controladores de workers dentro de ese contexto, ellos tampoco tienen que preocuparse por esperas y tiempos de espera, lo cual no es realmente lo que queremos de una prueba de integración. Nos gustaría que el comportamiento coincida con el de producción. En cambio, permitimos a los usuarios configurar un punto de entrada principal. En el worker que implementa el objeto ejecutor, definimos un controlador que importa el punto de entrada con VT y reenvía la llamada al controlador. Debido a que estamos importando con VT, obtenemos la recarga en caliente de módulos de forma gratuita. Cuando el punto de entrada principal o una de sus dependencias cambia, los módulos se invalidan y las pruebas se vuelven a ejecutar con un nuevo código. Luego definimos una vinculación de worker al worker actual en el
8. Durable Objects and Developer Experience
El uso de esto nos proporciona una API más ergonómica para las pruebas de integración. Los objetos duraderos son potentes y proporcionan todo lo necesario para escribir pruebas unitarias y de integración para los workers. Las secciones siguientes cubrirán funcionalidades adicionales para mejorar la experiencia del desarrollador.
9. Isolated Per Test Storage and Seeding Data
Las pruebas deben ser autocontenidas y ejecutables en cualquier orden. Las escrituras en el almacenamiento deben deshacerse al final de cada prueba. Puede ser complicado realizar un seguimiento manual de todas las escrituras y deshacerlas. Con el marco de pruebas, las escrituras en el almacenamiento se deshacen automáticamente. Se admite la generación de datos utilizando una pila. Cada prueba obtiene su propio entorno de almacenamiento que se deshace automáticamente para la siguiente prueba.
10. Testing Describe Blocks and Durable Objects
Para los bloques describe, se aplica el mismo proceso. Implementamos almacenamiento aislado utilizando una pila de archivos SQLite en disco. Para activar el empuje y el desapilamiento, utilizamos un ejecutor de pruebas personalizado V. Envolvemos las clases de objetos duraderos de manera similar a los controladores regulares y agregamos un controlador de solicitudes especial para ejecutar funciones arbitrarias en el contexto de los objetos duraderos.
Para los bloques describe, se aplica el mismo proceso. Cuando ingresamos al bloque describe, empujamos un nuevo marco a la pila. Todas las reglas antes en el bloque describe escribirán en este marco y también hay que tener en cuenta que todas las reglas antes se ejecutan antes de cada uno. Cuando comenzamos una nueva prueba, empujamos un nuevo marco a la pila, luego ejecutamos las reglas antes del nivel superior, luego las reglas antes del nivel descrito y luego la prueba en sí. Hay que tener en cuenta que todas estas operaciones escriben en el marco de la prueba. Por lo tanto, cuando la prueba se completa y se desapila el marco, todas las escrituras se deshacen. La siguiente prueba hará exactamente lo mismo. Y luego, cuando esa prueba termine, desapilaremos el marco superior. Luego, cuando el bloque describe termine, desapilaremos el siguiente marco hasta que nos quede el marco raíz nuevamente. Miniflare implementa simuladores para servicios de almacenamiento sobre objetos duraderos con un almacén de blobs separado. Para implementar un almacenamiento aislado, implementamos una pila de archivos SQLite en disco. Los almacenes de blobs se implementan como un almacén separado y se conservan a través de las operaciones de pila. Estos se limpian al finalizar las ejecuciones de las pruebas. Si bien esto funciona, implica copiar muchos archivos SQLite. Nos gustaría explorar el uso de puntos de guardado de SQLite para una solución más eficiente. Para activar el empuje y el desapilamiento, utilizamos un ejecutor de pruebas personalizado V, que le permite conectarse a diferentes ganchos del ciclo de vida de las pruebas de V. Empujamos la pila antes de ejecutar un bloque descrito o comenzar un intento de prueba y desapilamos la pila después de finalizar un intento de prueba o bloque descrito. Mencioné los objetos duraderos varias veces ahora. Pensemos en cómo los probaríamos realmente. Queremos poder unit test objetos duraderos como clases regulares de JavaScript. Esto significa llamar y espiar métodos y acceder a propiedades. También sería útil tener acceso directo al almacenamiento para generar data y verificar los efectos secundarios. Desafortunadamente, no podemos simplemente construir instancias de la clase. Esto rompería las garantías de unicidad de los objetos duraderos. Los objetos duraderos también tienen un comportamiento de bloqueo implícito bastante complicado, que debería reproducirse llamando a métodos. Debes estar en su contexto de solicitud. Para resolver todos estos problemas, envolvemos las clases de objetos duraderos de manera similar a los controladores regulares como lo hicimos para las pruebas de integración con self. Luego agregamos un controlador de solicitudes especial para ejecutar funciones arbitrarias en el contexto de los objetos duraderos. Veamos cómo se ve esto. En el módulo de prueba de Cloudflare, definimos una función run in durable object que acepta un objeto duradero.
11. Manejo de solicitudes de objetos duraderos
Esta función espera los argumentos de la instancia y el estado persistente. Almacenamos la función en un mapa de nivel de módulo y enviamos una solicitud al objeto duradero con el ID que lo almacenamos. En el controlador de solicitudes de objetos duraderos, verificamos si se estableció el ID.
12. Manejo de solicitudes de búsqueda salientes
Esto aborda todos nuestros requisitos anteriores. Ahora podemos llamar métodos y propiedades en las instancias directamente. Tenemos acceso directo al almacenamiento para sembrar datos. Importante, la función de devolución de llamada se ejecuta en el contexto de la solicitud del objeto duradero. Por último, cubramos rápidamente cómo manejamos la simulación de solicitudes de búsqueda salientes. La mayoría de los trabajadores realizarán solicitudes de búsqueda salientes. Es útil simular respuestas a estas solicitudes para no tener que probar contra producción o configurar servidores de prueba adicionales.
Por último, cubramos rápidamente cómo manejamos la simulación de solicitudes de búsqueda salientes. La mayoría de los trabajadores realizarán solicitudes de búsqueda salientes. Es útil simular respuestas a estas solicitudes para no tener que probar contra producción o configurar servidores de prueba adicionales. En MiniFlare, te permitimos especificar un agente simulado de Indici para enrutar. Indici es el paquete que alimenta la implementación de búsqueda integrada en los nodos. La clase de agente simulado proporciona una interfaz declarativa para especificar solicitudes a simular y las respuestas correspondientes a devolver. Esta API es relativamente simple, pero lo suficientemente flexible para casos de uso avanzados. Para implementar esto en nuestra integración de V test, hemos incluido una versión simplificada de Indici que solo contiene el agente simulado code. En nuestro paquete especial, exponemos ganchos para establecer el despachador global. Luego, parcheamos en tiempo de ejecución la función de búsqueda global para pasar a través del agente simulado si está habilitado. Veamos algunos ejemplos de cómo funciona esto. Cuando el agente simulado está deshabilitado, lo evitamos por completo y reenviamos las solicitudes a la función de búsqueda regular. Si el agente simulado está habilitado y la solicitud coincide con uno de sus interceptores, devolverá una respuesta. Si la solicitud no coincide con un interceptor, se pasará a la función de búsqueda original. A menos que llamemos a la función de deshabilitar met connect en el agente simulado, lo que evita las llamadas de red si no se simulan las solicitudes. En este caso, el usuario verá un error. Como mencioné, implementamos esto con una versión personalizada de Indici. Usamos un mapa débil para almacenar la solicitud original para la función de búsqueda original si la solicitud no está simulada. De manera similar, usamos otro mapa débil para almacenar una respuesta de la función de búsqueda original que podemos devolver más tarde. Luego, parcheamos en tiempo de ejecución la función de búsqueda global. Verificamos si el agente está realmente habilitado y pasamos a la función de búsqueda original si no lo está. Luego, convertimos el objeto de solicitud estándar en un formato compatible con Indici y almacenamos la solicitud original en el mapa débil con clave en las opciones de despacho de Indici. Luego, definimos controladores de despacho de Indici que registran cualquier respuesta simulada que recibamos. Estas funciones no se llamarán si la solicitud no coincide con el agente. Luego, definimos controladores de despacho de Indici que registran cualquier respuesta simulada que recibamos.
13. Manejo de solicitudes de búsqueda salientes - Conclusión
Estas funciones no se llamarán si la solicitud no coincide con el agente. Definimos el controlador de finalización para la respuesta simulada completa o la respuesta de la función fetch original. Cubrimos cómo funciona VTest, personalizando su comportamiento, evaluación de código dinámico, ejecutando VTest dentro del tiempo de ejecución del worker, almacenamiento aislado, llamando a objetos duraderos directamente y simulación declarativa de solicitudes con Indici. Prueba Cloudflare Workers y encuentra una descripción general y el código en el blog de Cloudflare y el repositorio de GitHub.
Estas funciones no se llamarán si la solicitud no coincide con el agente y llama a la función fetch original. Luego, definimos el controlador de finalización. Esto se llamará cuando se devuelva la respuesta simulada completa o cuando se devuelva una respuesta de la función fetch original. Si se llamó a la función original, podemos obtener la respuesta del mapa débil, nuevamente, utilizando las opciones de despacho como clave. De lo contrario, construimos un objeto de respuesta estándar a partir de las respuestas simuladas. Finalmente, despachamos la solicitud a través del agente simulado y devolvemos la promesa de respuesta. Y con eso, hemos terminado. Hemos cubierto cómo funciona VTest y cómo podemos personalizar su comportamiento con grupos personalizados, cómo agregamos soporte para evaluación de code dinámico en nuestro tiempo de ejecución, utilizando esos elementos primitivos para ejecutar VTest dentro del tiempo de ejecución del worker, cómo mejoramos la experiencia del desarrollador con almacenamiento aislado, llamando a objetos duraderos directamente como clases de JavaScript, y finalmente, simulación declarativa de solicitudes con Indici. Te animo a que pruebes Cloudflare Workers si aún no lo has hecho. Puedes encontrar una descripción general de esta charla en el blog de Cloudflare y todo el code para la integración está en el
QnA
Introducción y Experiencia con Cloudflare Workers
Gracias a todos por escuchar. La mayoría de las personas no han utilizado Cloudflare Workers antes, pero definitivamente deberían probarlo. Brandon habla sobre su experiencia con Cloudflare Workers y por qué lo eligió. También menciona la simplicidad y los productos de base de datos integrados. Un miembro de la audiencia pregunta sobre el uso de puntos de guardado de SQLite para implementar almacenamiento aislado, y Brandon explica cómo funciona.
SQLite, Pruebas Paralelas, Helpers y Keynote
Hay charlas en línea increíbles del creador de SQLite, una tecnología muy valorada utilizada en computadoras de aviación en todo el mundo. El orador también aborda las pruebas paralelas en VTest, la disponibilidad de helpers en el módulo de pruebas de Cloudflare y el uso de Keynote para crear presentaciones atractivas.
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
Workshops on related topic
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
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
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.
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.
Comments