Automatizando test de Postman con JMeter

Hoy en día, una de las herramientas más utilizadas para hacer test funcionales contra una API es Postman. Pese a que se pueden automatizar por command line con Newman, el uso más común de esta herramienta es para realizar test manuales durante el desarrollo de una API.

Cuando nuestro servidor escala o simplemente queremos automatizar nuestros test en una pipeline, Postman nos puede resultar un poco complejo para satisfacer las necesidades de testeo que nos pueden surgir, sobretodo si no solo queremos medir el funcionamiento, sino también el rendimiento. Aquí es dónde surge la necesidad de utilizar Apache JMeter.

A grandes rasgos, Apache JMeter es una aplicación open source, diseñada para lanzar test funcionales contra nuestro sistema y medir su rendimiento. Es una herramienta muy sencilla de utilizar, que nos facilita muchísimo la automatización, y añadir de una forma muy intuitiva assertions para validar las respuestas de nuestra API tanto en caso positivo como cuando se espera algún tipo de excepción y/o mensaje de error por parte del sistema bajo test. Además, permite una muy fácil incorporación en nuestra pipeline, puesto que permite su dockerización de una manera muy sencilla.

Otra de las ventajas que nos aporta JMeter respecto a Postman, es que además de test funcionales, nos permite realizar tests de rendimiento y estrés en múltiples hilos de ejecución sobre nuestra aplicación.

Y bien, es posible que estés barajando la posibilidad de adoptar el uso esta herramienta, pero tenemos todos nuestros test funcionales en Postman? Migrarlos uno a uno puede suponer una cantidad de esfuerzo y tiempo que no siempre se puede asumir dentro de las planificaciones de un proyecto.

Pues bien, a continuación veremos una manera muy sencilla de migrar los tests de Postman a JMeter, para poder adoptar las ventajas que nos aporta esta herramienta.

Migrando de Postman a JMeter

El método que vamos a utilizar para migrar los tests manuales que tenemos en Postman a JMeter va a ser utilizando este segundo como proxy entre Postman y nuestro servidor o API. Aunque para nuestro ejemplo utilicemos la migración de tests entre Postman y JMeter, puedes asumir que con este mismo método puedes crear tests desde cero desde tu propio navegador, capturando las comunicaciones entre tu frontend y tu backend. Para este ejemplo, la versión utilizada de JMeter va a ser la 5.0.

El propio JMeter tiene un template y una guía en su documentación oficial para crear y utilizar este método para capturar las comunicaciones entre un cliente y un servidor. Este template puede generarnos ficheros o herramientas que a priori podemos no necesitar, así que os voy a mostrar un sencillo ejemplo paso a paso de cómo crear desde cero tu suite de test en JMeter de forma automatizada.

Para este ejemplo, tenemos un pequeño repositorio de gestión de usuarios, con unos métodos sencillos tales como un healthcheck, creación de administradores, sign in de administradores, creación de usuario, sign in de usuario, creación y lectura de un formulario, etc. Para este ejemplo, hemos creado en Postman las llamadas a algunos de estos endpoints:

postman tests

Vamos a basarnos en la llamada healthcheck para este ejemplo, puesto que es la más sencilla y lo que nos interesa es centrarnos en el proceso para interceptar la llamada entre cliente y servidor.

El primer paso, es configurar Postman para que apunte al proxy. Para ello vamos a dirigirnos a File -> Settings y en la pestaña Proxy vamos a habilitar la opción Global Proxy Configuration. Configuramos el Proxy type para que acepte HTTP y HTTPS, aunque para nuestro ejemplo solo utilizaremos una llamada HTTP. En Proxy Server apuntaremos a l o c a l h o s t y configuraremos el puerto 8888 para el proxy.

Postman Settings

Una vez tenemos configurado Postman, vamos a abrir JMeter con un Test Plan vacío. En JMeter, tenemos dos partes bien diferenciadas, una que se encarga de realizar la función de proxy e interceptar las comunicaciones y otra en la que guardaremos las comunicaciones interceptadas.

Vamos a comenzar por la que almacenará las comunicaciones interceptadas, que una vez acabemos de grabarlas, es la que se convertirá en nuestra batería de tests funcionales automatizada.

En primer lugar, debemos crear un Thread Group, para añadirlo, pulsamos con el botón derecho sobre nuestro Test Plan y seleccionamos Add -> Threads(Users) -> Thread Group.

