Integrationstests für JavaScript mit Docker: Von A bis Z
\n\nIn der modernen Webentwicklung ist Codequalität nicht nur eine Metrik, sondern der Schlüssel zur Produktstabilität. Integrationstests nehmen einen zentralen Platz in der Testpyramide ein, da sie die Interaktion zwischen verschiedenen Modulen, Datenbanken, externen APIs und Diensten überprüfen. Die Einrichtung isolierter und reproduzierbarer Umgebungen für solche Tests wird jedoch oft zur Herausforderung. Hier kommt Docker ins Spiel – ein Containerisierungstool, das sich ideal für die Erstellung sauberer, wiederholbarer Testumgebungen eignet.
\n\nIn diesem Artikel zeigen wir, wie Sie Integrationstests für JavaScript (Node.js)-Anwendungen mit Docker organisieren. Sie erfahren, wie Sie eine Testdatenbank hochfahren, Abhängigkeiten in Containern ausführen und effektive Tests schreiben, die sich leicht in eine CI/CD-Pipeline integrieren lassen.
\n\n1. Warum Docker ideal für Integrationstests ist
\n\nDer traditionelle Ansatz für Integrationstests erfordert oft die manuelle Einrichtung der Umgebung auf jedem Entwicklerrechner oder CI-Server. Dies führt zum Problem „Auf meinem Rechner funktioniert es“. Docker löst dieses Problem grundlegend:
\n\n- \n
- Isolation: Jeder Test wird in einem sauberen Container ausgeführt, wodurch Nebeneffekte vorheriger Läufe ausgeschlossen werden. \n
- Reproduzierbarkeit: Dieselbe Umgebung (Node.js-Version, Datenbanken, Systembibliotheken) funktioniert garantiert überall: auf dem lokalen Entwicklerrechner, auf dem Build-Server und in der Produktion. \n
- Abhängigkeitsverwaltung: Sie können komplexe Infrastrukturen (Redis, PostgreSQL, RabbitMQ) problemlos mit einem einzigen Befehl
docker-compose up -dhochfahren. \n - Geschwindigkeit: Container starten in Sekunden, im Gegensatz zu virtuellen Maschinen. Docker cached Ebenen, was wiederholte Builds beschleunigt. \n
Im Kontext von Node.js ermöglicht Docker das „Mocken“ externer Dienste, ohne die Entwicklungsumgebung zu verlassen. Anstatt die Produktions-API aufzurufen, starten Sie einen Testcontainer mit z. B. json-server oder testcontainers.
2. Einrichtung des Node.js-Projekts für Tests
\n\nAngenommen, wir haben eine einfache Express-Anwendung, die Benutzer in PostgreSQL speichert. Unsere Aufgabe ist es, den Endpunkt POST /users zu testen.
Projektstruktur:
\n\nproject/\n├── src/\n│ ├── app.js\n│ ├── db.js\n│ └── routes/\n│ └── users.js\n├── test/\n│ └── integration/\n│ └── users.test.js\n├── docker-compose.test.yml\n├── Dockerfile\n├── package.json\n└── .env.test\n\n\n
Für die Tests verwenden wir einen gängigen Stack: Mocha (Framework) + Chai (Assertions-Bibliothek) + Supertest (HTTP-Testing).
\n\nInstallieren wir die Abhängigkeiten:
\nnpm install --save-dev mocha chai supertest\n\nDie Datei package.json sollte ein Skript zum Ausführen der Tests enthalten:
{\n "scripts": {\n "test:integration": "mocha test/integration/**/*.test.js --timeout 10000"\n }\n}\n\n3. Erstellung der Docker-Umgebung für Tests
\n\nDie Schlüsseldatei ist docker-compose.test.yml. Sie beschreibt die für die Tests erforderlichen Dienste.
version: '3.8'\n\nservices:\n app-test:\n build:\n context: .\n dockerfile: Dockerfile\n environment:\n - NODE_ENV=test\n - DB_HOST=postgres-test\n - DB_PORT=5432\n - DB_USER=test_user\n - DB_PASSWORD=test_pass\n - DB_NAME=test_db\n depends_on:\n postgres-test:\n condition: service_healthy\n command: ["npm", "run", "test:integration"]\n\n postgres-test:\n image: postgres:15-alpine\n environment:\n POSTGRES_USER: test_user\n POSTGRES_PASSWORD: test_