Unit Testing vs. Integration Testing vs. System Testing: Was ist der Unterschied?

Ashley Goolam

Ashley Goolam

23 December 2025

Unit Testing vs. Integration Testing vs. System Testing: Was ist der Unterschied?

Die Frage nach Komponententest (Unit Test) vs. Integrationstest vs. Systemtest verwirrt manchmal selbst erfahrene Entwickler. Diese drei Testebenen bilden das Fundament der Softwarequalität, doch Teams setzen sie oft falsch ein und erstellen Test-Suiten, die entweder zu oberflächlich oder unerschwinglich teuer in der Wartung sind. Zu verstehen, wo jeder Test in Ihre Teststrategie passt, ist nicht nur akademisch, sondern wirkt sich direkt darauf aus, wie schnell Sie Produkte liefern und wie zuversichtlich Sie bei Ihren Releases sein können.

Dieser Leitfaden wird den Umfang, den Zweck und den Zeitpunkt jeder Testebene klären, Ihnen zeigen, wie sie in der Testpyramide zusammenarbeiten, und außerdem praktische Beispiele liefern, die Sie sofort anwenden können. Ob Sie Microservices, Monolithen oder APIs entwickeln, es ist unerlässlich, die Unterschiede zwischen Komponententests, Integrationstests und Systemtests zu verstehen.

button

Was ist Komponententest (Unit Testing)?

Komponententests validieren die kleinsten testbaren Teile Ihrer Anwendung – einzelne Funktionen, Methoden oder Klassen – in vollständiger Isolation. Das Ziel ist es, zu beweisen, dass jede Einheit gemäß ihrer Spezifikation korrekt funktioniert.

Umfang und Beispiel

Ein Komponententest untersucht ein Stück Logik ohne Abhängigkeiten. Hier ist ein einfaches Beispiel:

// Zu testende Funktion
function calculateDiscount(price, discountPercent) {
  if (discountPercent < 0 || discountPercent > 100) {
    throw new Error('Ungültiger Rabattprozentsatz');
  }
  return price * (discountPercent / 100);
}

// Komponententest
describe('calculateDiscount', () => {
  it('berechnet 20% Rabatt korrekt', () => {
    expect(calculateDiscount(100, 20)).toBe(20);
  });

  it('wirft Fehler bei negativem Rabatt', () => {
    expect(() => calculateDiscount(100, -5)).toThrow();
  });
});

Beachten Sie, dass der Test Eingaben bereitstellt und Ausgaben direkt überprüft – keine Datenbank, API oder Benutzeroberfläche beteiligt.

Vorteile und Nachteile

Vorteile:

Nachteile:

Was ist Integrationstest?

Integrationstests überprüfen, ob mehrere Komponenten korrekt zusammenarbeiten. Sie konzentrieren sich auf die Schnittstellen zwischen den Einheiten – API-Endpunkte, Datenbankverbindungen, Message Queues und Service-Interaktionen.

Umfang und Beispiel

Hier ist ein Integrationstest für einen Benutzerregistrierungs-Endpunkt, der auf die Datenbank zugreift:

// Integrationstest für POST /api/users
describe('Benutzerregistrierungs-API', () => {
  it('erstellt Benutzer und speichert in der Datenbank', async () => {
    const userData = {
      name: 'Test Benutzer',
      email: 'test@example.com',
      password: 'ValidPass123'
    };

    // Aktion: Aufruf der tatsächlichen API
    const response = await axios.post('http://localhost:3000/api/users', userData);

    // Assertion: Überprüfung der Antwort UND der Datenbank
    expect(response.status).toBe(201);
    expect(response.data).toHaveProperty('userId');

    // Datenbankstatus überprüfen
    const userInDb = await db.users.findByEmail('test@example.com');
    expect(userInDb).toBeTruthy();
    expect(userInDb.name).toBe('Test Benutzer');
  });
});

Dieser Test beweist, dass die API, die Geschäftslogik und die Datenbankintegration zusammenarbeiten.

Vorteile und Nachteile

Vorteile:

Nachteile:

