¿Qué aprenderá?

En este tutorial aprenderá a crear las pruebas de un API usando Postman.

¿Qué construirá?

Las pruebas del API usando Postman.

¿Qué necesita?

En particular Ud. debe:

  1. Tener un equipo con la herramienta Postman instalada.
  2. Haber documentado el diseño del API y tener el diseño en Postman.
  3. Haber implementado la persistencia, la lógica, las pruebas de la lógica y los controladores.
  4. Tener el API ejecutándose

Las colecciones construidas para las prueba del API de este tutorial pueden ser consultadas en este enlace:

https://github.com/MISW4403-Diseno-y-construccion-de-APIs/MISW4403_202214_Controladores/tree/master/collections

Para realizar las pruebas el API debe estar en ejecución. Recuerde que esto lo puede hacer desde una terminal con el comando npm run start:dev.

Crear un museo

Iniciaremos con la prueba para crear un museo. Cuando se realizó la documentacioń del diseño del API en Postman, en el workspace en la sección Collections debió quedar la colección documentada junto con los requests. Así que aprovecharemos esa colección y las peticiones para la prueba del API.

Iniciaremos agregando un nuevo museo. Para esto abrimos la petición Add a museum. Vamos a la sección Tests y agregamos lo siguiente:

var data = pm.response.json()
pm.globals.set("museum_id", data.id);

pm.test("Status code is 201", function () {
   pm.response.to.have.status(201);
});

En esta prueba estamos guardando la respuesta que envía el API en la variable data. Luego seteamos la variable global museum_id con el valor que haya en el atributo id de la respuesta, y esperamos que el código HTTP retornado sea el 201.

Nos aseguramos que en el body de la petición estén los datos necesarios para crear el museo.

Importante: si ha habido alguna actualización en la implementación, esos cambios deben reflejarse también en la documentación para que las peticiones se ejecuten correctamente.

Ahora hacemos click en el botón Send que enviará la petición al API y debemos obtener la siguiente respuesta.

Vemos que la petición se ejecutó correctamente ya que obtuvimos el código 201. También observamos que el API retornó el nuevo museo creado junto con el id asignado por la base de datos. También observamos que las pruebas se ejecutaron bien al ver el resultado en la pestaña Test Results (1/1):

Obtener todos los museos

Abrimos la petición Get all museums. El siguiente será el contenido de la prueba:

pm.test('Number of museums > ' + 0, function () {
   var data = pm.response.json()
   pm.expect(data.length).to.greaterThan(0)
});

pm.test("Status code is 200", function () {
   pm.response.to.have.status(200);
});

Luego de haber agregado un museo, esperamos que el número de museos sea mayor que cero y que el código de respuesta del API sea 200.

Ejecutamos la prueba y esperamos que se obtenga la lista de museos y que las pruebas pasen correctamente:

Obtener un museo

Abrimos la petición Get one museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 200", function () {
   pm.response.to.have.status(200);
});

En la URL de la petición tenemos la variable {{museum_id}}. Recuerde que esta variable fue seteada cuando se creó un nuevo museo. Entonces esperamos que ese museo exista en la base de datos y que el código de respuesta del API sea 200.

Obtener un museo que no existe

Abrimos la petición Get an invalid museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 404", function () {
   pm.response.to.have.status(404);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The museum with the given id was not found");
});

Esperamos que el código de respuesta del API sea 404 y que obtengamos el mensaje descriptivo del error.

Actualizar un museo

Abrimos la petición Update a museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 200", function () {
   pm.response.to.have.status(200);
});

Esperamos que el código de respuesta del API sea 200.

Actualizar un museo que no existe

Abrimos la petición Update an invalid museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 404", function () {
   pm.response.to.have.status(404);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The museum with the given id was not found");
});

Esperamos que el código de respuesta del API sea 404 y que obtengamos el mensaje descriptivo del error.

Borrar un museo

Abrimos la petición Delete a museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 204", function () {
   pm.response.to.have.status(204);
});

Esperamos que el código de respuesta del API sea 204.

Borrar un museo que no existe

Abrimos la petición Delete an invalid museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 404", function () {
   pm.response.to.have.status(404);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The museum with the given id was not found");
});

Esperamos que el código de respuesta del API sea 404 junto con el mensaje descriptivo del error.

En la documentación del API también se incluyeron las colecciones para la asociación entre los museos y las obras de arte (Museums-Artworks).

Para esta prueba debemos iniciar creando un museo. Esta petición ya la creamos anteriormente; así que solo debemos duplicarla y arrastrarla a la nueva colección Museums-Artworks.

Luego debemos crear dos obras de arte. Esto lo hacemos porque la primera obra de arte se asociará al museo y la segunda obra de arte servirá para la actualización de las obras de ese museo.

El proceso de crear una obra de arte (persistencia, servicio y controlador) no se incluye en este tutorial por simplicidad sin embargo en el repositorio que acompaña a este tutorial se puede consultar:

