Pruebas de Integración de JavaScript con Docker: Nivel Avanzado
Las pruebas de integración son una etapa clave en el desarrollo de aplicaciones web modernas. Permiten verificar la interacción entre diferentes componentes del sistema: la base de datos, la caché, las API externas y la propia aplicación. Docker hace que este proceso sea predecible, aislado y reproducible. En este artículo, exploraremos técnicas avanzadas de pruebas de integración de JavaScript (Node.js) utilizando Docker.
¿Por qué Docker en las pruebas de integración?
Las pruebas de integración tradicionales enfrentan problemas como:
- Diferencias en los entornos de desarrollo, CI y producción.
- Contaminación de datos en bases de datos compartidas.
- Complejidad al ejecutar dependencias (Redis, PostgreSQL, Kafka).
Docker resuelve estos problemas proporcionando contenedores ligeros y aislados. Cada prueba puede ejecutar su propia infraestructura, destruyéndola al finalizar. Esto garantiza resultados limpios y repetibles.
Configuración del entorno de prueba con Docker Compose
Para pruebas avanzadas, utilizaremos un archivo docker-compose.yml que describe todos los servicios necesarios para las pruebas: la aplicación, la base de datos, la caché y los servidores mock.
Ejemplo de docker-compose.test.yml:
version: '3.8'services: app: build: . environment: - NODE_ENV=test - DB_HOST=postgres_test - REDIS_HOST=redis_test - MOCK_SERVER_URL=http://mock-server:8080 depends_on: - postgres_test - redis_test - mock-server command: ["npm", "run", "test:integration"]
postgres_test: image: postgres:15-alpine environment: POSTGRES_DB: testdb POSTGRES_USER: test POSTGRES_PASSWORD: test tmpfs: /var/lib/postgresql/data
redis_test: image: redis:7-alpine tmpfs: /data
mock-server: image: mockserver/mockserver:latest environment: MOCKSERVER_LOG_LEVEL: ERRORPuntos clave:
- tmpfs: los datos de la BD y Redis se almacenan en memoria RAM, acelerando las pruebas.
- mock-server: servicio aislado para simular API externas.
- NODE_ENV=test: cambia la aplicación a la configuración de prueba.
Escribiendo pruebas de integración con Testcontainers
La librería testcontainers para Node.js permite gestionar contenedores de forma programática directamente desde las pruebas. Esto brinda flexibilidad: puedes ejecutar contenedores específicos para cada conjunto de pruebas.
Instalación:
npm install --save-dev testcontainersEjemplo de prueba con PostgreSQL:
const { GenericContainer } = require('testcontainers');const { Client } = require('pg');
describe('User Repository Integration Test', () => { let container; let client;
beforeAll(async () => { // Iniciamos el contenedor de PostgreSQL container = await new GenericContainer('postgres:15-alpine') .withEnvironment({ POSTGRES_DB: 'testdb', POSTGRES_USER: 'test', POSTGRES_PASSWORD: 'test' }) .withExposedPorts(5432) .start();
// Nos conectamos al contenedor client = new Client({ host: container.getHost(), port: container.getMappedPort(5432), database: 'testdb', user: 'test', password: 'test' }); await client.connect();
// Creamos el esquema await client.query(` CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100), email VARCHAR(100) UNIQUE ) `); });
afterAll(async () => { await client.end(); await container.stop(); });
test('should insert and retrieve user', async () => { await client.query(