¡Hola developer 👋🏻! Este proyecto es un ejemplo mínimo de una API en Node.js (Express) que se integra con Postgres. El objetivo es mostrar diferentes enfoques para pruebas de integración con Postgres, mostradas en mi vídeo La mejor forma de testear tu aplicación ➡️ Testcontainers 🧪📦 | Cap.16
Las pruebas de integración son cruciales para asegurar que los distintos componentes de una aplicación funcionen correctamente juntos. En aplicaciones que interactúan con bases de datos, como Postgres, es vital validar que las consultas SQL, migraciones y conexiones se comporten como se espera en un entorno real.
El reto es encontrar un equilibrio entre:
- Fidelidad: Usar una base de datos real (Postgres), en este ejemplo, en lugar de mocks. Pero podría ser cualquier otro servicio, como por ejemplo caché, cola de mensajería, etc.
- Reproducibilidad: Asegurar que las pruebas se comporten igual en cualquier entorno (local, CI, etc.).
- Simplicidad: Minimizar la complejidad de configuración y mantenimiento.
Este repo presenta 5 enfoques diferentes, ordenados de peor a mejor según estos criterios.
- 🔧 Node.js 18+
- 🐳 Docker (recomendado para la mayoría de enfoques)
- Base de datos Postgres (opcional, solo para algunos enfoques)
Este repo incluye una configuración completa de Dev Container con:
- Aplicación + Postgres: Usando Docker Compose (
.devcontainer/compose.yml) - Environment: Node 20, Docker-in-Docker habilitado, permisos configurados
- Extensiones: ESLint, Prettier, tema Monokai Pro
- Variables:
TESTCONTAINERS_RYUK_DISABLED=truepara mejor compatibilidad
Servicios incluidos:
app: Node.js con código mounted y acceso al socket Dockerpostgres: PostgreSQL 16 disponible enpostgres:5432dentro del container
Uso (VS Code):
- Instala la extensión "Dev Containers"
- Abre el repo y pulsa "Reopen in Container"
- Todo se configura automáticamente
▶️ npm run dev: Arranca la API con nodemon enhttp://localhost:3000▶️ npm start: Arranca la API sin nodemon- 🖥️
npm run test:no-containers: Ejemplo sin contenedores, en el que necesitarías una base de datos local para que funcione. - 🧪
npm run test:mock: Tests con mocks (sin BD) - 🐳
npm run test:docker-compose: Tests que se apoyan en Docker Compose - ✅
npm testonpm run test:test-containers: Test-Containers (recomendado)
- ⚡ Mocks: Más rápidos, sin setup de BD
- 🚀 Test-Containers: Balance ideal entre velocidad y fidelidad
- 🐌 Docker Compose: Más lento por setup/teardown manual
- 🖥️ Servicios: Rápido en CI, depende de configuración local
Todos los enfoques incluyen:
- 📊 Reportes JUnit XML automáticos con
jest-junit - � Resultados detallados con
dorny/test-reporter - 📝 Sumarios visuales con emojis y tablas en PRs/Actions
- 🎯 Casos de test unificados: GET /health, POST+GET /todos, GET /todos
Este proyecto utiliza un workflow reusable centralizado (.github/workflows/reusable-test-workflow.yml) que elimina duplicación y facilita el mantenimiento:
Características:
- 📥 Setup automático: checkout, cache, Node.js, dependencias
- 📊 Generación automática de reportes JUnit XML
- 📈 Publicación con
dorny/test-reporter - 📝 Sumario visual con tablas y emojis generado por
scripts/generate-test-summary.mjs - ⚙️ Configuración por parámetros: comando, nombre, emojis, versión Node
Workflows individuales:
- 🖥️
tests-github-actions-services.yml: Este sería el que usaríamos si tenemos una fuerte dependecia de un servicio local/remoto en unos test, digamos, tradicionales. Podemos aprovecharnos de que en GitHub Actions podemos usar una sección llamada services, que nos permite ejecutar los servicios en contenedores antes de que se ejecute el flujo. - 🧪🤡
tests-mocks.yml: Tests con mocks - 🐳
tests-docker-compose.yml: Docker Compose - 🧪🐳
tests-test-containers.yml: Usando Test containers
Resumen: Usa Test-Containers para la mayoría de casos, Mocks para feedback rápido, y los otros enfoques para casos específicos.