Integrationstests von TypeScript mit Docker: Vollständiger Leitfaden

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

Einleitung: Warum Integrationstests für TypeScript mit Docker?



Integrationstests sind eine entscheidende Phase der Entwicklung, die die Interaktion zwischen verschiedenen Modulen Ihrer Anwendung überprüft. Im Gegensatz zu Unit-Tests, die eine einzelne Komponente isolieren, testen Integrationstests, wie Datenbank, API, externe Dienste und Geschäftslogik zusammenarbeiten.



Die Verwendung von Docker in Integrationstests für TypeScript löst mehrere Probleme:



  • Umgebungsisolierung — Tests laufen auf allen Maschinen unter identischen Bedingungen
  • Abhängigkeitsverwaltung — Datenbanken, Warteschlangen und Caches werden automatisch gestartet
  • Reproduzierbarkeit — Tests liefern lokal und in CI/CD die gleichen Ergebnisse
  • Schnelle Wiederherstellung — Container werden in Sekunden neu erstellt


In diesem Artikel werden wir ein praktisches Beispiel für die Einrichtung von Integrationstests einer TypeScript-Anwendung mit Docker, Jest und Supertest durchgehen.



1. Projektvorbereitung und Installation der Abhängigkeiten



Beginnen wir mit der Erstellung eines grundlegenden TypeScript-Projekts. Stellen Sie sicher, dass Node.js (v18+) und Docker installiert sind.



mkdir typescript-docker-testingcd typescript-docker-testingnpm init -ynpm install express typescript ts-node @types/node @types/expressnpm install --save-dev jest ts-jest @types/jest supertest @types/supertest


Erstellen Sie tsconfig.json:



{  "compilerOptions": {    "target": "ES2020",    "module": "commonjs",    "outDir": "./dist",    "rootDir": "./src",    "strict": true,    "esModuleInterop": true,    "skipLibCheck": true  },  "include": ["src/**/*"],  "exclude": ["node_modules", "**/*.test.ts"]}


Konfigurieren Sie Jest in package.json:



"jest": {  "preset": "ts-jest",  "testEnvironment": "node",  "testMatch": ["**/*.test.ts"]}


2. Erstellen einer einfachen Express-Anwendung



Erstellen wir eine Ordnerstruktur und eine einfache Anwendung, die mit einer PostgreSQL-Datenbank interagiert.



mkdir srcmkdir src/configmkdir src/modelsmkdir src/routesmkdir src/__tests__


src/config/database.ts — Konfiguration der Datenbankverbindung:



import { Pool } from 'pg';

const pool = new Pool({ host: process.env.DB_HOST || 'localhost', port: Number(process.env.DB_PORT) || 5432, database: process.env.DB_NAME || 'testdb', user: process.env.DB_USER || 'testuser', password: process.env.DB_PASSWORD || 'testpass'});

export default pool;


src/app.ts — Hauptanwendung:



import express from 'express';import userRoutes from './routes/users';

const app = express();app.use(express.json());app.use('/api/users', userRoutes);

export default app;


src/index.ts — Einstiegspunkt:



import app from './app';

const PORT = process.env.PORT || 3000;app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});


src/routes/users.ts — einfache Route für Benutzer:



import { Router, Request, Response } from 'express';import pool from '../config/database';

const router = Router();

router.get('/', async (req: Request, res: Response) => { try { const result = await pool.query('SELECT * FROM users'); res.json(result.rows); } catch (error) { res.status(500).json({ error: 'Database error' }); }});

router.post('/', async (req: Request, res: Response) => { const { name, email } = req.body; try { const result = await pool.query( 'INSERT INTO users (name, email) VALUES ($1, $2) RETURNING *', [name, email] ); res.status(201).json(result.r

Blogs

Buchempfehlungen