Postman II: Flows y automatización con Newman.

Postman II: Flows y automatización con Newman.

Azahara Fernández Guizán, Programadora de .NET y Angular en Sngular

Azahara Fernández Guizán

Programadora de .NET y Angular en Sngular

20 de abril de 2024

En este segundo artículo sobre Postman, veremos algunas opciones un poco más avanzadas para sacarle todo el partido a esta herramienta. Por un lado con los flujos podrás hacer simulaciones más reales del uso de una api, añadir tests, condiciones, validaciones y codificarlo de forma muy simple.

La automatización te será muy útil si quieres descargar datos de prueba y el ir endpoint a endpoint te resulta demasiado largo y una inversión importante de tiempo.

Postman Flows

En septiembre de 2021, el equipo de Postman lanzó una funcionalidad que todavía está en Beta. Es por ello, que todavía no hay manuales oficiales, ni siquiera existen muchos recursos no oficiales circulando por la red.

¿Qué información hay online?

No obstante, se pueden encontrar algunos recursos útiles oficiales:

  • Repositorio oficial del equipo de Postman: https://github.com/postmanlabs/postman-flows

  • Foro de dudas con la comunidad del equipo de Postman, donde responden o incluso se les pueden pedir mejoras: https://github.com/postmanlabs/postman-flows/discussions

¿En qué consiste?

Es una forma de poder automatizar pruebas a las APIS, creando flujos de llamadas basándose en el desarrollo no code. La interfaz es muy parecida a Scratch y otros lenguajes similares de programación visual. Se van poniendo bloques que se configuran con lo que se quiere y se van uniendo.

La mayoría de los bloques tiene una entrada, o varias y uno o varios puntos de salida. Cuando hay varios puntos de salida, suelen indicar si son para tests o para datos y se pueden añadir varios bloques a cada punto de salida. También existen opciones para que no se ejecute un paso hasta que el anterior se complete.

¿Cuáles son los bloques disponibles?

Están agrupados en la siguiente tabla:

image17

¿Cómo empiezo?

El punto de partida siempre es el bloque con el Start (al cual se aprieta para lanzar el flujo). A este bloque se le añaden los siguientes, por ejemplo un bloque Send Request para enviar una llamada. En este bloque nos va a dejar elegir una request que tengamos guardada en nuestra colección y va a tener dos puntos de salida: uno para el resultado de los tests y otro para la respuesta que consiga.

image6-1

Después de la request los siguientes bloques que añadamos no sabrán reconocer el objeto de respuesta que recibirán hasta que no se haya dado al botón start. Es interesante ir lanzando según se van añadiendo bloques, apretando en el start para que automáticamente la herramienta pueda mapear los objetos y cargar las opciones en los bloques.

Además se van pintando en azul con bolitas que se desplazan los caminos por los cuales va transitando la información por el flujo. De esta forma se puede visualizar si algo va mal.

También en la consola del postman nos va poniendo información relativa a las llamadas que se van lanzando y que tipo de código http reciben.

¿Cómo se usan las validaciones?

Ahora mismo las validaciones son útiles pero todavía no permiten cuestiones del tipo conseguir la longitud de la lista de objetos que se reciben para poder controlarla. No obstante, aseguran que están trabajando en ello de forma prioritaria para permitir opciones más complejas.

Pero si permite seleccionar los códigos de respuesta http o incluso alguna propiedad que se reciba en el cuerpo de la respuesta y compararla. Debe unirse como entrada a la salida de datos de una Request y tiene dos salidas: una si pasa la validación y otra si no la pasa.

image8-1

¿Se pueden usar varias terminales?

Si, para eso está la propiedad Group de este bloque, va añadiendo la información a la terminal que tenga ese nombre, y si no existe la crea.

De forma que si quieres unir diferente información en una misma terminal tienes dos opciones:

  1. Asegurarte que cuando pongas un nuevo bloque terminal, nombres el group exactamente igual que el que quieres.
  2. Se pueden poner varias entradas a la misma terminal.

image3-1

¿Cómo iterar en los distintos resultados de una llamada?

Lo más fácil es usar un bloque For Each que una vez que hayas dado al botón start, tras unirlo a tu bloque anterior, será capaz de entender el objeto que le llega y te dejará seleccionar la variable (lista o lo que sea) sobre la que quieres iterar.

image1-2

¿Se puede conseguir un valor al azar?

Por ahora no, lo único que se puede conseguir es obtener el valor de una propiedad en concreto de los objetos recibidos de un item en específico de una lista recibida. Por ejemplo el id del objeto que venga en la posición 3. Para ello tras hacer una validación de que la lista contiene al menos 4 elementos, entonces se puede hacer un Assign Variable con ese valor:

image4-1

¿Cómo junto el resultado de varias llamadas en un objeto?

Para combinar el resultado de dos llamadas en un mismo objeto se usa el bloque Merge. Es importante poner una entrada (una de las llamadas) como Target y la otra como Source. Esto crea un objeto enorme, que puede que dificulte su lectura. Lo mejor en estos casos, es utilizar luego un bloque Assign Variable y crear un objeto más resumido que se puede unir a una terminal para mostrarlos.

