Programme planen, bauen und testen · Übung
Arbeite Beispiele von Hand durch
Bevor du Python nach einem Ergebnis fragst, arbeite einige Ergebnisse selbst durch. Ein von Hand durchgerechnetes Beispiel macht eine Anforderung konkret.
Die Punktzahl des Quiz beginnt bei null und erhält für jedes True-Ergebnis einen Punkt. Hier ist eine Ergebnisliste:
[True, False, True]
Verfolge die Punktzahl Ergebnis für Ergebnis:
| Ergebnis | Punktzahl danach |
|---|---|
| Start | 0 |
True | 1 |
False | 1 |
True | 2 |
Schreibe die erwartete Punktzahl 2 auf, bevor du quiz_score() schreibst.
Warum solltest du das zuerst tun?
Wenn der Code später 1 oder 3 zurückgibt, hast du eine genaue Abweichung, die du untersuchen kannst. Ohne ein unabhängig ermitteltes erwartetes Ergebnis ist es verlockend, einfach der Ausgabe des Programms zu vertrauen.
Das Durchrechnen der Punktzahl deckt auch unbeantwortete Fragen auf:
Ergibt eine leere Ergebnisliste eine Punktzahl von null?
Fügt jede richtige Antwort genau einen Punkt hinzu?
Kann die Punktzahl jemals größer als die Anzahl der Ergebnisse sein?
Diese Fragen gehören in die Anforderungen. Sie vor der Umsetzung zu entdecken ist weniger aufwendig, als sie erst zu finden, wenn mehrere Funktionen bereits auf einer Annahme beruhen.
Verwende unterschiedliche Arten von Beispielen
Wähle eine kleine Gruppe mit unterschiedlichen Zwecken:
einen Normalfall;
einen Fall mit null oder einer leeren Sammlung, sofern er erlaubt ist;
eine wichtige Grenze;
einen Fall, in dem jede Antwort richtig oder jede Antwort falsch ist.
Bei der Quizpunktzahl prüft eine leere Liste den Startwert. Eine Liste ausschließlich mit True-Werten prüft, ob jede richtige Antwort gezählt wird. Jedes Beispiel hat eine Aufgabe.
| Ergebnisse | Erwartete Punktzahl | Zweck |
|---|---|---|
[True, False, True] | 2 | normale Mischung |
[] | 0 | leerer Fall |
[False] | 0 | keine richtige Antwort |
[True, True, True, True] | 4 | jede Antwort richtig |
Ermittle erwartete Ergebnisse unabhängig
Berechne ein „erwartetes“ Ergebnis nicht durch einen Aufruf der Funktion, die du gerade testest:
expected = quiz_score([True, False, True])
Damit fragst du nur denselben Code, ob er sich selbst zustimmt.
Halte stattdessen das Ergebnis fest, das du aus der Anforderung hergeleitet hast:
expected = 2
Das Beispiel ist nützlich, weil es aus einem getrennten Gedankengang stammt. Wenn eine Funktion ihr eigenes erwartetes Ergebnis erfindet, ist das ein bisschen so, als dürfte sie ihre eigenen Hausaufgaben benoten.
Warum sollte ein erwartetes Ergebnis unabhängig von der getesteten Funktion berechnet werden?
Aufgabe
Plane und implementiere quiz_score(results).
Die Regel lautet:
start at zero and add one point for every True result
Der Startcode enthält drei Beispiel-Dictionarys. Verfolge vor dem Implementieren der Funktion jede Ergebnisliste von Hand und ersetze ihr None durch die erwartete Punktzahl.
Implementiere dann die Funktion und behalte die Schleife bei, die die drei Punktzahlen ausgibt. Die endgültige Ausgabe muss lauten:
2
0
3
Deine Funktion muss auch für andere Listen mit booleschen Ergebnissen funktionieren.