Beispiele

Ihr könnt einfach eine Datei test_one.py anlegen mit folgendem Inhalt:

1def test_sorted():
2    assert sorted([4, 2, 1, 3]) == [1, 2, 3, 4]

Die Funktion test_sorted() wird von pytest als Testfunktion erkannt, weil sie mit test_ beginnt und in einer Datei steht, die mit test_ beginnt. Wenn der Test ausgeführt wird, bestimmt die assert-Anweisung, ob der Test erfolgreich war oder nicht. assert ist ein in Python eingebautes Schlüsselwort und löst eine AssertionError-Ausnahme aus, wenn der Ausdruck nach assert falsch ist. Jede nicht abgefangene Ausnahme, die innerhalb eines Tests ausgelöst wird, führt dazu, dass der Test fehlschlägt.

pytest ausführen

$ cd docs/test/pytest
$ pytest test_one.py
============================= test session starts ==============================

collected 1 item

test_one.py .                                                            [100%]

============================== 1 passed in 0.00s ===============================

Der Punkt hinter test_one.py bedeutet, dass ein Test durchgeführt und bestanden wurde. [100%] ist eine Prozentanzeige, die angibt, wie viele Tests der Testsitzung bisher durchgeführt wurden. Da es nur einen Test gibt, entspricht ein Test 100% der Tests. Wenn ihr mehr Informationen benötigt, könnt ihr -v oder --verbose verwenden:

$ pytest -v test_one.py
============================= test session starts ==============================

collected 1 item

test_one.py::test_sorted PASSED                                          [100%]

============================== 1 passed in 0.00s ===============================

test_two.py schlägt hingegen fehl:

$ pytest test_two.py
collected 1 item

test_two.py F                                                            [100%]

=================================== FAILURES ===================================
_________________________________ test_failing _________________________________

    def test_failing():
>       assert sorted([4, 2, 1, 3]) == [0, 1, 2, 3]
E       assert [1, 2, 3, 4] == [0, 1, 2, 3]
E         At index 0 diff: 1 != 0
E         Use -v to get more diff

test_two.py:2: AssertionError
=========================== short test summary info ============================
FAILED test_two.py::test_failing - assert [1, 2, 3, 4] == [0, 1, 2, 3]
============================== 1 failed in 0.03s ===============================

Der fehlgeschlagene Test, test_in, erhält einen eigenen Abschnitt, um uns zu zeigen, warum er fehlgeschlagen ist. Und pytest sagt uns genau, was der erste Fehler ist. Dieser zusätzliche Abschnitt wird Traceback genannt. Das sind schon eine Menge Informationen, aber es gibt eine Zeile, die besagt, dass wir mit -v den kompletten Diff erhalten. Lasst uns das tun:

$ pytest -v test_two.py
============================= test session starts ==============================

collected 1 item

test_two.py::test_failing FAILED                                         [100%]

=================================== FAILURES ===================================
_________________________________ test_failing _________________________________

    def test_failing():
>       assert sorted([4, 2, 1, 3]) == [0, 1, 2, 3]
E       assert [1, 2, 3, 4] == [0, 1, 2, 3]
E         At index 0 diff: 1 != 0
E         Full diff:
E         - [0, 1, 2, 3]
E         ?  ---
E         + [1, 2, 3, 4]
E         ?         +++

test_two.py:2: AssertionError
=========================== short test summary info ============================
FAILED test_two.py::test_failing - assert [1, 2, 3, 4] == [0, 1, 2, 3]
============================== 1 failed in 0.03s ===============================

pytest fügt +- und --Zeichen hinzu, um uns genau die Unterschiede zu zeigen.

Bisher haben wir pytest mit dem Befehl pytest FILE.py ausgeführt. Lasst uns pytest nun auf ein paar weitere Arten laufen. Wenn ihr keine Dateien oder Verzeichnisse angebt, sucht pytest nach Tests im aktuellen Arbeitsverzeichnis und in Unterverzeichnissen; genauer wird nach .py Dateien gesucht, die mit test_ beginnen oder mit _test enden. Wenn ihr pytest im Verzeichnis docs/test/pytest ohne Optionen startet, werden zwei Dateien mit Tests ausgeführt:

$ pytest --tb=no
============================= test session starts ==============================


test_one.py .                                                            [ 50%]
test_two.py F                                                            [100%]

=========================== short test summary info ============================
FAILED test_two.py::test_failing - assert [1, 2, 3, 4] == [0, 1, 2, 3]
========================= 1 failed, 1 passed in 0.00s ==========================

Ich habe auch die Option --tb=no verwendet, um die Rückverfolgung (engl.: Traceback) abzuschalten, da wir die vollständige Ausgabe im Moment nicht wirklich brauchen.

Wir können auch eine Testfunktion innerhalb einer Testdatei angeben, die ausgeführt werden soll, indem wir ::test_name zum Dateinamen hinzufügen:

$ pytest -v test_one.py::test_sorted
============================= test session starts ==============================

collected 1 item

test_one.py::test_sorted PASSED                                          [100%]

============================== 1 passed in 0.00s ===============================

Testergebnisse

Zu den möglichen Ergebnissen einer Testfunktion gehören:

PASSED (.)

Der Test wurde erfolgreich durchgeführt.

FAILED (F)

Der Test wurde nicht erfolgreich durchgeführt.

SKIPPED (s)

Der Test wurde übersprungen.

XFAIL (x)

Der Test sollte nicht bestehen, wurde aber durchgeführt und ist fehlgeschlagen.

XPASS (X)

Der Test wurde mit xfail markiert, aber er lief und bestand.

ERROR (E)

Eine Ausnahme ist während der Ausführung einer Test-Fixtures aufgetreten, nicht aber während der Ausführung einer Testfunktion.