Integrationstests für JavaScript mit Docker: Fortgeschrittenes Niveau

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Integrationstests für JavaScript mit Docker: Fortgeschrittenes Niveau



Integrationstests sind ein entscheidender Schritt in der Entwicklung moderner Webanwendungen. Sie ermöglichen die Überprüfung der Interaktion zwischen verschiedenen Systemkomponenten: Datenbank, Cache, externen APIs und der Anwendung selbst. Docker macht diesen Prozess vorhersagbar, isoliert und reproduzierbar. In diesem Artikel betrachten wir fortgeschrittene Techniken für Integrationstests von JavaScript (Node.js) mit Docker.



Warum Docker bei Integrationstests?

Traditionelle Integrationstests stehen vor Problemen:

  • Unterschiede in den Umgebungen von Entwickler, CI und Produktion.
  • Datenverschmutzung in gemeinsamen Datenbanken.
  • Komplexität beim Starten von Abhängigkeiten (Redis, PostgreSQL, Kafka).

Docker löst diese Probleme durch die Bereitstellung leichtgewichtiger, isolierter Container. Jeder Test kann seine eigene Infrastruktur starten und nach Abschluss wieder zerstören. Dies gewährleistet saubere und wiederholbare Ergebnisse.



Einrichtung der Testumgebung mit Docker Compose

Für fortgeschrittene Tests verwenden wir eine docker-compose.yml, die alle für die Tests erforderlichen Dienste beschreibt: die Anwendung selbst, die Datenbank, den Cache und Mock-Server.



Beispiel 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: ERROR


Wichtige Punkte:

  • tmpfs: Datenbank- und Redis-Daten werden im RAM gespeichert, was die Tests beschleunigt.
  • mock-server: Isolierter Dienst zur Simulation externer APIs.
  • NODE_ENV=test: Schaltet die Anwendung auf die Testkonfiguration um.


Schreiben von Integrationstests mit Testcontainers

Die Bibliothek testcontainers für Node.js ermöglicht die programmatische Verwaltung von Containern direkt aus den Tests heraus. Dies bietet Flexibilität: Sie können für jede Testsuite spezifische Container starten.



Installation:

npm install --save-dev testcontainers


Beispieltest mit PostgreSQL:

const { GenericContainer } = require('testcontainers');const { Client } = require('pg');

describe('User Repository Integration Test', () => { let container; let client;

beforeAll(async () => { // PostgreSQL-Container starten container = await new GenericContainer('postgres:15-alpine') .withEnvironment({ POSTGRES_DB: 'testdb', POSTGRES_USER: 'test', POSTGRES_PASSWORD: 'test' }) .withExposedPorts(5432) .start();

// Mit dem Container verbinden client = new Client({ host: container.getHost(), port: container.getMappedPort(5432), database: 'testdb', user: 'test', password: 'test' }); await client.connect();

// Schema erstellen 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(

Blogs

Buchempfehlungen