Was ist Systemtest?

Systemtests validieren das gesamte, integrierte System anhand der Geschäftsanforderungen. Sie betrachten die Anwendung als Black Box und testen End-to-End-Workflows aus Benutzersicht.

Umfang und Beispiel

Ein Systemtest für einen E-Commerce-Kauf-Workflow:

// Systemtest: Vollständiger Kaufprozess
describe('E-Commerce Kauf-System', () => {
  it('ermöglicht dem Benutzer das Stöbern, Hinzufügen zum Warenkorb und den Checkout', async () => {
    // Schritt 1: Benutzerregistrierung
    const user = await api.register('shopper@example.com', 'password');

    // Schritt 2: Produkte durchsuchen
    const products = await api.searchProducts('laptop');
    expect(products.length).toBeGreaterThan(0);

    // Schritt 3: Zum Warenkorb hinzufügen
    await api.addToCart(user.token, products[0].id, 1);

    // Schritt 4: Checkout
    const order = await api.checkout(user.token, {
      shippingAddress: 'Hauptstraße 123',
      paymentMethod: 'visa'
    });

    // Oracle: Vollständige Bestellung überprüfen
    expect(order.status).toBe('confirmed');
    expect(order.total).toBeGreaterThan(0);

    // Nebenwirkungen überprüfen
    const inventory = await api.getInventory(products[0].id);
    expect(inventory.stock).toBe(initialStock - 1);
  });
});

Dies umfasst mehrere APIs, Datenbanken und externe Dienste (Zahlungs-Gateway).

Vorteile und Nachteile

Vorteile:

Nachteile:

Die Software-Testpyramide: Beziehung zwischen den dreien

Die Testpyramide visualisiert, wie Komponententests vs. Integrationstests vs. Systemtests verteilt sein sollten:

        Systemtests (10%)
            ▲
    Integrationstests (30%)
            ▲
    Komponententests (60%)

Unterste Schicht (Komponententests): Größtes Volumen, schnellste Ausführung, laufen ständig
Mittlere Schicht (Integrationstests): Mittleres Volumen, validieren kritische Integrationen
Oberste Schicht (Systemtests): Kleinstes Volumen, testen zentrale Geschäftsabläufe

Diese Form gewährleistet schnelles Feedback bei gleichzeitiger Aufrechterhaltung des Vertrauens. Wenn Sie die Pyramide umkehren (viele Systemtests, wenige Komponententests), wird Ihre Test-Suite langsam, fragil und teuer.

software testing pyramid

Wann jeder Test durchgeführt werden sollte: Lebenszyklus-Integration

Entwicklungsphase Primärer Testtyp Häufigkeit Ausführungszeit
Code schreiben Komponententests Bei jedem Speichern < 1 Sekunde
Pull Request Unit + Integration Vor dem Commit 1-5 Minuten
Vor dem Merge Integration + Ausgewählte Systemtests Bei PR-Genehmigung 5-15 Minuten
Nächtlicher Build Gesamte Suite (alle Typen) Täglich 30-60 Minuten
Vor dem Release Systemtests + Smoke Tests Vor der Bereitstellung 15-30 Minuten
Produktion Smoke Tests + Überwachung Kontinuierlich Echtzeit

Den richtigen Zeitpunkt für Komponententests, Integrationstests und Systemtests zu finden, verhindert Engpässe und stellt gleichzeitig sicher, dass Qualitäts-Gates sinnvoll sind.

Vergleichstabelle: Den richtigen Test auswählen

Faktor Komponententest Integrationstest Systemtest
Geschwindigkeit ⚡⚡⚡ Sehr schnell ⚡⚡ Moderat ⚡ Langsam
Isolation Hoch Mittel Niedrig
Debugbarkeit Einfach Moderat Schwer
Vertrauen Niedrig Mittel Hoch
Wartung Niedrig Mittel Hoch
Wann schreiben Vor/während der Codierung Nachdem Einheiten funktionieren Nach der Integration
Wer schreibt Entwickler Entwickler + QA QA + Entwickler

Praktisches Beispiel: Testen eines API-Endpunkts

