Pruebas y Despliegue del Proyecto

Video
25 min~5 min lectura

Reproductor de video

Concepto clave

Las pruebas y el despliegue son la puerta de entrada a producción para cualquier aplicación backend. Imagina que estás construyendo un puente: el esquema y las migraciones son los planos, las queries son los materiales, pero las pruebas son los ensayos de carga que verifican que todo funcione bajo presión real. Sin este paso, estás lanzando al vacío.

En el contexto de Prisma ORM, las pruebas no solo validan la lógica de negocio, sino también la integración con la base de datos y el rendimiento de las queries. El despliegue, por su parte, implica configurar entornos, gestionar conexiones de base de datos y asegurar que las migraciones se ejecuten de forma segura y automática. Juntos, forman un ciclo que garantiza estabilidad y confiabilidad.

Cómo funciona en la práctica

Vamos a implementar un flujo completo de pruebas y despliegue para una API con Prisma. Primero, configuraremos un entorno de pruebas aislado usando una base de datos en memoria o contenedores Docker. Luego, escribiremos pruebas de integración que simulen operaciones reales. Finalmente, automatizaremos el despliegue con scripts que manejen migraciones y variables de entorno.

Paso a paso: 1) Configurar Jest o Vitest con Prisma Client mockeado para pruebas unitarias. 2) Usar Prisma Test Environment para bases de datos aisladas. 3) Escribir pruebas que cubran CRUD, relaciones y transacciones. 4) Crear scripts de despliegue que ejecuten migraciones y verifiquen la conexión. 5) Integrar con CI/CD como GitHub Actions o GitLab CI.

Código en acción

Configuración básica de pruebas con Jest y Prisma:

// jest.config.js
module.exports = {
  testEnvironment: 'node',
  setupFilesAfterEnv: ['/jest.setup.js'],
};

// jest.setup.js
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();

beforeAll(async () => {
  // Conectar a base de datos de pruebas
  await prisma.$connect();
});

afterAll(async () => {
  // Limpiar y desconectar
  await prisma.$disconnect();
});

Ejemplo de prueba de integración para un endpoint de usuarios:

// tests/user.test.js
describe('User API', () => {
  it('debe crear un usuario y retornarlo con id', async () => {
    const userData = {
      name: 'Juan Pérez',
      email: '[email protected]',
    };

    // Antes: query simple pero ineficiente
    // const user = await prisma.user.create({ data: userData });

    // Después: query optimizada con select explícito
    const user = await prisma.user.create({
      data: userData,
      select: { id: true, name: true, email: true },
    });

    expect(user).toHaveProperty('id');
    expect(user.name).toBe(userData.name);
    expect(user.email).toBe(userData.email);
  });
});

Errores comunes

  • No aislar la base de datos de pruebas: Usar la misma base de datos de desarrollo o producción causa contaminación de datos. Solución: Configurar un entorno separado con variables de entorno o usar SQLite en memoria.
  • Olvidar limpiar datos entre pruebas: Las pruebas se vuelven interdependientes y frágiles. Solución: Usar hooks como beforeEach para truncar tablas o reiniciar la base de datos.
  • No probar transacciones: Las operaciones complejas con múltiples queries pueden fallar en producción. Solución: Escribir pruebas que simulen rollbacks y commits con Prisma $transaction.
  • Desplegar sin verificar migraciones: Ejecutar migraciones automáticamente sin backup puede causar pérdida de datos. Solución: Usar prisma migrate deploy con confirmación manual en producción.
  • Ignorar el rendimiento en pruebas: Las queries lentas no se detectan hasta producción. Solución: Incluir pruebas de carga con herramientas como k6 o medir tiempos de respuesta.

Checklist de dominio

  1. ¿Configuraste un entorno de pruebas aislado con su propia base de datos?
  2. ¿Escribiste pruebas de integración que cubran al menos el 80% de las operaciones CRUD?
  3. ¿Incluiste pruebas para transacciones y manejo de errores de base de datos?
  4. ¿Automatizaste la ejecución de migraciones en el proceso de despliegue?
  5. ¿Verificaste que las variables de entorno sean seguras y no estén hardcodeadas?
  6. ¿Probaste la conexión a la base de datos en el entorno de producción antes del lanzamiento?
  7. ¿Documentaste los pasos de despliegue y rollback en caso de fallos?

Implementar un pipeline de pruebas y despliegue para una API con Prisma

Sigue estos pasos para crear un sistema completo de pruebas y despliegue:

  1. Clona el repositorio base de la API (disponible en el enlace del curso) y examina la estructura existente.
  2. Configura un entorno de pruebas usando Jest y una base de datos SQLite en memoria. Asegúrate de que las variables de entorno apunten a esta base de datos solo durante las pruebas.
  3. Escribe al menos 5 pruebas de integración que cubran: creación de un recurso, lectura con filtros, actualización, eliminación y una transacción que involucre múltiples modelos.
  4. Crea un script de despliegue (deploy.sh o deploy.js) que: a) Verifique la conexión a la base de datos de producción, b) Ejecute las migraciones pendientes con confirmación manual, c) Reinicie el servidor de aplicación.
  5. Integra el pipeline con GitHub Actions: configura un workflow que ejecute las pruebas en cada push y despliegue automáticamente en la rama main después de aprobación.
Pistas
  • Usa el paquete @prisma/client para mockear Prisma en pruebas unitarias y evita tocar la base de datos real.
  • En el script de despliegue, incluye un paso de rollback que pueda revertir la última migración en caso de error.
  • Configura secrets en GitHub Actions para las variables de entorno de producción y nunca las commits al repositorio.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.