0%

Programme planen, bauen und testen · Übung

Suche gezielt nach Grenzfällen

Ein normales Beispiel zeigt, dass ein Programm in einem unkritischen Bereich funktioniert. Ein Grenzfall prüft einen Wert nahe der Grenze einer Regel.

Der Quizplan verlangt, dass jeder Titel, jede Frage und jede erwartete Antwort brauchbaren Text enthält:

def has_usable_text(text):
    return len(text.strip()) > 0

"Ocean Facts" zu testen ist hilfreich, zeigt aber nicht, ob die Funktion leeren Text oder Text mit umgebenden Leerzeichen behandelt. Prüfe auch diese Grenzfälle:

assert has_usable_text("") is False
assert has_usable_text("   ") is False
assert has_usable_text("?") is True

Der Fall mit einem Zeichen ist wichtig, weil die Anforderung „nicht leer“ lautet und nicht „mindestens zwei Zeichen“.

Typische Stellen für die Suche

Beim Quizprogramm liegen Grenzfälle oft hier:

  • bei genau drei Fragen, dem kleinsten gültigen Plan;

  • bei null richtigen Antworten oder der vollen Punktzahl;

  • bei einem leeren String, einer leeren Liste oder einem leeren Dictionary;

  • bei Text, der nur Leerzeichen enthält;

  • bei einer Frage oder Antwort mit einem Zeichen;

  • bei zwei Fragen, die nach dem Bereinigen übereinstimmen;

  • bei einer Antwort mit Leerzeichen oder anderer Groß- und Kleinschreibung.

Füge nicht blind alle diese Fälle hinzu. Wähle Fälle, die das von den Anforderungen zugesagte Verhalten verändern können.

Grenzwerttabellen zeigen Lücken

Schreibe für eine Textregel vor dem Code eine kleine Tabelle:

Ursprünglicher TextNach strip()Brauchbar?
""""False
" """False
"?""?"True
" honey ""honey"True

Die Tabelle macht die Grenze sichtbar: Nach dem Bereinigen sind null Zeichen unbrauchbar und ein Zeichen brauchbar.

Testdaten sollten einen Grund haben

Jeder Testfall sollte eine Frage beantworten:

  • Gilt Text nur aus Leerraumzeichen als leer?

  • Wird die kürzeste nicht leere Frage akzeptiert?

  • Bleibt gewöhnlicher Text beim Bereinigen erhalten?

Zufällige Werte mögen an der Kiste rütteln. Ein gezielter Grenzfall zeigt dir dagegen genau, welches Scharnier du prüfst.

Die Prüfung der Fragenanzahl ist ab drei Fragen erfolgreich. Welcher Fall prüft am unmittelbarsten, ob die Grenze eingeschlossen ist?

Aufgabe

Implementiere und teste has_usable_text(text) anhand dieses Vertrags:

  • Nach dem Entfernen umgebender Leerraumzeichen liefert leerer Text False.

  • Ein oder mehrere verbleibende Zeichen liefern True.

Der Startcode enthält eine Funktion mit zwei Fehlern bei Grenzfällen und eine Liste cases mit kleinen Dictionarys. Ersetze jedes None in cases durch den erwarteten booleschen Wert.

Behalte die Schleife bei, die die Felder "text" und "expected" jedes Falls mit assert prüft. Wenn alle Prüfungen erfolgreich sind, gib Folgendes aus:

Boundary checks passed.

Deine Funktion muss auch für Text funktionieren, der nicht in cases aufgeführt ist.