863 Stimmen

Wie kann ich richtig behaupten, dass eine Ausnahme in pytest ausgelöst wird?

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)

Output:

================================ 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 kann ich pytest dazu bringen, den Traceback auszudrucken, damit ich sehen kann, wo in der whatever-Funktion eine Ausnahme ausgelöst wurde?

2voto

tmck-code Punkte 2161

Nur einen weiteren "dummen" Vorschlag hinzufügen, da ich ihn nicht in den vorhandenen Antworten sehe. Im Wesentlichen können Sie eine Fehlervariable als None initialisieren, das Ding in einem Try/Except-Block ausführen und dann die Klasse/den Wert der Fehlervariable überprüfen

e = None

try:
    blah()
except Exception as exc:
    e = exc

assert e.__class__ == ValueError # oder was auch immer Sie erwarten.
assert str(e) == "erwartete Nachricht"

0voto

Loic Pantou Punkte 11

Hast du versucht, "pytrace=True" zu entfernen?

pytest.fail(exc, pytrace=True) # vorher
pytest.fail(exc) # nachher

Hast du versucht, mit '--fulltrace' zu laufen?

0voto

kerbelp Punkte 534

Besser wäre es, eine Klasse zu verwenden, die von unittest.TestCase erbt, und self.assertRaises auszuführen.

Zum Beispiel:

import unittest

def whatever():
    return 9/0

class TestWhatEver(unittest.TestCase):

    def test_whatever():
        with self.assertRaises(ZeroDivisionError):
            whatever()

Anschließend führen Sie es aus, indem Sie Folgendes eingeben:

pytest -vs test_path

-1voto

Sue Yorgen Punkte 23

Ich habe gerade einen Hook geschrieben, den jeder Test erhält

Der Hook:

@pytest.hookimpl(tryfirst=True, hookwrapper=True) def pytest_runtest_makereport(item: Item, call: CallInfo):

    outcome = yield  # Das Ergebnis nach Abschluss des Tests
    result = outcome.get_result()

    if result.when == "call":
       if result.failed == True:

       else:

Ich habe eine Funktion, die ein Dokument mit dem Testergebnis aktualisiert und die Spur hinzufügt, indem sie verwendet: result.longrepr.reprcrash.message

Ich weiß nicht, ob dies der beste Weg ist, aber es beantwortet die Frage, wie man den traceback nur mit pytest ausgeben kann

@Obviously i have some other code

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X