https://github.com/MISW4403-Diseno-y-construccion-de-APIs/MISW4403_202214_Controladores

Simplemente asumiremos que los ids de las obras de arte quedarán almacenados en las variables {{artwork_id_1}} y {{artwork_id_2}}.

Agregar una obra a un museo

Abrimos la petición Add an artwork to a museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 201", function () {
   pm.response.to.have.status(201);
});

Esperamos que el código de respuesta del API sea 201.

Agregar una obra que no existe a un museo

Abrimos la petición Add an invalid artwork to a museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 404", function () {
   pm.response.to.have.status(404);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The artwork with the given id was not found");
});

Esperamos que el código de respuesta del API sea 404 junto con el mensaje de error.

Agregar una obra a un museo que no existe

Abrimos la petición Add an artwork to an invalid museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 404", function () {
   pm.response.to.have.status(404);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The museum with the given id was not found");
});

Esperamos que el código de respuesta del API sea 404 junto con el mensaje de error.

Obtener una obra de un museo

Abrimos la petición Get an artwork of a museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 200", function () {
   pm.response.to.have.status(200);
});

Esperamos que el código de respuesta del API sea 200.

Obtener una obra que no existe de un museo

Abrimos la petición Get an invalid artwork of a museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 404", function () {
   pm.response.to.have.status(404);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The artwork with the given id was not found");
});

Esperamos que el código de respuesta del API sea 404 junto con el mensaje de error.

Obtener una obra de un museo que no existe

Abrimos la petición Get an artwork of an invalid museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 404", function () {
   pm.response.to.have.status(404);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The museum with the given id was not found");
});

Esperamos que el código de respuesta del API sea 404 junto con el mensaje de error.

Obtener una obra que no está asociada a un museo

Abrimos la petición Get an artwork non-associated to a museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 412", function () {
   pm.response.to.have.status(412);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The artwork with the given id is not associated to the museum");
});

Esperamos que el código de respuesta del API sea 412 junto con el mensaje de error.

Obtener todas las obras de un museo

Abrimos la petición Get all artwork of a museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 200", function () {
   pm.response.to.have.status(200);
});

Esperamos que el código de respuesta del API sea 200.

Obtener todas las obras de un museo que no existe

Abrimos la petición Get all artwork of an invalid museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 404", function () {
   pm.response.to.have.status(404);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The museum with the given id was not found");
});

Esperamos que el código de respuesta del API sea 404 junto con el mensaje de error.

Actualizar las obras de un museo

Abrimos la petición Update artworks of a museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 201", function () {
   pm.response.to.have.status(200);
});

Esperamos que el código de respuesta del API sea 200.

Actualizar las obras que no existen de un museo

Abrimos la petición Update invalid artworks of a museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 404", function () {
   pm.response.to.have.status(404);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The artwork with the given id was not found");
});

Esperamos que el código de respuesta del API sea 404 junto con el mensaje de error.

Actualizar las obras de un museo que no existe

Abrimos la petición Update artworks of an invalid museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 404", function () {
   pm.response.to.have.status(404);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The museum with the given id was not found");
});

Esperamos que el código de respuesta del API sea 404 junto con el mensaje de error.

Borrar una obra de un museo

Abrimos la petición Delete an artwork of a museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 204", function () {
   pm.response.to.have.status(204);
});

Esperamos que el código de respuesta del API sea 204.

Borrar una obra de un museo que no existe

Abrimos la petición Delete an artwork of an invalid museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 404", function () {
   pm.response.to.have.status(404);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The museum with the given id was not found");
});

Esperamos que el código de respuesta del API sea 404 junto con el mensaje de error.

Borrar una obra que no existe de un museo

Abrimos la petición Delete an invalid artwork of a museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 404", function () {
   pm.response.to.have.status(404);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The artwork with the given id was not found");
});

Esperamos que el código de respuesta del API sea 404 junto con el mensaje de error.

Borrar una obra que no está asociada a un museo

Abrimos la petición Delete an artwork non-associated to a museum. El siguiente será el contenido de la prueba:

pm.test("Status code is 412", function () {
   pm.response.to.have.status(412);
});

pm.test("Get expected error message", function () {
   var data = pm.response.json();
   pm.expect(data.message).to.eql("The artwork with the given id is not associated to the museum");
});

Esperamos que el código de respuesta del API sea 412 junto con el mensaje de error.

La colección se puede completar con las operaciones para borrar las dos obras de arte creadas inicialmente junto con el museo.

Una vez que todas las pruebas se han especificado y estás se han ejecutado correctamente es el momento de exportar las colecciones. Una colección se representa como un archivo JSON que se puede guardar en el repositorio del proyecto.

Seleccione una colección, haga clic derecho > Export. Escoja la opción Collection v2.1 y haga clic en el botón Export.

Guarde la colección en la carpeta collections del repositorio.