Es gibt zwei Möglichkeiten, Ausnahmen in pytest
zu behandeln:
- Verwendung von
pytest.raises
zum Schreiben von Behauptungen über aufgetretene Ausnahmen
- Verwendung von
@pytest.mark.xfail
1. Verwendung von pytest.raises
Aus den Docs:
Um Behauptungen über aufgetretene Ausnahmen zu schreiben, können Sie pytest.raises
als Kontext-Manager verwenden
Beispiele:
Nur eine Ausnahme behaupten:
import pytest
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0
with pytest.raises(ZeroDivisionError)
besagt, dass das, was auch immer im nächsten Block von Code ist, eine ZeroDivisionError
Ausnahme auslösen sollte. Wenn keine Ausnahme auftritt, schlägt der Test fehl. Wenn der Test eine andere Ausnahme auslöst, schlägt er fehl.
Wenn Sie Zugriff auf die tatsächlichen Ausnahmeinformationen benötigen:
import pytest
def f():
f()
def test_recursion_depth():
with pytest.raises(RuntimeError) as excinfo:
f()
assert "maximum recursion" in str(excinfo.value)
excinfo
ist eine ExceptionInfo
Instanz, die ein Wrapper um die tatsächlich ausgelöste Ausnahme ist. Die wichtigsten Attribute sind .type
, .value
und .traceback
.
2. Verwendung von @pytest.mark.xfail
Es ist auch möglich, ein raises
Argument an pytest.mark.xfail
zu übergeben.
import pytest
@pytest.mark.xfail(raises=IndexError)
def test_f():
l = [1, 2, 3]
l[10]
@pytest.mark.xfail(raises=IndexError)
besagt, dass das, was auch immer im nächsten Block von Code ist, eine IndexError
Ausnahme auslösen sollte. Wenn ein IndexError
ausgelöst wird, wird der Test als xfailed (x)
markiert. Wenn keine Ausnahme auftritt, wird der Test als xpassed (X)
markiert. Wenn der Test eine andere Ausnahme auslöst, schlägt er fehl.
Anmerkungen:
-
Die Verwendung von pytest.raises
ist wahrscheinlich besser für Fälle geeignet, in denen Sie Ausnahmen testen, die Ihr eigenes Code absichtlich auslöst, während die Verwendung von @pytest.mark.xfail
mit einer Prüffunktion wahrscheinlich besser für etwas wie das Dokumentieren von ungefixten Fehlern oder Fehlern in Abhängigkeiten geeignet ist.
-
Sie können einen match
Schlüsselwortparameter an den Kontext-Manager übergeben (pytest.raises
), um zu testen, ob ein regulärer Ausdruck mit der Zeichenfolgenrepräsentation einer Ausnahme übereinstimmt. (mehr erfahren)