Programmierpraktikum SoSe 2024, Bachelor Informatik, FU Berlin
ProPra2024 > Testen > Unittests > m_pytest_parametrize

@pytest.mark.parametrize: Testfälle per Eingabe-Tabelle parametrisieren

Idea

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.

Detailed

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 Bereich a bis z, keine Umlaute o.ä.) und auch keine Ziffern sind (im Bereich 0 bis 9).
    • Sie liefert ein Tupel aus dem alphabetisch kleinsten Kleinbuchstaben (als str) und der numerisch kleinsten Ziffer (als int, nicht str).
    • Sollte es in input keinen Kleinbuchstaben geben, wird stattdessen None geliefert.
    • Sollte es in input keine Ziffer geben, wird stattderer None geliefert.
  • 3 Implementieren Sie eine Testfunktion
    def test_smallest_letter_and_digit(input, letter, digit)
    die prüft, ob smallest_letter_and_digit die Eingabe input 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?
Trace

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.