Sehen wir uns Komponententest vs. Integrationstest vs. Systemtest in Aktion für einen POST /api/users Endpunkt an:

Komponententest (Testen der Validierungslogik)

// Nur die Validierungsfunktion testen
describe('validateUser', () => {
  it('weist ungültige E-Mail ab', () => {
    const result = validateUser({ email: 'invalid' });
    expect(result.isValid).toBe(false);
    expect(result.errors).toContain('Ungültiges E-Mail-Format');
  });
});

Integrationstest (Testen von API + Datenbank)

// API-Schicht mit echter Datenbank testen
describe('POST /api/users Integration', () => {
  it('erstellt Benutzer in der Datenbank', async () => {
    const response = await request(app)
      .post('/api/users')
      .send({ name: 'Test', email: 'test@example.com' });

    expect(response.status).toBe(201);

    // Oracle: Datenbank überprüfen
    const user = await db.users.findByEmail('test@example.com');
    expect(user.name).toBe('Test');
  });
});

Systemtest (Testen des vollständigen Workflows)

// Registrierung → Login → Profilaktualisierung testen
describe('Benutzerverwaltungssystem', () => {
  it('ermöglicht den vollständigen Benutzerlebenszyklus', async () => {
    // Registrieren
    const reg = await api.post('/api/users', userData);
    expect(reg.status).toBe(201);

    // Anmelden
    const login = await api.post('/api/auth/login', credentials);
    expect(login.data.token).toBeTruthy();

    // Profil aktualisieren
    const update = await api.put('/api/users/me', updates, {
      headers: { Authorization: `Bearer ${login.data.token}` }
    });
    expect(update.status).toBe(200);

    // Endgültigen Zustand überprüfen
    const profile = await api.get('/api/users/me', {
      headers: { Authorization: `Bearer ${login.data.token}` }
    });
    expect(profile.data.name).toBe(updates.name);
  });
});

Wie Apidog Entwicklungsteams beim API-Testen unterstützt

Das Verständnis von Komponententests, Integrationstests und Systemtests ist entscheidend, aber deren Implementierung für APIs kann mühsam sein. Apidog automatisiert die Schwerstarbeit, insbesondere für Integrations- und Systemtests.

Automatische Generierung von Test-Oracles

Für Integrationstests erstellt Apidog Test-Oracles direkt aus Ihrer OpenAPI-Spezifikation:

# Aus Ihrer API-Spezifikation generiert Apidog:
Test: POST /api/users
Oracle 1: Status muss 201 sein
Oracle 2: Antwort muss dem Benutzer-Schema entsprechen
Oracle 3: Location-Header muss vorhanden sein
Oracle 4: Antwortzeit < 500ms
Oracle 5: Datenbankabfrage gibt erstellten Benutzer zurück

Dies eliminiert die manuelle Definition von Oracles und hält die Tests mit Ihrem API-Vertrag synchron.

Visueller Test-Builder für Systemtests

Das Systemtesten komplexer Workflows wird in Apidog visuell:

Test: Vollständiges Benutzer-Onboarding
1. POST /api/users (erstellen)
2. POST /api/auth/verify (E-Mail-Verifizierung)
3. POST /api/auth/login (authentifizieren)
4. GET /api/dashboard (Daten laden)
5. POST /api/preferences (Einstellungen festlegen)

Assertions bei jedem Schritt + Validierung des Endzustands

Sie erstellen dies durch Ziehen und Ablegen von API-Aufrufen, wobei Apidog Authentifizierung, Datenverkettung und Assertions automatisch handhabt.

button
testing in apidog

CI/CD-Integration für kontinuierliches Testen

Apidog führt Ihre Hierarchie von Komponententests vs. Integrationstests vs. Systemtests in CI/CD aus:

# GitHub Actions Pipeline
- name: Komponententests ausführen
  run: npm test:unit

- name: Apidog Integrationstests ausführen
  run: apidog run --tags "@integration"

- name: Apidog Systemtests ausführen
  run: apidog run --tags "@system"

