Informatik

Komponententests: Testfälle und Isolation verstehen

Komponententests: Testfälle und Isolation verstehen
Komponententests: Testfälle und Isolation verstehen
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

Ein Komponententest prüft einen abgegrenzten Softwarebaustein gegen erwartete Ergebnisse, möglichst ohne störende Einflüsse anderer Bausteine. So kannst du Fehler früh eingrenzen. Ein bestandener Test beweist aber nur das Verhalten in den gewählten Testfällen – nicht die Fehlerfreiheit der Komponente.

Deine Lernziele

Hake ab, was du schon kannst — und komm am Ende hierher zurück!

Was genau wird beim Komponententest geprüft?

Stell dir eine Funktion vor, die aus einem Warenwert die Versandkosten berechnet. Du möchtest wissen, ob diese eine Berechnung richtig arbeitet – unabhängig von Benutzeroberfläche, Datenbank und Zahlungsdienst.

Definition

Komponententest

Ein Komponententest prüft eine einzelne, abgegrenzte Komponente anhand festgelegter Anforderungen. Dazu wird ein Ausgangszustand hergestellt, die Komponente mit bestimmten Eingaben ausgeführt und das beobachtete Ist-Ergebnis mit einem erwarteten Soll-Ergebnis verglichen.

Was als Komponente gilt, hängt vom Projekt ab. In einem Softwareprojekt kann es eine Funktion, Methode, Klasse oder ein Modul sein. In einem technischen System kann eine Komponente auch Mechanik, Elektronik und Software enthalten. Vor dem Test muss deshalb klar festgelegt sein, wo die Grenze des Prüfgegenstands verläuft.

In vielen Softwarekontexten werden Unit-Test, Modultest und Komponententest ähnlich oder sogar gleichbedeutend verwendet. „Unit“ betont meist eine kleine Codeeinheit. „Komponente“ kann je nach vereinbarter Grenze weiter gefasst sein. Entscheidend ist nicht das Wort allein, sondern was isoliert geprüft wird.

Merke

Erst die vereinbarte Grenze macht aus einem beliebigen Test einen Komponententest: Was gehört zum Prüfgegenstand, was ist eine Abhängigkeit und welches Verhalten wird erwartet?

Teste dich
Frage 1 von 2LeichtEin Team testet nur die Methode berechneVersandkosten. Datenbank und Zahlungsdienst sind nicht beteiligt. Welche Teststufe passt am besten?
Lösung: Komponententest beziehungsweise Unit-Test — Die Methode ist eine abgegrenzte Codeeinheit und wird unabhängig von anderen Anwendungsteilen geprüft.
Frage 2 von 2MittelEin Team bezeichnet ein komplettes Steuergerät aus Tasten, Elektronik und Software als „Komponente“. Ist ein Test dieses Steuergeräts automatisch falsch benannt?
Lösung: Nein, wenn das Projekt genau dieses Teilsystem als Komponente abgegrenzt hat. — Auch ein komplexes Teilsystem kann die vereinbarte Komponente sein. Dann muss der Testaufbau zu seinen Anforderungen passen.
Teststufen sicher unterscheiden

Die Teststufen unterscheiden sich vor allem durch Prüfgegenstand und Frage:

TestartPrüfgegenstandLeitfrage
Unit- oder Komponententesteine abgegrenzte Einheit, meist isoliertErfüllt dieser Baustein seinen Vertrag?
Integrationstestmehrere integrierte Komponenten oder Dienste im ZusammenspielFunktionieren Schnittstellen und Datenaustausch zusammen?
Systemtestdas integrierte GesamtsystemErfüllt das gesamte System die festgelegten Systemanforderungen?

Ein Beispiel zeigt den Fokuswechsel:

  1. Ein Komponententest prüft, ob berechneVersandkosten(49) den festgelegten Betrag liefert.
  2. Ein Integrationstest prüft, ob Warenkorb und Versanddienst die Daten im richtigen Format austauschen.
  3. Ein Systemtest prüft den vollständigen Bestellablauf im integrierten System.

