Por qué Docker para QA
Docker resuelve uno de los problemas más antiguos de QA: la inconsistencia de entornos. ¿Cuántas veces has escuchado “funciona en mi máquina” al reportar un bug? Docker elimina esto empaquetando aplicaciones y sus dependencias en contenedores que se ejecutan idénticamente en todas partes.
Para ingenieros QA, Docker proporciona:
- Entornos de test consistentes entre máquinas locales, servidores CI y staging
- Ejecución de tests aislada — los tests no interfieren entre sí ni con el sistema host
- Bugs reproducibles — si falla en un contenedor, falla de la misma manera cada vez
- Setup rápido de entornos — levanta un entorno de test completo en segundos, no horas
Conceptos Fundamentales de Docker
Imágenes
Una imagen Docker es un paquete ligero e independiente que incluye todo lo necesario para ejecutar un software: código, runtime, herramientas del sistema, librerías y configuraciones.
Piensa en una imagen como una instantánea de una máquina configurada. Es de solo lectura e inmutable.
# Descargar una imagen de Docker Hub
docker pull node:20
# Listar imágenes locales
docker images
# Descargar una imagen específica de testing
docker pull mcr.microsoft.com/playwright:v1.40.0-focal
Contenedores
Un contenedor es una instancia en ejecución de una imagen. Está aislado del sistema host y otros contenedores, pero puede exponer puertos y montar volúmenes para comunicación.
# Ejecutar un contenedor
docker run -it node:20 bash
# Ejecutar en segundo plano (modo detached)
docker run -d -p 3000:3000 --name my-app my-app-image
# Listar contenedores en ejecución
docker ps
# Detener un contenedor
docker stop my-app
# Ver logs del contenedor
docker logs my-app
Volúmenes
Los volúmenes persisten datos más allá del ciclo de vida de un contenedor. Para QA, son esenciales para guardar reportes de tests y compartir datos de test:
# Montar un directorio local en un contenedor
docker run -v $(pwd)/test-results:/app/test-results playwright-tests
# Crear un volumen con nombre
docker volume create test-data
docker run -v test-data:/data my-test-image
Redes
Las redes Docker permiten que los contenedores se comuniquen entre sí:
# Crear una red
docker network create test-network
# Ejecutar contenedores en la misma red
docker run -d --network test-network --name db postgres:15
docker run -d --network test-network --name app my-app-image
# Los contenedores pueden alcanzarse por nombre (db, app)
Construyendo Imágenes de Test con Dockerfile
Un Dockerfile define cómo construir una imagen. Aquí hay un Dockerfile para un proyecto de automatización de tests:
FROM mcr.microsoft.com/playwright:v1.40.0-focal
WORKDIR /app
# Copiar archivos de dependencias primero (para eficiencia del caché)
COPY package.json package-lock.json ./
# Instalar dependencias
RUN npm ci
# Copiar archivos de test
COPY . .
# Comando por defecto: ejecutar todos los tests
CMD ["npx", "playwright", "test"]
Mejores Prácticas de Dockerfile para QA
El orden de las capas importa. Docker cachea cada capa. Pon las cosas que cambian raramente (imagen base, dependencias) primero, y las que cambian frecuentemente (código de test) al final:
FROM node:20-slim
# Dependencias del sistema (raramente cambian)
RUN apt-get update && apt-get install -y \
chromium \
&& rm -rf /var/lib/apt/lists/*
# Dependencias de la aplicación (cambian cuando package.json cambia)
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
# Código de test (cambia frecuentemente)
COPY . .
CMD ["npm", "test"]
Usa .dockerignore para excluir archivos innecesarios:
node_modules
.git
test-results
playwright-report
*.md
Construyendo y Ejecutando
# Construir la imagen
docker build -t my-tests .
# Ejecutar tests
docker run my-tests
# Ejecutar archivo de test específico
docker run my-tests npx playwright test tests/login.spec.ts
# Ejecutar con variables de entorno
docker run -e BASE_URL=https://staging.example.com my-tests
# Guardar resultados de test en el host
docker run -v $(pwd)/results:/app/test-results my-tests
Depurando Aplicaciones Containerizadas
Los ingenieros QA frecuentemente necesitan depurar aplicaciones ejecutándose en Docker:
Inspeccionando Contenedores en Ejecución
# Ejecutar un shell dentro de un contenedor en ejecución
docker exec -it container-name bash
# Ver logs en tiempo real
docker logs -f container-name
# Inspeccionar configuración del contenedor
docker inspect container-name
# Verificar uso de recursos
docker stats container-name
Ejercicio: Containeriza una Suite de Tests
Dado un proyecto de tests Node.js con:
- Tests unitarios (Jest)
- Tests E2E (Playwright)
- Tests de API (contra una API REST respaldada por PostgreSQL)
Crea un Dockerfile que pueda ejecutar los tres tipos de tests.
Solución
FROM mcr.microsoft.com/playwright:v1.40.0-focal
# Instalar cliente PostgreSQL para setup de BD
RUN apt-get update && apt-get install -y \
postgresql-client \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Dependencias (capa cacheada)
COPY package.json package-lock.json ./
RUN npm ci
# Configuración de tests
COPY playwright.config.ts jest.config.ts tsconfig.json ./
# Archivos de test
COPY tests/ tests/
COPY src/ src/
# Valores de entorno por defecto
ENV NODE_ENV=test
ENV CI=true
# Por defecto: ejecutar todos los tests
CMD ["npm", "run", "test:all"]
Ejecutando diferentes tipos de tests:
# Todos los tests
docker run my-tests
# Solo tests unitarios
docker run my-tests npm run test:unit
# Solo tests E2E
docker run my-tests npx playwright test
# Tests de API con base de datos
docker run --network test-net \
-e DATABASE_URL=postgresql://test:test@db:5432/testdb \
my-tests npm run test:api
Comandos Docker que los Ingenieros QA Usan a Diario
| Comando | Propósito |
|---|---|
docker run | Crear e iniciar un contenedor |
docker ps | Listar contenedores en ejecución |
docker logs | Ver salida del contenedor |
docker exec -it | Ejecutar comandos dentro de un contenedor |
docker build | Construir una imagen desde Dockerfile |
docker stop / rm | Detener y eliminar contenedores |
docker images | Listar imágenes locales |
docker pull | Descargar una imagen |
docker cp | Copiar archivos entre host y contenedor |
docker system prune | Limpiar recursos no utilizados |
Imágenes Docker Comunes para QA
| Imagen | Caso de Uso |
|---|---|
mcr.microsoft.com/playwright | Testing E2E con Playwright y navegadores |
cypress/included | Testing E2E con Cypress |
selenium/standalone-chrome | Selenium con Chrome |
selenium/hub + selenium/node-* | Selenium Grid |
postgres | PostgreSQL para tests de integración |
redis | Redis para tests de caché |
localstack/localstack | Emulación de servicios AWS |
mailhog/mailhog | Testing de email |
Conclusiones Clave
- Docker asegura consistencia de entornos — la misma imagen se ejecuta idénticamente en tu laptop y en CI
- Las imágenes son planos, los contenedores son instancias — una imagen puede generar muchos contenedores
- Ordena tu Dockerfile eficientemente — dependencias primero, código de test al final, para caché óptimo
- Usa volúmenes para artefactos de test — monta directorios del host para extraer reportes y capturas
- Aprende comandos básicos de depuración —
docker exec,docker logsydocker inspectte ahorrarán horas