Pruebas End-to-End con Supertest y Node.js

Clase 5 de 25Curso de End to End Testing para APIs REST con Node.js

Resumen

¿Cómo escribir tu primera prueba en Twen?

Escribir pruebas para aplicaciones web es fundamental para garantizar que tu software funcione correctamente en diversos casos. Un excelente ejemplo es el uso de Twen para escribir pruebas que simulan solicitudes HTTP hacia nuestro servidor Node.js, similar a lo que hacemos con herramientas como Postman o Insomnia. La diferencia es que, con Twen, podemos automatizar y profesionalizar este proceso.

¿Qué haría Insomnia o Postman, pero en una forma automática?

Los programas como Insomnia o Postman te permiten realizar solicitudes HTTP manuales a un servidor para obtener respuestas. Sin embargo, estas no son pruebas como tal, sino simplemente simulaciones de solicitudes. Twen, por su parte, va un paso más allá. Automáticamente envía múltiples pruebas a un solo endpoint para verificar aspectos como el código de estado de la respuesta, la validación de datos y la conectividad al servidor. Así, podemos asegurar que la aplicación funciona correctamente bajo diferentes escenarios.

¿Qué herramienta usar para las pruebas end-to-end en Node?

Para llevar a cabo pruebas similares de manera automatizada en Node.js, utilizamos Supertest. Esta herramienta es ideal para emular solicitudes HTTP y verificar sus respuestas de forma programática. Al igual que Yes, Supertest se instala como una dependencia de desarrollo.

Instalación de Supertest

Abre tu terminal y procede a instalar Supertest mediante el siguiente comando, asegurándote de estar en el entorno adecuado de trabajo:

npm install --save-dev supertest

Con la herramienta instalada, podemos proceder a crear y probar endpoints en nuestra aplicación Express.

¿Cómo crear un servidor Express básico con un endpoint?

Primero, configuraremos una aplicación Express simple que nos servirá de base para nuestras pruebas:

const express = require('express');
const app = express();

app.get('/hello', (req, res) => {
  res.status(200).json({ name: 'Nico' });
});

app.listen(9000, () => {
  console.log('Server is running on port 9000');
});

Este código crea un pequeño servidor Express con un endpoint llamado /hello, que responde con un JSON que contiene un nombre. Ahora, debemos preparar las pruebas para este servidor.

¿Cómo probar un endpoint con Supertest?

Supertest nos permite definir nuestras pruebas de la siguiente manera:

const request = require('supertest');

describe('Pruebas para el endpoint /hello', () => {
  it('Debe responder con un status 200 y un JSON esperado', async () => {
    const response = await request(app).get('/hello');
    expect(response.statusCode).toEqual(200);
    expect(response.body.name).toEqual('Nico');
    expect(response.headers['content-type']).toMatch(/json/);
  });
});

Explicación del código de prueba

  1. Solicitudes (requests): Utilizamos request(app).get('/hello') para enviar una solicitud GET al endpoint /hello.

  2. Comprobaciones (expectations):

    • Verificamos que el código de estado sea 200.
    • Comprobamos que el cuerpo de la respuesta contenga el nombre 'Nico'.
    • Confirmamos que el tipo de contenido devuelto es JSON.
  3. Corrida de pruebas: Para ejecutar estas pruebas, utilizamos el comando para nuestro entorno de pruebas, que generalmente involucra una herramienta de testing como jest.

npx jest

Ejecutar el comando anterior validará que todas las pruebas definidas en el archivo se realicen correctamente.

¿Qué hacer si las pruebas fallan o hay problemas asíncronos?

Durante la ejecución de pruebas, podrías encontrarte con errores si la respuesta del servidor no coincide con lo esperado. Justamente, si solicitamos un código de estado 200 pero obtenemos un 201, por ejemplo, la prueba fallará. Para resolver esto:

  • Verifica el código de estado esperado y de la aplicación.
  • Analiza las respuestas del servidor para asegurarte que coincidan con lo especificado en el test.

Además, es común encontrar advertencias sobre procesos asíncronos no finalizados. Este problema surge cuando el servidor Express no se detiene después de las pruebas. Puedes cerrar estos procesos al finalizar todas las pruebas o modificando la configuración de tus herramientas de testing.

Las pruebas automatizadas son esenciales para el desarrollo moderno, así que ¡no te detengas aquí y sigue explorando herramientas y metodologías que aseguren la calidad de tu software!