Die Stufen ersetzen einander nicht. Ein korrekter einzelner Baustein kann über eine fehlerhafte Schnittstelle falsch eingebunden sein. Umgekehrt kann ein Systemtest einen Fehler zeigen, ohne seine Ursache so genau einzugrenzen wie ein Komponententest.

Teste dich
Frage 1 von 2LeichtWelche Leitfrage gehört zum Integrationstest?
Lösung: Arbeiten mehrere integrierte Teile an ihrer Schnittstelle richtig zusammen? — Beim Integrationstest steht die Verbindung zwischen Teilen im Mittelpunkt.
Frage 2 von 2MittelEine Preisfunktion besteht alle isolierten Tests. In der Anwendung übergibt der Warenkorb den Preis jedoch als Text statt als Zahl. Welche Prüfung soll diesen Fehler besonders aufdecken?
Lösung: Ein Integrationstest von Warenkorb und Preisfunktion — Der Fehler entsteht im Zusammenspiel und an der Schnittstelle. Genau darauf richtet sich der Integrationstest.
Einen aussagekräftigen Testfall entwerfen

Ein Testfall beginnt bei einer Anforderung, nicht bei einem zufällig gewählten Eingabewert. Angenommen, die Spezifikation lautet:

rabatt(preis, mitglied) gibt für Mitglieder 10 Prozent des nicht negativen Preises als Rabatt zurück. Für Nichtmitglieder beträgt der Rabatt 0. Negative Preise werden abgewiesen.

Gehe in drei Schritten vor:

  1. Ausgangszustand und Eingaben festlegen: Welche Werte und Voraussetzungen gelten?
  2. Operation ausführen: Welche Komponente wird aufgerufen?
  3. Soll und Ist vergleichen: Welches beobachtbare Ergebnis fordert die Spezifikation?
Beispiel

Für den Normalfall preis = 80 und mitglied = wahr erwartest du einen Rabatt von 8. Der Test richtet die Eingaben ein, ruft rabatt(80, wahr) auf und vergleicht das Ergebnis mit 8. Liefert die Funktion 8, ist genau dieser Testfall bestanden.

Der entscheidende Gedanke: Der Sollwert stammt aus der Anforderung und wird vor der Auswertung festgelegt. Das Ergebnis der Funktion darf nicht nachträglich zum erwarteten Wert erklärt werden.

Ein einzelner Normalfall reicht nicht. Wähle Testfälle mit unterschiedlichen Aufgaben:

  • Normalfall: ein typischer gültiger Wert, etwa 80 und Mitglied.
  • Randfall: ein Wert an einer bedeutsamen Grenze, hier 0 und Mitglied; erwartet wird 0.
  • Alternative gültige Bedingung: 80 und kein Mitglied; erwartet wird 0.
  • Ungültiger Fall: ein negativer Preis; erwartet wird die in der Spezifikation festgelegte Abweisung.
Gut zu wissen

Eine große Anzahl beliebiger Testwerte ist nicht automatisch aussagekräftig. Gute Testfälle stehen für unterschiedliche Anforderungen, Grenzen und mögliche Fehler. Welches Überdeckungsziel nötig ist, hängt vom Projekt und seinem Risiko ab.

Teste dich
Frage 1 von 3LeichtWelcher Test ist ein Randfall für die angegebene Rabattfunktion?
Lösung: rabatt(0, wahr) mit dem Sollwert 0 — Der Preis 0 liegt genau an der Grenze zwischen erlaubten nicht negativen und verbotenen negativen Preisen.
Frage 2 von 3MittelEin Test verwendet rabatt(-20, wahr), erwartet aber ohne Begründung den Wert -2. Was ist das Hauptproblem?
Lösung: Das Soll-Ergebnis widerspricht der Anforderung, nach der negative Preise abgewiesen werden. — Auch ein Fehlerfall braucht ein eindeutiges Soll-Verhalten. Hier ist die Abweisung gefordert.
Frage 3 von 3SchwerEine neue Anforderung begrenzt den Preis auf höchstens 10 000. Welcher zusätzliche Test prüft die neue obere Grenze am gezieltesten?
Lösung: Ein Test mit 10 000 und ein weiterer mit einem Wert knapp darüber, jeweils mit festgelegtem Soll-Verhalten — Für eine Grenze brauchst du mindestens den gültigen Grenzwert und einen Wert auf der anderen Seite, sofern die Spezifikation dessen Verhalten festlegt.
Abhängigkeiten kontrollieren und Isolation verstehen

