====== LU03c - PyTest: Input und Output ====== PyTest kann Ausgaben des Programms und Eingaben des Benutzers im Terminal simulieren. ===== Ausgaben ===== Manche Funktionen erzeugen Ausgaben im Terminal. Besonders bei Fehlersituationen werden solche Ausgaben als Teil eines Logfiles genutzt, um Fehler zu protokollieren. Andere Funktionen schreiben Werte in eine Datei. Beide Arten von Ausgaben können wir im Rahmen von Unit Tests mit PyTest überprüfen. Indem wir unserer Testfunktion ''capsys'' als Argument mitgeben, können wir auf den Output einer Funktion zugreifen: def test_normal(capsys): factorial(7) output = capsys.readouterr().out assert output == '5040\n' In diesem Beispiel holen wir mittels ''capsys.readouterr().out'' den Output der Funktion ''factorial(x)''. Diesen Output können wir dann mittels ''assert'' mit dem erwarteten Output vergleichen. ==== Beispiel ==== Anhand dieses einfachen Beispiels siehst du, wie eine Python-Funktion getestet werden kann. === factorial.py === Ich verwende wieder das Beispiel aus dem letzten Kapitel. Diesmal gibt die Funktion das Resultat im Terminal aus. def factorial(number): fact = 1 for count in range(1, number + 1): fact = fact * count print fact === test_factorial.py === Dieses Modul enhält meine Unit Tests. from factorial import factorial def test_normal(): factorial(7) output = capsys.readouterr().out assert output == '5040\n' def test_zero(): factorial(0) output = capsys.readouterr().out assert output == '1\n' ===== Eingaben ===== Zum Simulieren von Eingaben steht uns ''monkeypatch'' zur Verfügung. Neben diversen anderen Funktionen, kann ''monkeypatch'' die Eingaben des Benutzers simulieren. def test_normal(capsys, monkeypatch): inputs = iter([7]) monkeypatch.setattr('builtins.input', lambda _: next(inputs)) factorial() captured = capsys.readouterr() assert captured.out == '5040\n' In diesem Beispiel wird die Zahl ''7'' als Benutzereingabe an die getestete Funktion gesendet. Der Befehl ''monkeypatch.setattr('builtins.input', lambda _: next(ITERATOR))'' erwartet eine Aufzählung von Eingabewerten. Diese Aufzählung erzeugen wir mit dem Befehl ''inputs = iter([7])''. ==== Beispiel ==== Nun passen wir das Beispiel um den Einsatz von Benutzereingaben an. === factorial.py === def factorial(): number = int(input('Number >')) fact = 1 for count in range(1, number + 1): fact = fact * count print fact === test_factorial.py === Dieses Modul enhält meine Unit Tests. from factorial import factorial def test_normal(capsys, monkeypatch): inputs = iter([7]) monkeypatch.setattr('builtins.input', lambda _: next(inputs)) factorial() captured = capsys.readouterr() assert captured.out == '5040\n' def test_zero(capsys, monkeypatch): inputs = iter([0]) monkeypatch.setattr('builtins.input', lambda _: next(inputs)) factorial() captured = capsys.readouterr() assert captured.out == '1\n' ---- {{tag>M450-LU03}} [[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Marcel Suter