Aquí tienes la serie completa de tutoriales sobre Mountebank:
- Mountebank – Customizando la configuración
- Mountebank – Jugando con los predicados
- Mountebank – Respuestas enlatadas
- Mountebank – Respuestas proxy (este tutorial)
- Mountebank – Respuestas inject
- Mountebank – Comportamientos
Entorno
El tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil MacBook Pro 15′ (2,3 Ghz Intel Core i7, 16GB DDR4).
- Sistema Operativo: Mac OS Catalina 10.15.5
- Entorno de desarrollo: JDK 11, IntelliJ, Docker, Postman
Introducción
En este artículo vamos a ver el uso de otro de los tipos de respuestas que provee Mountebank, las respuestas de tipo proxy, espero que os guste y/o sirva de ayuda en vuestros tests.
Este artículo está dividido en 6 partes:
- Respuestas de tipo proxy
- Creación de predicados con predicateGenerators
- Capturar múltiples respuestas
- Proxy “transparente”
- Proxy “parciales”
- Conclusiones
Respuestas de tipo proxy
Los impostores de tipo proxy se configuran para ir directamente a la fuente real, nos permite poner a un impostor mountebank entre el sistema bajo prueba y un servicio real del que depende, esta disposición permite capturar datos reales que se pueden reproducir en pruebas, en lugar de crearlos manualmente utilizando respuestas enlatadas.
Mountebank expone el estado actual de cada impostor a través de la API, si enviamos una solicitud GET a http://localhost:2525/imposters/80, se puede ver la respuesta guardada.
Mountebank registra el tiempo que se tarda en llamar al servicio real en el campo proxyResponseTime, que podemos usar para agregar latencia simulada durante la prueba de rendimiento.
El comportamiento por defecto de un proxy (definido por el modo proxyOnce) es llamar al servicio de bajada la primera vez que ve una petición que no reconoce, y desde ese punto en adelante enviar la respuesta guardada de vuelta para futuras peticiones que se vean similares.
{ "port": 80, "protocol": "http", "stubs": [ { "responses": [ { "proxy": { "to": "http://api.autentia.com" }, "mode": "proxyOnce" } ] } ] }
Creación de predicados con predicateGenerators
Los predicateGenerators son los responsables de crear los predicados sobre las respuestas guardadas. Los predicados generados utilizan deepEquals para la mayoría de los casos.
El campo predicateGenerators refleja fielmente el campo predicates estándar y acepta todos los mismos parámetros. Cada objeto en la matriz predicateGenerators genera un objeto correspondiente en la matriz de predicados del stub recién creado.
Vamos a verlo con un ejemplo, para ello vamos a definir el siguiente impostor.
{ ... "proxy": { "to": "http://api.autentia.com/...", "predicateGenerators": [ { "matches": { "query": true }, "caseSensitive": true } ] } }
El siguiente fragmento de código refleja cómo se vería el predicado generado por Mountbank y almacenado para las siguientes peticiones que se realicen.
... "stubs": [ { "predicates": [ { "caseSensitive": true, "deepEquals": { "query": { "q": "mountebank", "page": "1" } } } ], "responses": [ { "is": { ... } } ] }, ...
Capturar múltiples respuestas
Hasta ahora hemos visto la opción por defecto de Mountebank, tal y como hemos comentado anteriormente, proxyOnce, que es llamar al servicio de bajada la primera vez que ve una petición que no reconoce pero ¿cómo haríamos si tuviéramos un caso de prueba que se basará en la volatilidad del inventario a lo largo del tiempo?, necesitaríamos un proxy que nos permitiera capturar un conjunto de datos más rico o más voluminoso para reproducirlo posteriormente, por ejemplo en unas pruebas de carga.
El modo proxyAlways se asegura que todas las solicitudes lleguen al servicio real, lo que nos permite capturar múltiples respuestas para un único tipo de solicitud. Crear este tipo de proxy es tan simple como establecer el modo proxyAlways.
La diferencia clave entre proxyOnce y proxyAlways, es que proxyOnce genera los nuevos stubs antes del stub que contiene la respuesta de tipo proxy, mientras que proxyAlways genera los stubs después del stub del proxy.
{ "port": 80, "protocol": "http", "stubs": [ { "responses": [ { "proxy": { "to": "http://api.autentia.com/..." }, "mode": "proxyAlways", "predicateGenerators": [ { "matches": { "path": true } } ] } ] } ] }
Proxy “transparente”
Mountebank provee de un modo más de proxy, el modo “proxyTransparent” que al igual que el modo proxyAlways se asegura que todas las solicitudes lleguen al servicio real, pero a diferencia de éste no guarda las respuestas que recibe del servicio real.
Proxy “parciales”
Mountebank también proporciona lo que denomina como proxy parcial, donde la mayoría de las llamadas fluyen a través del servicio real, pero unas pocas solicitudes especiales desencadenan respuestas enlatadas. Fijaos que el proxy no tiene predicados, lo que significa que todas las peticiones que no coincidan con los predicados en los stubs anteriores fluirán a través del proxy.
{ ... "stubs": [ { "predicates": [ { "contains": { "body": "5555555555555555" } } ], "responses": [ { "is": { "body": "FRAUD ALERT... " } } ] }, { "predicates": [ { "contains": { "body": "4444444444444444" } } ], "responses": [ { "is": { "body": "INSUFFICIENT FUNDS..." } } ] }, { "responses": [ { "proxy": { "to": "http://api.autentia.com/...", "mode": "proxyAlways" } } ] } ] ... }
Conclusiones
En este artículo hemos repasado qué son y cómo podemos utilizar los tipos de respuesta proxy que proporciona Mountebank para capturar las respuestas reales y guardar sus respuestas para su reproducción futura.
Puedes descargar el proyecto completo aquí.
Referencias
https://github.com/bbyars/mountebank
https://github.com/bbyars/mountebank-in-action