Pruebas de integración de JavaScript con Docker: guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Pruebas de Integración de JavaScript con Docker: Guía Completa



Las pruebas de integración son una etapa crítica en el desarrollo de JavaScript (Node.js). Verifican la interacción de tu aplicación con servicios externos: bases de datos, APIs, cachés y colas. El uso de Docker para estos fines permite aislar el entorno de prueba, garantizar su reproducibilidad y evitar problemas de "funciona en mi máquina". En este artículo, analizaremos cómo configurar pruebas de integración para aplicaciones JavaScript usando Docker, Docker Compose y frameworks de prueba populares.



¿Por qué necesitas Docker para las pruebas de integración?



Las pruebas de integración tradicionales a menudo enfrentan problemas: las dependencias pueden diferir en diferentes máquinas de desarrolladores, las bases de datos pueden estar en diferentes estados y la configuración del entorno consume horas. Docker resuelve estos problemas proporcionando:



  • Aislamiento: cada ejecución de prueba ocurre en un contenedor limpio.
  • Reproducibilidad: el mismo entorno para todos los desarrolladores y CI/CD.
  • Velocidad: los contenedores se inician en segundos, no en minutos.
  • Gestión de dependencias: es fácil levantar PostgreSQL, Redis, RabbitMQ y otros servicios.


Configuración del entorno de prueba con Docker Compose



Empecemos creando el proyecto. Supongamos que tenemos una aplicación simple de Node.js que guarda datos en PostgreSQL. Crearemos el archivo docker-compose.test.yml:



version: '3.8'

services: test-runner: build: context: . dockerfile: Dockerfile.test depends_on: - db - redis environment: - NODE_ENV=test - DATABASE_URL=postgresql://testuser:testpass@db:5432/testdb - REDIS_URL=redis://redis:6379 volumes: - ./coverage:/app/coverage

db: image: postgres:15-alpine environment: POSTGRES_USER: testuser POSTGRES_PASSWORD: testpass POSTGRES_DB: testdb ports: - "5432" tmpfs: - /var/lib/postgresql/data

redis: image: redis:7-alpine ports: - "6379"


Observa el tmpfs para PostgreSQL — esto garantiza que después de completar las pruebas los datos no se guarden, y cada ejecución comenzará con una base de datos limpia.



Dockerfile para pruebas



Crearemos un Dockerfile.test optimizado para pruebas, no para producción:



FROM node:18-alpine

WORKDIR /app

# Copiamos solo package.json para cachear la capa de dependenciasCOPY package*.json ./RUN npm ci --only=production && npm ci --only=dev

# Copiamos el código fuenteCOPY . .

# Instalamos wait-for-it para esperar que los servicios estén listosADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /wait-for-it.shRUN chmod +x /wait-for-it.sh

CMD ["sh", "-c", "/wait-for-it.sh db:5432 -- /wait-for-it.sh redis:6379 -- npm test"]


Escribiendo pruebas de integración en JavaScript



Ahora escribiremos las pruebas. Usaremos Jest y Supertest para probar la API. Crearemos el archivo tests/integration/user.test.js:



const request = require('supertest');const { app } = require('../src/app');const { Pool } = require('pg');

describe('User API Integration Tests', () => { let pool;

beforeAll(async () => { // Creamos un pool de conexiones a la BD de prueba pool = new Pool({ connectionString: process.env.DATABASE_URL });

// Ejecutamos migraciones antes de las pruebas const migrationSQL = ` CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW() ); `; await pool.query(migrationSQL); });

afterAll(as

Blogs

Book Recommendations