Viele Komponenten rufen andere Teile auf: eine Datenbank, einen Dienst, eine Uhr oder eine Hardware-Schnittstelle. Würdest du alle echten Abhängigkeiten einbinden, könnte ein Fehler außerhalb des Prüfgegenstands den Test beeinflussen. Dann wäre die Ursache schwerer zu erkennen.

Für einen isolierten Komponententest ersetzt du benötigte Abhängigkeiten deshalb bei Bedarf durch Testdoubles. Sie liefern kontrollierte Antworten oder zeichnen Aufrufe auf.

Definition

Stub und Driver

Ein Stub ersetzt einen Baustein, den die getestete Komponente aufruft, und liefert vorbereitete Antworten. Ein Driver ersetzt den aufrufenden Teil und startet die zu testende Operation mit festgelegten Eingaben.

Beispiel

Eine Komponente zeigeWetter fragt normalerweise einen Wetterdienst ab. Für ihren Komponententest liefert ein Stub immer die kontrollierte Antwort „18 Grad“. So prüfst du, ob zeigeWetter diese Antwort richtig verarbeitet, auch wenn der echte Dienst nicht verfügbar ist.

Damit hast du jedoch noch nicht geprüft, ob die echte Verbindung, das echte Datenformat und mögliche Netzwerkfehler korrekt behandelt werden. Dafür brauchst du passende Integrations- oder weiterführende Tests.

Ein Testdouble ist selbst nur ein Modell. Bildet es Antwortcodes, Plausibilitätsprüfungen oder Zustände unvollständig ab, kann der Test trotz eines späteren Integrationsfehlers grün sein. Außerdem können Test und Implementierung denselben falschen Denkfehler enthalten.

Merke

Isolation macht Ursachen leichter sichtbar, blendet aber bewusst einen Teil der Wirklichkeit aus. Deshalb folgen weitere Teststufen, in denen schrittweise mehr Zusammenspiel geprüft wird.

Teste dich
Frage 1 von 2MittelWarum wird ein externer Dienst in einem Komponententest häufig durch einen Stub ersetzt?
Lösung: Damit die Antwort kontrollierbar ist und der Test den ausgewählten Baustein gezielt prüft. — Der Stub hält eine Abhängigkeit kontrolliert. Das macht den Test reproduzierbar und die Fehlerursache enger eingrenzbar.
Frage 2 von 2SchwerDer Stub liefert immer gültige Daten, der echte Dienst manchmal unvollständige Datensätze. Welches Risiko besteht?
Lösung: Der Komponententest kann grün bleiben, obwohl die Integration mit unvollständigen echten Daten scheitert. — Die Aussagekraft des Tests reicht nur so weit wie die modellierten Antworten und die gewählten Testfälle.
Fehler auswerten und Korrekturen absichern

Ein fehlgeschlagener Test zeigt zunächst eine Abweichung zwischen Soll und Ist. Er sagt noch nicht automatisch, welche Codezeile die Ursache ist.

Gehe systematisch vor:

  1. Prüfe, ob Anforderung, Eingaben und Sollwert eindeutig sind.
  2. Stelle sicher, dass der Testaufbau nicht selbst fehlerhaft ist.
  3. Verfolge die Verarbeitung bis zur ersten falschen Zustandsänderung oder Ausgabe.
  4. Behebe die Ursache in der Komponente.
  5. Führe den fehlgeschlagenen Test und die übrigen passenden Tests erneut aus.
  6. Bewahre den Test als Regressionstest auf, wenn er einen behobenen Fehler dauerhaft abdecken soll.
Beispiel

