Aufgabe 20 - pytest II - Der Vertragstest
Aufgabe 20 - pytest II - Der Vertragstest
Abschnitt betitelt „Aufgabe 20 - pytest II - Der Vertragstest“Worum geht es?
Abschnitt betitelt „Worum geht es?“Testen unter Vererbung und Polymorphismus, eine ausdrückliche Lehrplan-Kompetenz: Sie schreiben Vertragstests, die jede Subklasse einer Hierarchie bestehen muss, und weisen deren Wert nach, indem Sie absichtlich eingebaute Fehler in fremdem Code aufspüren (siehe Kapitel Testen mit pytest, Abschnitt Vertragstest). Getestet werden Ihre Formen-Hierarchie aus Aufgabe 12 und die Mediathek aus Aufgabe 09.
Was Sie dafür brauchen
Abschnitt betitelt „Was Sie dafür brauchen“- Kapitel Testen mit pytest vollständig; Aufgabe 19.
- Ihre
shapes.py(Aufgabe 12) undmedia.py(Aufgabe 09). - Für Teil C eine Tauschpartnerin oder einen Tauschpartner.
Welche Kompetenzen Sie erwerben und zeigen
Abschnitt betitelt „Welche Kompetenzen Sie erwerben und zeigen“- Sie definieren Verträge als Testklassen und lassen sie über Vererbung für jede Subklasse laufen.
- Sie prüfen Gleitkommaergebnisse korrekt mit
pytest.approx. - Sie beurteilen die Abdeckung einer Testreihe anhand real gefundener und verpasster Fehler.
Pädagogische Einordnung
Abschnitt betitelt „Pädagogische Einordnung“- Reproduktion: bekannte Testmuster auf einzelne Klassen anwenden (Teil A).
- Reorganisation und Transfer: das Vertragstest-Muster auf eine ganze Hierarchie übertragen (Teil B).
- Reflexion, Problemlösung und Urteilsbildung: Testlücken anhand eingeschleuster Fehler aufdecken, die Testreihe verbessern und ihren Wert für künftige Erweiterungen beurteilen (Teile C und D).
Arbeitsaufträge
Abschnitt betitelt „Arbeitsaufträge“Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.
Teil A - Bekannte Werte
Abschnitt betitelt „Teil A - Bekannte Werte“- Schreiben Sie in
test_shapes.pyje einen Test pro Klasse mit bekannten Werten: Kreis mit Radius 1 hat Flächepytest.approx(3.14159, abs=0.001); Rechteck 3 mal 4 hat Fläche 12 und Umfang 14; wählen Sie für das Dreieck ein Tripel mit bekanntem Ergebnis (etwa 3, 4, 5). - Recherchieren Sie kurz, warum
assert circle.area() == 3.14159scheitern muss und waspytest.approxstattdessen tut. Zwei Kommentarsätze genügen.
Teil B - Der Vertragstest für Formen
Abschnitt betitelt „Teil B - Der Vertragstest für Formen“- Definieren Sie eine Klasse
ShapeContract(Name beginnt bewusst nicht mitTest) mit einer Methodecreate_shape(), dieNotImplementedErrorwirft, und Vertragstests, die für jede Form gelten:area()undperimeter()liefern positive Zahlen;describe()liefert einen nicht leeren String, der den Klassennamen enthält. - Leiten Sie pro konkreter Form eine Testklasse ab (
TestCircle,TestRectangle,TestTriangle, dazu Ihr Sechseck oder Quadrat aus Aufgabe 12), die nurcreate_shape()überschreibt. - Ergänzen Sie im Vertrag einen parametrisierbaren Fehlerfalltest: Ungültige Konstruktorargumente werfen
ValueError. Da die Argumente je Klasse verschieden sind, lösen Sie das über eine weitere überschreibbare Methodeinvalid_arguments(), die eine Liste von Argument-Tupeln liefert. - Führen Sie
pytest -vaus und zählen Sie nach: Anzahl Vertragstests mal Anzahl Formklassen; stimmt die Testanzahl?
Teil C - Der eingeschleuste Fehler
Abschnitt betitelt „Teil C - Der eingeschleuste Fehler“- Bauen Sie in eine Kopie Ihrer
shapes.pygenau einen subtilen Fehler in eine Subklasse ein (etwa Umfang des Rechtecks mit+statt* 2, oder Heron mit falschem Vorzeichen). Ihre Tauschpartnerin oder Ihr Tauschpartner tut dasselbe. - Tauschen Sie die präparierten Dateien und lassen Sie Ihre eigene Testreihe gegen die fremde Datei laufen. Findet sie den Fehler?
- Falls nein: Welcher Test fehlte? Ergänzen Sie ihn, weisen Sie den Fehler damit nach und dokumentieren Sie den Fall (eingeschleuster Fehler, verpasst von, gefunden durch).
Teil D - Expertenteil: Vertragstest für die Mediathek
Abschnitt betitelt „Teil D - Expertenteil: Vertragstest für die Mediathek“- Übertragen Sie das Muster selbstständig auf die Medium-Hierarchie: ein
MediumContractmit mindestens vier Vertragstests (frisch erzeugt ist nichts entlehnt; nachborrow()schon; doppeltesborrow()wird abgelehnt;describe()enthält Titel und Jahr) und je einer Testklasse pro Medienart. - Ergänzen Sie eine neue Medienart
EBook(Medium)mit einem Zusatzfeld und binden Sie sie mit einer vierzeiligen Testklasse an. Wie viele Vertragstests laufen jetzt automatisch für die neue Klasse mit? - Begründen Sie in drei Sätzen, warum genau dieser Mechanismus wertvoll ist, wenn im nächsten Jahr eine fremde Person die Hierarchie erweitert (Stichworte: Substitutionsprinzip, Regression).
- Grenzfrage: Nennen Sie eine Eigenschaft einer konkreten Medienart, die nicht in den Vertragstest gehört, und erklären Sie, woran Sie die Trennlinie zwischen Vertrag und Spezialfall festmachen.
Wissenscheck
Abschnitt betitelt „Wissenscheck“- Warum darf die Vertragsklasse nicht mit
Testbeginnen, und was würde sonst passieren? - Über welchen Mechanismus kommen die geerbten Tests zu ihrem jeweils passenden Testobjekt?
- Wozu dient
pytest.approx, und warum ist==bei Gleitkommazahlen gefährlich? - Ein eingeschleuster Fehler wurde von der Testreihe verpasst. Was sagt das über die Testreihe, und was ist die richtige Konsequenz?
- Was kostet die Anbindung einer neuen Subklasse an einen bestehenden Vertragstest, und was liefert sie?
test_shapes.py und test_media.py mit allen Vertragstests, das Fehlertausch-Protokoll aus Teil C und ein grüner pytest -v-Lauf. Alles committet.