Das Einrichten einer Testsuite für Ihren Code mag sich wie eine Hürde anfühlen, für die Sie noch nicht bereit sind, aber diese Bibliothek nimmt Ihnen viel Arbeit ab.

Testen ist ein wesentlicher Bestandteil der Softwareentwicklung. Es hilft, Fehler frühzeitig zu erkennen und verringert die Wahrscheinlichkeit von Fehlern auf der ganzen Linie.

Pytest ist eines der beliebtesten Test-Frameworks für Python. Damit können Sie kleine und lesbare Tests schreiben, die mit dem Wachstum Ihrer Anwendung skaliert werden können. Erfahren Sie, wie Sie Pytest mit Ihrem Python-Code einrichten und verwenden.

Pytest einrichten

Bevor Sie Pytest installieren, sollten Sie dies am besten tun Erstellen Sie eine virtuelle Umgebung um Ihre Testumgebung zu isolieren, damit Sie Konflikte mit anderen Paketen und Abhängigkeiten vermeiden können.

Führen Sie zum Erstellen einer virtuellen Umgebung den folgenden Befehl aus, bevor Sie Pytest installieren.

python -m venv-Tests

Dadurch wird eine neue virtuelle Umgebung namens tests in Ihrem aktuellen Verzeichnis erstellt. Um die Umgebung zu aktivieren, führen Sie diesen Befehl aus, wenn Sie Linux oder Mac verwenden:

instagram viewer

source tests/bin/activate

Führen Sie für Windows diesen Befehl aus:

tests\\Scripts\\aktivieren

Um Pytest zu installieren, können Sie pip, den Python-Paketmanager, mit diesem Befehl in Ihrem Terminal verwenden:

pip installieren pytest

Wenn Sie Pip nicht haben, machen Sie sich keine Sorgen; du kannst Installieren Sie Pip unter Windows, Mac und Linux.

Führen Sie den folgenden Befehl aus, um zu überprüfen, ob Sie Pytest korrekt installiert haben.

pytest --version

Dies sollte die installierte Versionsnummer zurückgeben.

Erstellen Sie Ihren ersten Test

Betrachten Sie die folgende Funktion, die zwei Zahlen addiert und das Ergebnis zurückgibt.

defadd_numbers(a, b):
zurückkehren a+b

Bei dieser Funktion können mehrere Dinge schief gehen. Überlegen Sie beispielsweise, was passiert, wenn Sie die Funktion mit nicht numerischen Werten wie None oder einem Wert vom Typ Zeichenfolge aufrufen. Dies sind einige der potenziellen Randfälle, die dazu führen können, dass die Funktion fehlschlägt.

Einer der ersten Tests, die Sie schreiben, sollte überprüfen, ob die Funktion das erwartete Ergebnis zurückgibt. Dazu können Sie das Schlüsselwort assert verwenden, um die tatsächliche Ausgabe der Funktion mit der erwarteten Ausgabe zu vergleichen. Im Fall der Funktion add_numbers könnte die Testfunktion so aussehen:

deftest_add_numbers():
behaupten add_numbers(2, 3) == 5
behaupten add_numbers(-1, 1) == 0
behaupten add_numbers(0, 0) == 0

Diese Testfunktion enthält drei Assert-Anweisungen, von denen jede die Ausgabe der Funktion add_numbers mit einem erwarteten Wert vergleicht. Der erste Test prüft, ob das Addieren von 2 und 3 5 zurückgibt, der zweite Test prüft, ob das Addieren von -1 und 1 0 zurückgibt, und der dritte Test prüft, ob das Addieren von 0 und 0 0 zurückgibt.

So führen Sie Tests mit Pytest durch

Nachdem Sie Ihre Tests geschrieben haben, besteht der nächste Schritt darin, sie auszuführen. Navigieren Sie dazu mit Pytest zu dem Verzeichnis, das Ihre Testdatei enthält, und führen Sie den Befehl pytest aus:

pytest

Wenn alles wie erwartet funktioniert, sehen Sie eine Meldung, dass alle Tests erfolgreich bestanden wurden. Wenn jedoch eine der Behauptungen fehlschlägt, meldet Pytest einen Fehler und zeigt Ihnen die Eingabewerte, die den Fehler verursacht haben.

Angenommen, Sie haben die folgende Testfunktion für die Funktion add_numbers ausgeführt:

