Testen in TypeScript: Unit-, Integrations- und E2E-Tests

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 TypeScript-Code testen?



TypeScript ist eine Obermenge von JavaScript, die statische Typisierung hinzufügt. Typen garantieren jedoch keine korrekte Anwendungslogik. Testing in TypeScript ist nicht nur eine "gute Praxis", sondern eine Notwendigkeit, um Codequalität zu erhalten, Regressionen zu verhindern und die Entwicklung zu beschleunigen.



In diesem Artikel behandeln wir drei Hauptebenen des Testens: unit (Modultests), integration (Integrationstests) und e2e (End-to-End-Tests). Sie erfahren, welche Tools Sie verwenden können, sehen Codebeispiele und verstehen, wie Sie eine ausgewogene Teststrategie für Ihr TypeScript-Projekt aufbauen.



1. Unit-Testing in TypeScript



Was sind Unit-Tests?

Unit-Tests überprüfen isolierte Module oder Funktionen. Sie werden schnell ausgeführt und benötigen keine externen Abhängigkeiten (Datenbanken, Netzwerk, Dateisystem). Das Hauptziel ist sicherzustellen, dass jede kleine Codeeinheit korrekt funktioniert.



Tools: Jest + ts-jest

Das beliebteste Framework für Unit-Testing in TypeScript ist Jest mit dem Transpiler ts-jest. Es unterstützt Mocks, Spione, Coverage und lässt sich hervorragend in TypeScript integrieren.



Beispiel eines Unit-Tests

Angenommen, wir haben eine Funktion zur Berechnung eines Rabatts:



// discount.tsexport function calculateDiscount(price: number, discountPercent: number): number {  if (price < 0 || discountPercent < 0 || discountPercent > 100) {    throw new Error('Invalid input');  }  return price * (1 - discountPercent / 100);}


Wir schreiben den Test:



// discount.test.tsimport { calculateDiscount } from './discount';

describe('calculateDiscount', () => { it('should apply 10% discount correctly', () => { expect(calculateDiscount(1000, 10)).toBe(900); });

it('should throw error for negative price', () => { expect(() => calculateDiscount(-100, 10)).toThrow('Invalid input'); });

it('should handle 0% discount', () => { expect(calculateDiscount(500, 0)).toBe(500); });});


Ausführung: npx jest. Jest findet automatisch alle *.test.ts-Dateien.



Best Practices für Unit-Tests

  • Isolieren Sie Abhängigkeiten — verwenden Sie Mocks (jest.mock) für Module, die auf DB oder API zugreifen.
  • Testen Sie Grenzfälle — leere Arrays, null, negative Zahlen.
  • Befolgen Sie das FIRST-Prinzip — Fast, Isolated, Repeatable, Self-validating, Timely.
  • Verwenden Sie describe/it — für eine lesbare Teststruktur.


2. Integrationstests (Integration Tests)



Was prüfen Integrationstests?

Integrationstests überprüfen das Zusammenspiel mehrerer Module: Controller + Service + Datenbank oder API-Endpunkt + Middleware. Sie sind langsamer als Unit-Tests, geben aber mehr Vertrauen in die korrekte Verknüpfung der Komponenten.



Tools: Supertest + Jest + In-Memory-DB

Für das Testen von Express/Node.js-APIs wird häufig Supertest (HTTP-Assertions) in Kombination mit Jest verwendet. Die Datenbank kann als In-Memory-Variante (z.B. mongodb-memory-server oder sqlite3) bereitgestellt werden.



Beispiel eines Integrationstests für eine Express-API

Angenommen, wir haben eine einfache REST-API zur Benutzerverwaltung:



// app.tsimport express from 'express';import { userRouter } from './routes/userRoutes';

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

export { app };


Test mit Supertest:



// user.integration.test.tsimport request from 'supertest';import { app } from '../app';

describe('POST /api/users', () => { it('should create a new user and return 201', async () => {

Blogs

Buchempfehlungen