No permite de un listado coger al azar uno de los registros, pero sí que permite coger el que está en la posición x y coger una de sus variables, para ello tras hacer un send Request, en lugar de hacer un forEach, hay que hacer un Assign variable y ahí te deja hacer esto, no solo en advance sino que en Basic por defecto si seleccionas una propiedad te la pone del objeto en posición 0, pero se puede modificar esa posición.

image10-2

¿Cómo hago que una llamada espere por otra?

Para esto tienen una opción pensada que es el cuadrito inferior derecho que aparece en algunos bloques, que debe enlazarse con el cuadro inferior izquierdo de otro bloque. De esta forma el segundo bloque aparece como Off y solo se pondrá en On y por tanto se activará cuando acabe el primer bloque.

image9-1

image4-2

¿Qué diferencia hay entre Assign Variable y Create Variable?

El bloque Assign Variable permite tomar propiedades que nos vengan de nuestras llamadas o de los bloques anteriores, tomar su valor y asignarlo a una variable que nosotros creamos con el nombre que queramos.

El bloque Create Variable nos permite crear una variable y asignarle un valor que queramos, pero debemos introducirlo manualmente.

Ambas variables se pueden usar juntas y enviarlas a una terminal, pero es importante saber qué Create Variable debe tener enlazada la salida de un bloque anterior a su entrada para que pueda lanzarse y generarse, sino estará en estado apagado y nunca llegará el flujo por ella.

image2-2

¿Cómo usar variables de entorno?

Se pueden crear entornos en Postman, a través de la opción para ello que tenemos en el menú izquierdo. Cada entorno nos permite almacenar todas las variables que queramos y añadir un valor inicial, que automáticamente se pondrá como valor actual. Importante cuando cambiemos el valor inicial, asegurarnos de que cambia el actual y que le hemos dado a guardar los cambios.

image14

Una vez que tenemos nuestro entorno creado, en los flujos al igual que en cualquier otra Parte de Postman, en la parte superior derecha de la aplicación tenemos una caja con una flecha para asignar el entorno que queramos. Aquí saldrá en el desplegable aquellos que hayamos creado previamente.

image16

Lo que no deja los flujos es asignarle siempre uno por defecto para que lo ponga automáticamente, sino que tendremos que ir asegurándonos cada vez que abramos un flujo de que tenemos seleccionado el que queremos.

¿Siguen mejorándolo o es una beta cercana a la versión final?

Pues según comentan en el foro están trabajando en varias funcionalidades, una de ellas es añadir más lógica y opciones al bloque de Validación para que permita realizar algunas tan importantes como comprobar las longitudes de una lista de objetos.

Automatizando Postman con Newman

Postman no permite por ahora automatizar nuestras llamadas, de forma que se vayan descargando automáticamente a disco archivos con las responses. Pero hay un modo alternativo de conseguirlo: lanzar la colección por vía de comandos a través de Newman.

¿Qué es Newman?

Newman es una aplicación que permite lanzar una colección de Postman por línea de comandos. Se puede integrar fácilmente con servidores de integración continua y sistemas de compilación y además mantiene las funcionalidades de Postman.

¿Cómo se instala?

La forma de hacerlo es muy sencilla:

1. Instalar newman tras comprobar que está instalado en el PC Node, abrir el cmd →

npm install -g newman

2. Asegurarse de que en las variables del entorno se tiene la node path:

image7-1

image12-1

3. Descargar la colección del postman y guardarla como json:

image5-2

4. En la misma carpeta que la colección crear un archivo node que recorra la colección con newman y vaya creando archivos json con las respuestas.

Un ejemplo es el archivo (busqueda_y_detalle.js), que toma dos colecciones una con llamadas a varios endpoints que devuelven listados de objetos y otra con llamadas a endpoints que devuelven detalles y otras búsquedas a partir del id de cada objeto.

Si se utiliza este archivo hay que comprobar varias cosas:

  • Que se tenga creada en la carpeta con las colecciones y este archivo node, una carpeta llamada sin y otra llamada created vacías.
  • Comprobar que las variables iniciales del archivo se corresponden con las urls de los archivos que vamos a utilizar.
  • Comprobar que los nombres de los archivos que se van a generar son los que nos interesan.
  • Comprobar que los arrays variablesNamesToReplace y valuesToReplace se corresponden con los nombres de las variables de entorno utilizadas en nuestra colección y que están en igual orden que los valores por los que deben reemplazarse.

5. Abrir la cmd a la localización donde están ambos archivos y lanzarlo con el comando "node busqueda_y_detalle.js"

image15

6. En la consola irán apareciendo las diferentes request, los errores y también un resumen final del tipo:

image11-1

7. Al finalizar se tendrá la carpeta ‘sin’ rellena de los archivos de colecciones sustituidos por aquellos con las variables necesarias en cada llamada.Y la carpeta ‘created’ con las respuestas a las llamadas generadas en formato json.

Azahara Fernández Guizán, Programadora de .NET y Angular en Sngular

Azahara Fernández Guizán

Programadora de .NET y Angular en Sngular