deftest_add_numbers():
behaupten add_numbers(2, 3) == 6
behaupten add_numbers(-1, 1) == 0
behaupten add_numbers(0, 0) == 0

Die erste Assertion schlägt fehl, da der erwartete Wert 6 war, der tatsächliche Wert jedoch 5 war (die Summe aus 2 und 3). Pytest gibt die folgende Nachricht zurück:

Diese Meldung zeigt Ihnen die Eingabewerte, die den Wert verursacht haben, und sagt Ihnen auch, was der tatsächliche Wert sein sollte. Dadurch lassen sich Fehler in Ihrem Code schnell identifizieren und beheben.

Verwenden von Pytest.raises zum Geltendmachen von Ausnahmen

Lassen Sie uns nun einen Test schreiben, um einen der Grenzfälle der Funktion add_numbers abzudecken. Wenn Sie der Funktion ein nicht numerisches Argument wie None übergeben, sollte Python eine TypeError-Ausnahme auslösen.

Das solltest du schon sein Umgang mit Ausnahmen in Ihren Python-Programmen, und Sie können testen, ob Ihr Code sie auch korrekt auslöst.

Kopieren Sie dazu die folgende Testfunktion in Ihre Datei. Es verwendet den Kontextmanager pytest.raises, um zu prüfen, ob der Aufruf der Funktion add_number mit „None“ eine TypeError-Ausnahme auslöst.

importieren pytest

deftest_add_numbers_with_invalid_inputs():
mit pytest.raises (TypeError):
add_numbers(Keiner, 2)

Führen Sie dann Pytest über die Befehlszeile aus. Wenn die Ausnahme nicht ausgelöst wird, schlägt der Test fehl.

Sie können weiter gehen und die Details der Ausnahmemeldung überprüfen. Der Kontextmanager erzeugt ein ExceptionInfo-Objekt mit den Details.

Bestätigen Sie in dieser Testfunktion beispielsweise die Ausnahmemeldung wie folgt:

deftest_add_numbers_with_invalid_inputs():
mit pytest.raises(TypeError) als exc_info:
add_numbers(Keiner, 2)

behaupten exc_info.value.args[0] == "nicht unterstützte Operandentypen für +: 'NoneType' und 'int'"

Wenn die Nachricht nicht mit der im Test übereinstimmt, zeigt Pytest einen Fehler an.

So verwenden Sie parametrisierte Tests, um mehrere Eingaben gleichzeitig zu testen

Anstatt eine Funktion mit mehreren Eingaben wie folgt manuell aufzurufen:

deftest_add_numbers():
behaupten add_numbers(2, 3) == 6
behaupten add_numbers(-1, 1) == 0
behaupten add_numbers(0, 0) == 0

Pytest bietet eine parametrisierte Testfunktion, mit der Sie dasselbe einfacher tun können. So können Sie die obige Testfunktion umschreiben:

importieren pytest

@pytest.mark.parametrize("a, b, erwartet", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_add_numbers(a, b, erwartet):
behauptenadd_numbers(a, b)== erwartet

So führen Sie mehrere Tests durch

Bisher haben Sie nur zwei Tests für die Funktion add_numbers geschrieben. Komplexere Funktionen mit mehr Tests können Sie in einer Klasse gruppieren.

So würden Sie beispielsweise eine Testklasse für die Add-Funktion erstellen.

KlasseTestAddFunction:
@pytest.mark.parametrize("a, b, erwartet", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftest_addition_with_numbers(selbst, a, b, erwartet):
behaupten add_numbers (a, b) == erwartet

deftest_add_numbers_with_invalid_inputs(selbst):
mit pytest.raises (TypeError) als exc_info:
add_numbers(Keiner, 2)
behaupten exc_info.value.args[0] == "nicht unterstützte Operandentypen für +: 'NoneType' und 'int'"

Beachten Sie, dass Sie dem Klassennamen „Test“ voranstellen müssen, damit Pytest ihn als Testklasse identifizieren und ausführen kann.

Pytest hat viele weitere Funktionen

Mit Pytest können Sie automatisch überprüfen, ob Ihr Code wie erwartet funktioniert. Pytest bietet viele weitere Funktionen, z. B. Fixtures, mit denen Sie Testdaten und Markierungen zum Einrichten von Metadaten zu Ihren Testfunktionen einrichten und abbauen können.

Darüber hinaus können Sie Pytest in Ihre CI-Pipeline integrieren und automatisch und kontinuierlich Tests ausführen, wenn Sie Ihren Code ändern.