@pytest.mark.parametrize: Testfälle per Eingabe-Tabelle parametrisieren
Ziel
Ich kann mit pytest tabellengesteuerte Testfälle gestalten.
Hintergrund
Es gibt häufig Tests, bei denen die gleiche Testlogik mit vielen verschiedenen Eingabeparametern benutzt werden sollte (und natürlich zugehörigen Erwartungen für die Ausgabe), um relevant verschiedene Fälle abzudecken.
Der naive Weg hierzu wäre, die Testlogik in eine Hilfsfunktion mytest
mit entsprechend vielen Parametern zu stecken
und dann in jedem Testfall nur genau einen Aufruf von mytest
zu schreiben.
Bei 17 Testfällen braucht man so also 18 Funktionen.
Aber mit pytest
geht es viel schlanker und eleganter, mit nur einer einzigen Funktion und
einer Datentabelle.
Arbeitsschritte
- 1 Legen Sie die Datei
pytests/test_pytest_parametrize.py
an. -
2 Implementieren Sie darin eine Funktion
smallest_letter_and_digit(input: str) -> tuple[str | None, int | None]
mit folgender Semantik:- Die Funktion ignoriert alle Zeichen in
input
, die keine Kleinbuchstaben sind (nur solche im Bereicha
bisz
, keine Umlaute o.ä.) und auch keine Ziffern sind (im Bereich0
bis9
). - Sie liefert ein Tupel aus dem alphabetisch kleinsten Kleinbuchstaben (als
str
) und der numerisch kleinsten Ziffer (alsint
, nichtstr
). - Sollte es in
input
keinen Kleinbuchstaben geben, wird stattdessenNone
geliefert. - Sollte es in
input
keine Ziffer geben, wird stattdererNone
geliefert.
- Die Funktion ignoriert alle Zeichen in
-
3 Implementieren Sie eine Testfunktion
def test_smallest_letter_and_digit(input, letter, digit)
die prüft, obsmallest_letter_and_digit
die Eingabeinput
in die Ausgabe(letter, digit)
überführt. - Lesen Sie auf "How to parametrize" nach, wie man diese Funktion mit einer Tabelle von Testdaten versorgen kann.
- 4 Schreiben Sie eine solche Versorgung hin.
Sie benötigen in Ihrer Tabelle 6 grundlegend verschiedene Testfälle:
4 für alle nötigen Kombinationen von
None
und Nicht-None
, 2 weitere für grundlegend verschiedene Inputs für 2 dieser Fälle, wo die Logik intern anders funktioniert. - Falls Sie gleich alles richtig gemacht haben: Probieren Sie auch aus, wie die Ausgabe im Versagensfall aussieht; studieren Sie das in Ruhe, denn es ist im Ernstfall sehr nützlich.
- 1
pytest pytests/test_pytest_parametrize.py
- 1 Welchen Nachteil hätte es, wenn man nicht
pytest.mark.parametrize
benutzen würde, sondern in der Testfunktion eine Schleife macht, um deren Einträge zu durchlaufen? - 2 Kann man eine solche
pytest.mark.parametrize
-Tabelle aus einer Datei einlesen? Wie würde so ein Konstrukt gebaut?
Abgabe
Geben Sie den Quellcode ab, wie er am Ende der Aufgabe vorliegt.
Geben Sie ein Kommandoprotokoll ab, das genau nur die Eingaben und Ausgaben der obigen Kommandos 1, 2, … enthält. Entfernen Sie vor Abgabe eventuelle Fehlversuche und sonstige zusätzliche Kommandos aus dem Protokoll.
Geben Sie ein Markdown-Dokument ab mit knappen Antworten zu den oben gestellten Fragen
1, 2, … Geben Sie diese Marker mit an.
Geben Sie ggf. Beispiele oder benutzte Quellen an.