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

ComandoPropósito
docker runCrear e iniciar un contenedor
docker psListar contenedores en ejecución
docker logsVer salida del contenedor
docker exec -itEjecutar comandos dentro de un contenedor
docker buildConstruir una imagen desde Dockerfile
docker stop / rmDetener y eliminar contenedores
docker imagesListar imágenes locales
docker pullDescargar una imagen
docker cpCopiar archivos entre host y contenedor
docker system pruneLimpiar recursos no utilizados

Imágenes Docker Comunes para QA

ImagenCaso de Uso
mcr.microsoft.com/playwrightTesting E2E con Playwright y navegadores
cypress/includedTesting E2E con Cypress
selenium/standalone-chromeSelenium con Chrome
selenium/hub + selenium/node-*Selenium Grid
postgresPostgreSQL para tests de integración
redisRedis para tests de caché
localstack/localstackEmulación de servicios AWS
mailhog/mailhogTesting de email

Conclusiones Clave

  1. Docker asegura consistencia de entornos — la misma imagen se ejecuta idénticamente en tu laptop y en CI
  2. Las imágenes son planos, los contenedores son instancias — una imagen puede generar muchos contenedores
  3. Ordena tu Dockerfile eficientemente — dependencias primero, código de test al final, para caché óptimo
  4. Usa volúmenes para artefactos de test — monta directorios del host para extraer reportes y capturas
  5. Aprende comandos básicos de depuracióndocker exec, docker logs y docker inspect te ahorrarán horas