Postman, pre-request scripts y test scripts para simplificar llamados a nuestras APIs

Postman, pre-request scripts y test scripts para simplificar llamados a nuestras APIs

En algunos casos al momento de verificar la funcionalidad de nuestras APIs nos encontramos nuevamente con tareas que se vuelven repetitivas y que se deben ejecutar de manera secuencial para poder llegar a un caso de prueba.

Para nuestro ejemplo vamos a usar un servicio que para cualquier llamado a una de sus acciones requiere que el usuario o cliente previamente se encuentre autenticado.

En este ejemplo, el usuario debe seguir los siguientes pasos para llegar a la prueba de un servicio especifico, como obtener una lista de permisos, usuarios etc:

  • invocar el servicio de login

  • Si el usuario se autentica de forma correcta, debe almacenar el token jwt

  • Para invocar el servicio Prueba debe agregar un header de autenticación con el token generado en el paso anterior.

Para conseguir esto generalmente realizamos las siguientes tareas en postman

  • Abrir postman ;)
  • Invocar el servicio login
  • Verificar la respuesta en el editor

  • Hacer copy paste del token retornado por el servicio de login en notepad o algun lado para no perderlo

  • Crear un nuevo request en postman agregando un nuevo header, pegando el token almacenado previamente en algún archivo

Esta tarea se debe realizar por cada servicio que requiera tener autenticación, lo cual hace aburrido y tedioso el proceso de pruebas una vez terminado el desarrollo de un endpoint.

Afortunadamente para nosotros en postman existe una forma de simplificar este tipo de tareas, agregando variables de entorno y scripts para almacenar y procesar la información.

Para esto vamos a crear un nuevo entorno "environment"

  • Crear y seleccionar nuevo entorno
  • hacemos clic en new->Environment
  • Agregamos un entorno llamado Test
  • Agregamos para nuestro ejemplo una nueva variable llamada test

image.png

Debemos capturar la respuesta del servidor, para esto en la sección test de postman agregamos el siguiente código.

const user = pm.response.json();
/*creamos una prueba que verifique si existe una propiedad en la respuesta que se llame token
  aqui puedes verificar cualquier propiedad en la respuesta del servidor*/
pm.test("Existen Propiedades", function () {
    pm.expect(user).to.have.property('token');
});

/*Si la prueba fue satisfactoria asignamos a la variable global Test el valor retornado por el servicio login*/
if (pm.test("Existen Propiedades")) {
    pm.globals.set('token', user.token);
}

/*validamos que el toquen haya sido almacenado*/
pm.test("Validar Token Almacenado", function() {
    var token = pm.globals.get('token');
    pm.expect(token).to.eql(user.token);
});

Al ejecutar nuevamente el request, postman almacenará el token si lo encuentra en el response del llamado.

El siguiente paso es agregar el header a cada llamado que realicemos desde postman, para nuestro caso estamos utilizando un bearer token. En type seleccionamos bearer token, y en el campo valor ingresamos {{token}} este nombre corresponde al nombre de la variable global que sera seteada cada vez que invoquemos el servicio login.

image.png

Al verificar el header vemos que el valor ha sido seteado por el metodo login.

image.png

Desde este punto ya hemos simplificado el numero de tareas para ejecutar nuestro servicio de pruebas, si el token expira solo ejecutamos el metodo login, de ahi en adelante cada request que requiera autenticación usara el token de la variable de entorno configurada.

También podemos simplificar aun mas nuestro trabajo, realizando o configurando un script que se ejecute antes de realizar el llamado a nuestro servicio de prueba, esto lo podemos realizar usando un pre-request script, de la siguiente forma:

//armamos Objeto para realizar el llamado al login antes de ejecutar la prueba
const   loginRequest = {
  url: 'http://localhost:5000/api/user/login',
  method: 'POST',
  header: 'Content-Type:application/json',
  body: {
    mode: 'application/json',
    raw: JSON.stringify(
        {
            "email": "usuario@dominio.com",
            "password": "passw$rd"
        })
  }
};

//ejecutamos script para realizar llamado al servicio de login 
  pm.sendRequest(loginRequest, function (err, res) {   
        if (err === null) {

            var responseJson = res.json();
            //almacenamos el token devuelto por el servicio login
            pm.environment.set('token', responseJson.token)   
        }
    });

Si observamos en el pre-request estamos ejecutando el servicio login, y almacenando el token devuelto por este en nuestra variable global, el resto continua igual.

Este codigo lo ponemos en el tab pre-request script de postman.

image.png