Kod:
# coding=utf-8
import pytest
def whatever():
return 9/0
def test_whatever():
try:
whatever()
except ZeroDivisionError as exc:
pytest.fail(exc, pytrace=True)
Wynik:
================================ 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 ==============================
Jak wykonać śledzenie wydruku pytest, aby zobaczyć, gdzie w whatever
funkcji został zgłoszony wyjątek?
python
unit-testing
testing
pytest
Gill Bates
źródło
źródło
Odpowiedzi:
pytest.raises(Exception)
jest to, czego potrzebujesz.Kod
Wynik
Pamiętaj, że
e_info
zapisuje obiekt wyjątku, aby można było z niego wyodrębnić szczegóły. Na przykład, jeśli chcesz sprawdzić stos wywołań wyjątków lub inny zagnieżdżony wyjątek w środku.źródło
e_info
. Dla programistów bardziej zaznajomionych z niektórymi innymi językami, nie jest oczywiste, że zakrese_info
wykracza pozawith
blok.Czy masz na myśli coś takiego:
źródło
excinfo.value.message
nie działało dla mnie, musiałem użyćstr(excinfo.value)
, dodałem nową odpowiedźassert excinfo.value.args[0] == 'some info'
to bezpośredni sposób dostępu do wiadomościassert excinfo.match(r"^some info$")
działa również3.1
można użyć argumentu słowa kluczowego,match
aby potwierdzić, że wyjątek pasuje do tekstu lub wyrażenia regularnego:with raises(ValueError, match='must be 0 or None'): raise ValueError("value must be 0 or None")
lubwith raises(ValueError, match=r'must be \d+$'): raise ValueError("value must be 42")
Istnieją dwa sposoby obsługi tego rodzaju przypadków w pytest:
Korzystanie z
pytest.raises
funkcjiKorzystanie z
pytest.mark.xfail
dekoratoraZastosowanie
pytest.raises
:Zastosowanie
pytest.mark.xfail
:Wyjście
pytest.raises
:Wyjście
pytest.xfail
znacznika:Jak mówi dokumentacja :
źródło
xfail
nie jest tutaj rozwiązaniem problemu, pozwala jedynie na niepowodzenie testu. W tym miejscu chcielibyśmy sprawdzić, czy wystąpił jakiś wyjątek.możesz spróbować
źródło
str(excinfo.value)
wymagane jest użycie . Działa również w pytest 4.x. W pytest 4.xstr(excinfo)
również działa, ale nie działa w pytest 5.0.0.pytest stale ewoluuje, a dzięki jednej z miłych zmian w niedawnej przeszłości można teraz jednocześnie testować
Dwa przykłady z dokumentacji:
Stosowałem to podejście w wielu projektach i bardzo mi się podobało.
źródło
Właściwy sposób jest używany,
pytest.raises
ale znalazłem interesujący alternatywny sposób w komentarzach tutaj i chcę go zachować dla przyszłych czytelników tego pytania:źródło
Z tego rozwiązania korzystamy:
Proszę odnieść się do pytest, https://docs.pytest.org/en/latest/reference.html#pytest-raises
źródło
Lepszą praktyką będzie korzystanie z klasy dziedziczącej unittest.TestCase i uruchamianie self.assertRaises.
Na przykład:
Następnie wykonasz go, uruchamiając:
źródło
pytest
to, że jest bardziej popularny niżnosex
, ale w ten sposób używam pytest.Czy próbowałeś usunąć „pytrace = True”?
Czy próbowałeś uruchomić z „--fulltrace”?
źródło