====== LU07.A07 - Sicherheitsnetz zuerst ======
Schreiben Sie Characterization Tests für eine Funktion, deren Verhalten niemand mehr kennt - und refactoren Sie sie erst danach.
==== Ausgangslage ====
Diese Funktion läuft seit zwei Jahren im Notensystem. Dokumentation gibt es keine, Tests auch nicht.
def notenschnitt(punkte, maximum):
if maximum == 0:
return 1
note = 1 + 5 * (sum(punkte) / len(punkte)) / maximum
if note > 6:
note = 6
return round(note * 2) / 2
==== 1. Verhalten erkunden ====
Rufen Sie die Funktion mit verschiedenen Eingaben auf und notieren Sie, was herauskommt. Denken Sie an die Ränder: leere Liste, ''maximum = 0'', mehr Punkte als das Maximum, exakt die Höchstpunktzahl.
==== 2. Verhalten festhalten ====
In ''main_test.py'' sind sechs Tests vorbereitet, die noch ''0'' als erwarteten Wert enthalten. Tragen Sie den **beobachteten** Wert ein - auch dann, wenn er Ihnen falsch vorkommt. Ein Characterization Test hält fest, was //ist//, nicht was sein sollte.
Raten Sie nicht. Ein geratener Wert fällt sofort durch, weil die Funktion etwas anderes liefert.
Auch der Absturz gehört dazu: ''test_leere_punkteliste'' erwartet eine Ausnahme. Tragen Sie ein, welche tatsächlich auftritt.
==== 3. Refactoren ====
Erst jetzt: sprechende Namen, benannte Konstanten, die Rundungsregel als eigene Funktion. Nach jedem Schritt ''pytest''. Alle sieben Tests bleiben grün.
==== 4. Bewerten ====
Notieren Sie in ''BEFUND.md'', welche Ergebnisse Sie für fachlich falsch halten und was zu tun wäre. **Ändern Sie das Verhalten nicht** - das wäre ein Bugfix und gehört in einen eigenen Commit nach dem Refactoring.
==== Bewertung ====
^ Teil ^ Punkte ^
| Tests (''main_test.py'') | 14 |
| pylint (''main.py'') | 5 |
Die Punkte gibt es nur, wenn der eingetragene Wert dem tatsächlichen Verhalten entspricht **und** die Funktion nach dem Refactoring immer noch so reagiert.
==== Leitfragen ====
* Was passiert bei ''notenschnitt([], 20)''? Ist das ein Verhalten, das man testen kann?
* Warum liefert ''notenschnitt([10], 0)'' den Wert ''1'' und nicht ''1.0''? Spielt das eine Rolle?
* Was bedeutet ''round(note * 2) / 2'' fachlich?
* Der Test hält ein Verhalten fest, das vielleicht ein Bug ist. Warum ist das trotzdem der richtige erste Schritt?
----
https://github.com/templates-python/m323-lu07-a07-characterization
{{tag>M323-LU07 M323-D1I}}
[[https://creativecommons.org/licenses/by-nc-sa/4.0/ch/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) Kevin Maurizi