Dies stellt sicher, dass jeder Testtyp in der entsprechenden Phase ausgeführt wird, wobei die Ergebnisse direkt an Slack oder per E-Mail gesendet werden.

ci/cd in apidog

Sichtbarkeit der Testabdeckung

Apidog zeigt, welche APIs über Komponententests, Integrationstests und Systemtests abgedeckt sind:

Endpunkt Komponente Integration System Abdeckung
POST /users 100%
GET /users/:id 67%
DELETE /users 67%

Diese Transparenz hilft Teams, Testlücken strategisch zu schließen.

Häufig gestellte Fragen

F1: Sollte ich Komponententests für API-Endpunkte schreiben?

Antwort: API-Endpunkte orchestrieren Logik – sie sollten Integrationstests haben. Die Geschäftslogik innerhalb der Endpunkte sollte separat mit Komponententests getestet werden.

F2: Wie viele Integrationstests sind genug?

Antwort: Decken Sie alle kritischen Pfade und Fehlerszenarien ab. Eine gute Regel: Wenn ein Fehler in der Integration die Produktion erreichen würde, schreiben Sie einen Test dafür.

F3: Sind Systemtests die Wartungskosten wert?

Antwort: Ja, aber nur für zentrale Geschäftsabläufe. Beschränken Sie Systemtests auf die 10-20% der Funktionen, die 80% des Geschäftswertes generieren.

F4: Kann Apidog Komponententests generieren?

Antwort: Nein. Komponententests erfordern Kenntnisse der internen Code-Struktur. Apidog excelled bei Integrations- und Systemtests, wo es das API-Verhalten von außen beobachten kann.

F5: Welchen Testtyp sollte ich für ein neues Projekt priorisieren?

Antwort: Beginnen Sie mit Komponententests (Grundlage), fügen Sie Integrationstests hinzu, sobald Komponenten verbunden sind, und dann Systemtests für kritische Benutzerpfade. Dieser Pyramidenansatz verhindert technische Schulden.

Fazit

Die Entscheidung zwischen Komponententest, Integrationstest und Systemtest ist nicht die Wahl des einen über den anderen – es geht darum, jeden zur richtigen Zeit und im richtigen Verhältnis anzuwenden. Komponententests geben Ihnen Geschwindigkeit und Präzision für die Entwicklung. Integrationstests fangen Verbindungsprobleme ab, die Komponententests übersehen. Systemtests geben Ihnen die Gewissheit, dass das gesamte Produkt für die Benutzer funktioniert.

Meistern Sie diese Hierarchie, und Ihre Test-Suite wird zu einem strategischen Vorteil statt zu einer Wartungslast. Beginnen Sie damit, Ihre aktuelle Testverteilung zu überprüfen. Sind Sie mit zu vielen langsamen, brüchigen Systemtests invertiert? Verlagern Sie den Fokus nach unten. Fehlt Ihnen eine kritische Integrationsabdeckung? Schließen Sie diese Lücken.

Moderne Tools wie Apidog machen die Integrations- und Systemebenen wesentlich besser handhabbar, indem sie die Testerstellung und -ausführung automatisieren. Dadurch können Sie die Form der Testpyramide beibehalten, ohne die Entwicklungsgeschwindigkeit zu verlangsamen. Qualität wird zu einem natürlichen Ergebnis Ihres Prozesses, nicht zu einer separaten Phase, die Releases verzögert.

Denken Sie daran: Das Ziel ist nicht, alles zu testen – es ist, die richtigen Dinge auf der richtigen Ebene zu testen. Wenn Komponententest vs. Integrationstest vs. Systemtest in Ihrer Strategie klar ist, werden Lieferungen vorhersehbar, das Vertrauen wächst, und Ihr Team verbringt weniger Zeit mit der Brandbekämpfung und mehr Zeit mit der Wertschöpfung.

button

Praktizieren Sie API Design-First in Apidog

Entdecken Sie eine einfachere Möglichkeit, APIs zu erstellen und zu nutzen

Unit Testing vs. Integration Testing vs. System Testing: Was ist der Unterschied?