Dentro de nuestro Thread Group añadiremos un Recording Controller: Add -> Logic Controller -> Recording Controller. Aquí será donde aparezcan todas las llamadas a nuestro backend, y serán nuestros futuros tests.

Por último, en nuestro Test Plan añadimos un Http Request Defaults y Add -> Config Element -> HTTP Request Defaults. En esta parte vamos a configurar la url o la IP de nuestro backend.

JMeter-RecordingConfig

Una vez tenemos configurado dónde se van a guardar las llamadas al backend, vamos a configurar la interceptación de las llamadas. Para ello vamos a crear un Proxy server sobre nuestro Test Plan: Add -> Non-Test Elements -> HTTP Proxy Server (Para versiones anteriores a JMeter5, es posible que aparezca una sección llamada WorkBench, en tal caso, tendremos que añadirlo en dicha sección).

En el HTTP Proxy Server, tendremos que configurar el Target Controller para que apunte a nuestro Recording Controller, además de configurar el puerto a 8888 en Global Settings (Si recordáis, es el puerto que hemos configurado para que apunte Postman en la configuración del proxy).

Test Script Recorder

Pues bien, ya tenemos todo configurado para poder interceptar las llamadas entre nuestro cliente Postman y el servidor backend, solo nos falta darle a Start dentro de Test Script Recorder para empezar a grabar las llamadas en JMeter.

Consideración importante: Trabajando en entornos locales, se acostumbra a no poner el protocolo http en la url del cliente, si trabajamos con un navegador, este debería añadirlo automáticamente, pero no es el caso de Postman. Si queréis ahorraros un dolor de cabeza no olvidéis poner en la URL a la que se ataca desde Postman el protocolo que se va a utilizar para atacar al backend, puesto que en caso contrario, JMeter no capturará la comunicación, aunque Postman reciba la respuesta correctamente la respuesta del servidor.

Vamos a realizar la prueba, pulsamos Start, vamos a Postman y lanzamos la llamada contra el backend. Si volvemos a JMeter, veremos que ha aparecido bajo Recording Controller la llamada realizada, y dentro de esta las cabeceras utilizadas para la llamada.

JMeter Call recorded

Bonus Track: Comprobar resultados

Una vez tenemos todas las llamadas que queremos guardadas en JMeter, este nos permite la posibilidad de añadir comprobaciones sobre la respuesta para no tener que comprobar de forma manual si el resultado es el esperado. En este caso, para la llamada health del ejemplo anterior, la respuesta por parte del servidor es la palabra Green y un Status Code 200.

Para automatizar los test guardados, debemos crear un View Result Tree dentro del Thread Group (Add -> Listeners -> View Result Tree) para visualizar las llamadas que vamos a lanzar y su resultado.

Llegados a este punto, ya solo nos falta añadir las comprobaciones que queremos realizar sobre la respuesta por parte del servidor. JMeter ofrece muchas posibilidades para verificar la respuesta del backend, para este sencillo ejemplo, vamos a fijarnos en el cuerpo del mensaje de respuesta. Añade una nueva assertion sobre la llamada registrada haciendo clic con el botón derecho Add -> Assertions -> Response Assertions.

A continuación. vamos a configurar la Response Assertion para definir la respuesta esperada en el cuerpo de la respuesta: 1 – Seleccionamos en Field to Test como Text Response 2 – Pattern Matching Rules como Equals 3 – Patterns to Test en este caso, con el texto que esperamos de respuesta: Green

Assertion Setup

Y por último, ejecutamos los tests con el símbolo Play verde de la barra superior. Así pues, si todo ha ido como esperábamos, deberíamos tener el test en verde.

Next Steps

Esto han sido unas breves pinceladas sobre cómo migrar todos nuestros test de Postman a JMeter, para automatizar nuestros procesos y casos de uso de nuestra API. Por supuesto, JMeter nos ofrece muchas posibilidades en las que profundizar si deseamos mejorar nuestra suite de test y en consecuencia, nuestro servidor REST.

Jmeter nos ofrece herramientas de multithreading para hacer stress testing sobre nuestro servidor y poder visualizar los tiempos de respuesta, en busca de posibles timeouts, memory leaks o stack overflows en caso de que trabajemos con microservicios que se comunican de forma asíncrona, por ejemplo. Todos estos datos sobre tiempos de respuesta en función de los threads atacando a nuestro servidor, son recogidos por la propia aplicación y se pueden visualizar en forma de gráficos para encontrar los límites de tiempos de respuesta aceptables de nuestra API.