Code:
# coding=utf-8
import pytest
def whatever():
return 9/0
def test_whatever():
try:
whatever()
except ZeroDivisionError as exc:
pytest.fail(exc, pytrace=True)
Ausgabe:
================================ test session starts =================================
platform linux2 -- Python 2.7.3 -- py-1.4.20 -- pytest-2.5.2
plugins: django, cov
collected 1 items
pytest_test.py F
====================================== FAILURES ======================================
___________________________________ test_whatever ____________________________________
def test_whatever():
try:
whatever()
except ZeroDivisionError as exc:
> pytest.fail(exc, pytrace=True)
E Failed: integer division or modulo by zero
pytest_test.py:12: Failed
============================== 1 failed in 1.16 seconds ==============================
Wie erstelle ich ein Pytest-Print-Traceback, damit ich sehe, wo in der whatever
Funktion eine Ausnahme ausgelöst wurde?
python
unit-testing
testing
pytest
Gill Bates
quelle
quelle
Antworten:
pytest.raises(Exception)
ist was du brauchst.Code
Ausgabe
Beachten Sie, dass
e_info
das Ausnahmeobjekt gespeichert wird, damit Sie Details daraus extrahieren können. Zum Beispiel, wenn Sie den Ausnahmeaufrufstapel oder eine andere darin verschachtelte Ausnahme überprüfen möchten.quelle
e_info
. Für Entwickler, die mit bestimmten anderen Sprachen besser vertraut sind, ist es nicht offensichtlich, dass sich der Umfang vone_info
außerhalb deswith
Blocks erstreckt.Meinst du so etwas:
quelle
excinfo.value.message
hat bei mir nicht funktioniert, musste verwendenstr(excinfo.value)
, fügte eine neue Antwort hinzuassert excinfo.value.args[0] == 'some info'
ist der direkte Weg, um auf die Nachrichtassert excinfo.match(r"^some info$")
funktioniert auch3.1
Sie das Schlüsselwortargument verwendenmatch
, um zu behaupten, dass die Ausnahme mit einem Text oder einem regulären Ausdruck übereinstimmt:with raises(ValueError, match='must be 0 or None'): raise ValueError("value must be 0 or None")
oderwith raises(ValueError, match=r'must be \d+$'): raise ValueError("value must be 42")
Es gibt zwei Möglichkeiten, um diese Art von Fällen im Pytest zu behandeln:
Mit
pytest.raises
FunktionMit
pytest.mark.xfail
DekorateurVerwendung von
pytest.raises
:Verwendung von
pytest.mark.xfail
:Ausgabe von
pytest.raises
:Ausgabe des
pytest.xfail
Markers:Wie die Dokumentation sagt:
quelle
xfail
ist hier nicht die Lösung für das Problem, sondern lässt den Test nur fehlschlagen. Hier möchten wir prüfen, ob eine bestimmte Ausnahme ausgelöst wird.Du kannst es versuchen
quelle
str(excinfo.value)
ist die Verwendung von erforderlich. Es funktioniert auch in pytest 4.x. Funktioniert in pytest 4.xstr(excinfo)
ebenfalls, in pytest 5.0.0 jedoch nicht .pytest entwickelt sich ständig weiter und mit einer der schönen Änderungen in der jüngeren Vergangenheit ist es jetzt möglich, gleichzeitig zu testen
Zwei Beispiele aus der Dokumentation:
Ich habe diesen Ansatz in einer Reihe von Projekten verwendet und mag ihn sehr.
quelle
Der richtige Weg ist die Verwendung,
pytest.raises
aber ich habe in den Kommentaren hier einen interessanten alternativen Weg gefunden und möchte ihn für zukünftige Leser dieser Frage speichern:quelle
Diese Lösung verwenden wir:
Weitere Informationen finden Sie unter pytest unter https://docs.pytest.org/en/latest/reference.html#pytest-raises
quelle
Bessere Vorgehensweise ist die Verwendung einer Klasse, die unittest.TestCase erbt und self.assertRaises ausführt.
Beispielsweise:
Dann würden Sie es ausführen, indem Sie Folgendes ausführen:
quelle
pytest
ist populärer alsnosex
, aber so benutze ich pytest.Haben Sie versucht, "pytrace = True" zu entfernen?
Haben Sie versucht, mit '--fulltrace' zu laufen?
quelle