Testen in JavaScript: Unit-, Integrations- und E2E-Tests mit Node.js

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
```html

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



Testen ist ein wesentlicher Bestandteil der Entwicklung jeder qualitativ hochwertigen Software. In der Welt von JavaScript (insbesondere im Node.js-Ökosystem) gibt es drei Hauptebenen des Testens: Unit-Tests (Modultests), Integrationstests und E2E-Tests (End-to-End-Tests). Jeder von ihnen löst seine eigenen Aufgaben und wird in verschiedenen Phasen der Entwicklung eingesetzt. In diesem Artikel werden wir jeden Typ analysieren, Codebeispiele zeigen und praktische Empfehlungen geben.



1. Unit-Tests (Modultests)



Unit-Tests überprüfen einzelne, isolierte Code-Einheiten – Funktionen, Methoden oder Klassen. Das Hauptziel ist sicherzustellen, dass jede „Einheit“ unabhängig vom Rest des Systems korrekt funktioniert. In Node.js werden dafür am häufigsten die Frameworks Jest oder Mocha mit Chai verwendet.



Beispiel eines Unit-Tests mit Jest



Angenommen, wir haben eine einfache Funktion zur Berechnung eines Rabatts:



// discount.jsfunction calculateDiscount(price, percent) {  if (typeof price !== 'number' || typeof percent !== 'number') {    throw new Error('Beide Argumente müssen Zahlen sein');  }  if (price < 0 || percent < 0 || percent > 100) {    throw new Error('Ungültige Werte');  }  return price - (price * percent / 100);}

module.exports = calculateDiscount;


Test für diese Funktion:



// discount.test.jsconst calculateDiscount = require('./discount');

describe('calculateDiscount', () => { test('berechnet korrekt 10% Rabatt von 1000', () => { expect(calculateDiscount(1000, 10)).toBe(900); });

test('gibt 0 bei 100% Rabatt zurück', () => { expect(calculateDiscount(500, 100)).toBe(0); });

test('wirft einen Fehler bei negativem Preis', () => { expect(() => calculateDiscount(-100, 10)).toThrow('Ungültige Werte'); });

test('wirft einen Fehler bei nicht-numerischen Argumenten', () => { expect(() => calculateDiscount('100', 10)).toThrow('Beide Argumente müssen Zahlen sein'); });});


  • Vorteile: Schnell, einfach zu schreiben, zeigen genau auf das problematische Modul.
  • Nachteile: Prüfen nicht die Interaktion zwischen Komponenten.
  • Wann verwenden: Für Funktionen der Geschäftslogik, Hilfsfunktionen, Validatoren.


2. Integrationstests



Integrationstests überprüfen, wie verschiedene Module oder Dienste zusammenarbeiten. Zum Beispiel die Interaktion mit einer Datenbank, einer externen API oder dem Dateisystem. In Node.js wird für solche Tests oft Supertest (für HTTP-Anfragen) und Jest verwendet.



Beispiel eines Integrationstests für eine Express-Anwendung



Angenommen, wir haben einen einfachen Express-Server mit einem Endpunkt zum Erstellen eines Benutzers:



// server.jsconst express = require('express');const app = express();app.use(express.json());

const users = [];

app.post('/users', (req, res) => { const { name, email } = req.body; if (!name || !email) { return res.status(400).json({ error: 'Name and email are required' }); } const user = { id: users.length + 1, name, email }; users.push(user); res.status(201).json(user);});

module.exports = app;


Integrationstest mit Supertest:



// server.test.jsconst request = require('supertest');const app = require('./server');

describe('POST /users', () => { test('erstellt einen neuen Benutzer mit gültigen Daten', async () => { const response = await request(app) .post('/users') .send({ name: 'Ivan', email: 'ivan@example.com' });

expect(response.statusCode).toBe(201); expect(response.body).toHaveProperty('id'); expect(response.bo ```

Blogs

Buchempfehlungen