Testen in JavaScript: Unit, Integration, E2E — Vollständiger Leitfaden
Codequalität ist der Schlüssel zum Erfolg jedes Projekts. In der Welt von JavaScript (insbesondere Node.js) ist Testen nicht nur eine gute Praxis, sondern eine Notwendigkeit geworden. Wir analysieren drei Schlüsselebenen: Modultests (Unit), Integrationstests (Integration) und End-to-End-Tests (E2E). Sie erfahren, wie sie sich unterscheiden, wann Sie welchen Typ anwenden und sehen funktionierende Beispiele mit gängigen Tools.
1. Unit-Testing: Isolierte Module prüfen
Unit-Tests überprüfen die Arbeit einzelner Funktionen, Klassen oder Module in Isolation von externen Abhängigkeiten (Datenbanken, APIs, Dateisystem). Dies ist die schnellste und zuverlässigste Ebene.
Tools und Einrichtung
Das beliebteste Framework ist Jest. Installation:
npm install --save-dev jestFügen Sie das Skript in package.json hinzu:
"scripts": { "test": "jest"}Beispiel: Testen einer Rabattfunktion
Erstellen wir die Datei discount.js:
// discount.jsfunction applyDiscount(price, discountPercent) { if (price <= 0) throw new Error('Price must be positive'); if (discountPercent < 0 || discountPercent > 100) throw new Error('Invalid discount'); return price - (price * discountPercent) / 100;}module.exports = { applyDiscount };Jetzt schreiben wir einen Unit-Test in discount.test.js:
const { applyDiscount } = require('./discount');
describe('applyDiscount', () => { test('calculates 10% discount correctly', () => { expect(applyDiscount(100, 10)).toBe(90); });
test('throws error for negative price', () => { expect(() => applyDiscount(-10, 10)).toThrow('Price must be positive'); });
test('throws error for invalid discount percent', () => { expect(() => applyDiscount(100, 150)).toThrow('Invalid discount'); });});Ausführung: npm test. Jest findet automatisch Dateien mit *.test.js.
Tipp: Verwenden Sie mock-Objekte zur Isolation von externen Diensten.
// Beispiel für einen Mock einer externen APIjest.mock('./api');const api = require('./api');api.getData.mockResolvedValue({ id: 1 });2. Integrationstests: Zusammenspiel der Komponenten prüfen
Integrationstests überprüfen, wie verschiedene Module zusammenarbeiten: Datenbank + Geschäftslogik + HTTP-Routen. Sie sind langsamer als Unit-Tests, geben aber mehr Vertrauen in die Korrektheit des Systems.
Tools: Supertest + Jest
Supertest ermöglicht HTTP-Anfragen an Ihre Express-Anwendung, ohne den Server tatsächlich zu starten.
npm install --save-dev supertestBeispiel: Testen einer REST-API
Angenommen, es gibt eine einfache Express-Anwendung app.js:
const express = require('express');const app = express();app.use(express.json());
app.post('/users', (req, res) => { const { name, email } = req.body; if (!name || !email) { return res.status(400).json({ error: 'Missing fields' }); } // In DB speichern (vereinfacht) res.status(201).json({ id: 1, name, email });});
module.exports = app;Integrationstest users.test.js:
const request = require('supertest');const app = require('./app');
describe('POST /users', () => { test('creates user with valid data', async () => { const response = await request(app) .post('/users') .send({ name: 'Alice', email: 'alice@test.com' }); expect(response.status).toBe(201); expect(response.body).toHaveProperty('id'); expect(response.body.name).toBe('Alice'); });
test('returns 400 for missing email', async () => { const response = await request(app) .post('/users') .send({ name: 'Bob' });