Für rabatt(80, wahr) lautet das Soll 8, das Ist aber 72. Die erste auffällige Zustandsänderung zeigt: Die Funktion gibt den zu zahlenden Restbetrag statt des Rabatts zurück. Nach der Korrektur wird derselbe Test erneut ausgeführt. Besteht er nun, belegt das die Korrektur für diesen Fall; andere Testfälle müssen weiterhin laufen, damit die Änderung kein anderes Verhalten beschädigt.

Auch Testcode ist Code. Er kann falsche Erwartungen, ungeeignete Daten oder problematische gemeinsame Zustände enthalten und sollte deshalb nachvollziehbar benannt, gepflegt und überprüft werden.

Teste dich
Frage 1 von 2MittelNach einer Korrektur besteht der zuvor fehlgeschlagene Test. Warum sollten auch weitere passende Tests erneut laufen?
Lösung: Die Änderung könnte an anderer Stelle eine neue Abweichung verursacht haben. — Wiederholungstests prüfen die Korrektur; weitere Tests helfen, unbeabsichtigte Nebenwirkungen zu entdecken.
Frage 2 von 2SchwerEin Test scheitert. Die Entwicklerin ändert sofort die erwartete Ausgabe so, dass sie zum Ist-Ergebnis passt. Was muss sie zuerst klären?
Lösung: Ob die Anforderung das bisherige Soll oder das beobachtete Ist verlangt — Das Soll folgt aus der Anforderung. Es darf nur geändert werden, wenn sich die Anforderung oder ihre begründete Auslegung geändert hat.
Karteikasten
Karteikasten

Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.

Alles auf einen Blick
Mindmap
  • Komponententest
    • Prüfgegenstand
      • abgegrenzte Komponente
      • beobachtbares Verhalten
    • Testfall
      • Ausgangszustand und Eingabe
      • Soll-Ist-Vergleich
      • Normal-, Rand- und Fehlerfall
    • Isolation
      • kontrollierte Abhängigkeiten
      • Stub oder Driver
      • begrenztes Modell der Wirklichkeit
    • Teststufen
      • Unit oder Komponente
      • Integration der Teile
      • Gesamtsystem
    • Ergebnis
      • Fehler eingrenzen
      • Korrektur wiederholen
      • keine Garantie auf Fehlerfreiheit
Abschluss-Check
Teste dich
Frage 1 von 4LeichtWas beweist ein bestandener Komponententest sicher?
Lösung: Die Komponente zeigte im gewählten Testfall das erwartete Verhalten. — Ein grüner Test ist ein begrenzter Nachweis für einen bestimmten Fall, keine allgemeine Fehlerfreiheitsgarantie.
Frage 2 von 4MittelEine Funktion akzeptiert laut Spezifikation Werte von 1 bis 100. Welche Auswahl prüft Normal-, Rand- und ungültigen Fall sinnvoll?
Lösung: 50 mit gültigem Soll, 1 beziehungsweise 100 als Randwert und 0 mit festgelegter Abweisung — Die Auswahl verbindet einen typischen gültigen Wert, eine Grenze und einen Wert außerhalb des erlaubten Bereichs.
Frage 3 von 4SchwerEine Bestellkomponente besteht isolierte Tests mit einem Stub. Beim Einsatz mit dem echten Zahlungsdienst scheitert das Datenformat. Welche Folgerung ist am besten begründet?
Lösung: Der Stub hat die reale Schnittstelle nicht vollständig abgebildet; ein Integrationstest muss das Zusammenspiel prüfen. — Isolierte Tests und Integrationstests beantworten verschiedene Fragen. Hier liegt die Abweichung an der echten Verbindung.
Frage 4 von 4SchwerEin behobener Fehler soll künftig nicht unbemerkt zurückkehren. Was ist der beste nächste Schritt?
Lösung: Den reproduzierenden Test beibehalten und bei späteren Änderungen erneut ausführen — Ein Regressionstest macht sichtbar, wenn eine spätere Änderung das bereits korrigierte Verhalten wieder beschädigt.

Passend dazu