Wie viele Testfälle braucht ein Fahrpreis?
Äquivalenzklassen und Grenzwerte sind zwei Wege, aus unendlich vielen Eingaben wenige gute Testfälle auszuwählen. Sie finden damit die meisten Fehler mit wenig Aufwand.
Ein Verkehrsverbund hat vier Preise nach Alter. Die Fahrkartenautomaten nehmen jede Zahl von 0 bis 120. Niemand kann 121 Fälle prüfen. Man braucht eine Auswahl.
Am Ende dieser Lektion
Notiz
Ich kann Testfälle aus Äquivalenzklassen und Grenzwerten auswählen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Äquivalenzklasse | eine Gruppe von Eingaben, die das Programm gleich behandelt | |
| Grenzwert | der letzte und der erste Wert an der Kante einer Klasse | 17 und 18 |
| Testtabelle | eine Liste aus Eingaben und erwarteten Ergebnissen | |
| ungültige Eingabe | ein Wert, den das Programm ablehnen muss | -1 |
| Stichprobe | ein einzelner Wert aus einer Klasse |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Äquivalenzklasse fasst gleich behandelte Eingaben zusammen
Eine Äquivalenzklasse ist eine Gruppe von Eingaben, bei denen das Programm dasselbe tut. Wenn 8 richtig behandelt wird, wird 12 sehr wahrscheinlich auch richtig behandelt.
Aus jeder Klasse reicht deshalb eine Stichprobe. Auch die ungültigen Eingaben bilden Klassen, zum Beispiel Zahlen unter 0.
Ein Beispiel: Klassen des Fahrpreises
| Klasse | Alter | Preis in Cent | Stichprobe |
|---|---|---|---|
| Ungültig, zu klein | unter 0 | abgelehnt | -5 |
| Kinder unter 6 | 0 bis 5 | 0 | 3 |
| Kinder und Jugendliche | 6 bis 17 | 150 | 12 |
| Erwachsene | 18 bis 64 | 300 | 40 |
| Seniorinnen und Senioren | 65 und älter | 200 | 70 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Fehler sitzen an den Kanten der Klassen
Programmierende vertauschen oft < und <=. Solche Fehler zeigen sich nur an der Kante einer Klasse, nicht in ihrer Mitte.
Testen Sie deshalb die Grenzwerte: den letzten Wert der einen Klasse und den ersten der nächsten. Für den Übergang von 17 auf 18 sind das genau diese beiden.
Ein Beispiel: die Grenzwerte des Fahrpreises
| Grenze | Letzter Wert unten | Erster Wert oben | Erwartete Preise |
|---|---|---|---|
| Kind unter 6 | 5 | 6 | 0 und 150 |
| Jugend bis 17 | 17 | 18 | 150 und 300 |
| Erwachsen bis 64 | 64 | 65 | 300 und 200 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Den Preis an den Grenzen im Lab prüfen
Im Lab legen Sie fahrpreis.py an. Die Datei enthält absichtlich einen Fehler an einer Grenze. Sie prüfen nur die sechs Grenzwerte aus der Tabelle.
Die Schleife ruft die Funktion sechsmal auf. Vergleichen Sie jede Zeile der Ausgabe mit dem, was die Tabelle erwartet.
Den Ordner anlegen
mkdir -p ~/testlaborHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Hineingehen
cd ~/testlaborHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Preisfunktion schreiben
printf 'def fahrpreis(alter):\n if alter < 6:\n return 0\n if alter < 17:\n return 150\n if alter < 65:\n return 300\n return 200\n' > fahrpreis.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die sechs Grenzwerte durchgehen
for a in 5 6 17 18 64 65; do python3 -c "from fahrpreis import fahrpreis; print($a, fahrpreis($a))"; doneHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele glauben, mehr Testfälle seien immer besser. Zehn Werte aus derselben Klasse finden aber denselben Fehler wie einer. Wählen Sie lieber eine Stichprobe je Klasse und die Werte an jeder Kante.
Eine Testtabelle im Code
def fahrpreis(alter):
if alter < 6:
return 0
if alter < 17:
return 150
if alter < 65:
return 300
return 200
# Ein Testfall ist eine Eingabe und ein erwarteter Preis in Cent.
faelle = [[5, 0], [6, 150], [17, 150], [18, 300], [64, 300], [65, 200]]
for fall in faelle:
bekommen = fahrpreis(fall[0])
if bekommen == fall[1]:
print(fall[0], "ok")
else:
print(fall[0], "FEHLER, erwartet", fall[1], "bekommen", bekommen)