Pruebas End-to-End con Base de Datos en API REST

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

Resumen

¿Cómo realizar pruebas a unget de manera efectiva?

Para asegurar que tu API funcione correctamente, es crucial realizar pruebas exhaustivas que no solo validen el código, sino también la conexión con la base de datos, garantizando su correcta integridad. Al trabajar con pruebas en 2N, es recomendable conectar directamente con la base de datos, en lugar de utilizar estrategias de mocking. Esto permite verificar que la API devuelve la información almacenada correctamente sin emular el comportamiento del sistema.

¿Cómo iniciar las pruebas?

Antes de realizar pruebas, debes garantizar que los servicios necesarios están correctamente ejecutándose, principalmente la base de datos, que en este caso es PostgreSQL. Asegúrate de encender Docker con el comando docker-compose up -d postgres para levantar la base de datos y confirmar su funcionamiento con docker-compose ps.

¿Cómo desarrollar una prueba básica de unget?

Al crear una prueba para obtener información de un usuario por ID, debes seguir estos pasos básicos:

  1. Configuración inicial: Define que tu función es asíncrona usando await para esperar la respuesta del servidor.
  2. Crear la solicitud: Utiliza el endpoint adecuado e incluye el ID del usuario deseado en la ruta. Asegúrate de que la URL sea correcta, por ejemplo /api/v1/users/1.
  3. Verificación básica: Al recibir la respuesta, verifica que el status code sea 200, indicando éxito en la consulta.
async function requestUser() {
  const inputID = 1; // ID del usuario
  const response = await apget(`/api/v1/users/${inputID}`);
  expect(response.statusCode).toBe(200);
}

¿Qué hacer si la prueba falla?

Es posible recibir errores indicativos como un 404 (not found) o un 500 (internal server error). Estos suelen deberse a una URI incorrecta o a un problema con el servidor, como la no ejecución del contenedor de la base de datos. Siempre verifica que los paths en las pruebas correspondan al path correcto de la API.

¿Cómo mejorar la prueba para incluir validaciones de datos?

Una buena prueba no solo verifica que el status code sea 200, sino también la validez y precisión de los datos obtenidos respecto a lo esperado en la base de datos:

  • Obtener datos del cuerpo de la respuesta: Comprueba que la información del usuario coincide con lo que hay en la base de datos usando métodos de consulta directos, como findByPrimaryKey.
  • Comparación de datos: Asegúrate de que el ID y otros atributos importantes, como el email, coincidan.
async function validateUserData() {
  const userInDB = await models.User.findByPrimaryKey(1);
  const response = await apget(`/api/v1/users/${userInDB.id}`);

  expect(response.body.id).toBe(userInDB.id);
  expect(response.body.email).toBe(userInDB.email);
}

¿Cómo evitar falsos positivos?

Es crucial que las pruebas reflejen una integración auténtica y verídica con la base de datos. Evita modificar directamente el código para retornar resultados esperados sin consultas reales. Asegúrate de que el flujo desde la API hasta la base de datos se mantenga íntegro y confiable.

¿Qué hacer frente a problemas de concurrencia en las pruebas?

Cuando ejecutamos pruebas en paralelo con herramientas como Jest, problemas de colisión de puertos pueden surgir debido a la simultaneidad. Resuélvelo ejecutando las pruebas de manera secuencial con el comando --runInBand para evitar problemas de uso del mismo puerto por distintos tests.

Reflexiones finales

Realizar pruebas integrales utilizando la base de datos asegura que, desde el cliente hasta la información almacenada, todo el sistema funciona coherentemente. Recuerda siempre validar tanto el estado de la respuesta como el contenido de los datos para garantizar que las pruebas son robustas y no solo trivialmente exitosas. ¡Anímate a integrar estas prácticas y lleva tus proyectos al siguiente nivel!