Fehler, Validierung und Fehlersuche · Übung
Reproduziere einen Fehler zuverlässig
Eine Meldung wie „Der Preis ist manchmal falsch“ lässt sich schwer untersuchen. Eine Reproduktion macht daraus ein konkretes Experiment:
den genauen Ausgangscode;
die genaue Eingabe oder den genauen Funktionsaufruf;
das erwartete Ergebnis;
das tatsächliche Ergebnis.
Wenn dieselben Schritte jedes Mal dasselbe Problem auslösen, kannst du mögliche Korrekturen prüfen, ohne raten zu müssen, ob der Fehler zufällig verschwunden ist.
Wähle den kleinsten fehlschlagenden Fall
Angenommen, eine Funktion ordnet Paketgewichte ein:
def shipping_label(weight):
if weight < 10:
return "standard"
return "heavy"
Eine hilfreiche Meldung lautet:
Der Aufruf
shipping_label(10)sollte"standard"zurückgeben, weil der Standardversand Gewichte bis einschließlich 10 umfasst. Tatsächlich gibt er"heavy"zurück.
Die Zahl 10 liegt genau auf der Grenze der Regel. Wenn du sie testest, erkennst du, ob der Vergleich diesen Wert einschließt oder ausschließt.
Teste die Umgebung einer Grenze
Prüfe bei einer Grenze von 10:
print(shipping_label(9))
print(shipping_label(10))
print(shipping_label(11))
Die Werte direkt unterhalb, auf und oberhalb einer Grenze decken oft Fehler mit <, <=, > und >= auf.
Das ist aussagekräftiger, als viele voneinander unabhängige Werte auszuprobieren. Du prüfst jeweils eine Annahme.
Behalte die Reproduktion während der Korrektur bei
Ein gezieltes Beispiel kann zu einer Regressionsprüfung werden: Führe nach der Korrektur dasselbe Beispiel erneut aus. Prüfe auch benachbarte Werte, damit du sicherstellst, dass die Korrektur den Fehler nicht nur an eine andere Stelle verschoben hat.
Der Ablauf ist:
Formuliere die Anforderung genau.
Finde eine kleine Eingabe, die sie verletzt.
Bestätige das falsche Ergebnis.
Grenze den relevanten Code ein.
Ändere eine Ursache.
Führe den fehlschlagenden Fall und benachbarte Fälle erneut aus.
Dieser letzte erneute Durchlauf macht aus „Ich habe etwas geändert“ einen Beleg dafür, dass das Verhalten jetzt der Anforderung entspricht.
Die Regel besagt, dass Kinder bis einschließlich 12 Jahren eine Kinderkarte erhalten. Welche Testgruppe prüft die Grenze am unmittelbarsten?
Aufgabe
Die Preisregel des Veranstaltungsorts lautet:
Besucher unter 18 Jahren zahlen
$8;Besucher ab 65 Jahren zahlen
$10;alle anderen zahlen
$14.
Die vorgegebene Funktion behandelt einen Grenzwert falsch. Führe die drei vorbereiteten Fälle aus, um das Problem zu reproduzieren. Korrigiere dann den Vergleich.
Die endgültige Ausgabe muss lauten:
14
10
10
Füge keinen Sonderfall nur für die vorbereiteten Aufrufe hinzu. Sorge dafür, dass die Regel für jedes Alter funktioniert.