Код:
# coding=utf-8
import pytest
def whatever():
return 9/0
def test_whatever():
try:
whatever()
except ZeroDivisionError as exc:
pytest.fail(exc, pytrace=True)
Вывод:
================================ 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 ==============================
Как сделать трассировку печати Pytest, чтобы я мог видеть, где в whatever
функции было вызвано исключение?
python
unit-testing
testing
pytest
Джилл Бейтс
источник
источник
Ответы:
pytest.raises(Exception)
это то, что вам нужно.Код
Вывод
Обратите внимание, что
e_info
сохраняет объект исключения, чтобы вы могли извлечь из него детали. Например, если вы хотите проверить стек вызовов исключений или другое вложенное исключение внутри.источник
e_info
. Для разработчиков, более знакомых с некоторыми другими языками, не очевидно, что область действияe_info
выходит за пределыwith
блока.Вы имеете в виду что-то вроде этого:
источник
excinfo.value.message
не работал у меня, пришлось использоватьstr(excinfo.value)
, добавил новый ответassert excinfo.value.args[0] == 'some info'
это прямой доступ к сообщениюassert excinfo.match(r"^some info$")
работает также3.1
вы можете использовать ключевое слово аргумент,match
чтобы утверждать, что исключение соответствует тексту или регулярному выражению:with raises(ValueError, match='must be 0 or None'): raise ValueError("value must be 0 or None")
илиwith raises(ValueError, match=r'must be \d+$'): raise ValueError("value must be 42")
Есть два способа обработки таких случаев в pytest:
Используя
pytest.raises
функциюИспользование
pytest.mark.xfail
декоратораИспользование
pytest.raises
:Использование
pytest.mark.xfail
:Выход
pytest.raises
:Вывод
pytest.xfail
маркера:Как сказано в документации :
источник
xfail
это не решение проблемы здесь, это просто позволяет тесту провалиться. Здесь мы хотели бы проверить, возникает ли определенное исключение.можешь попробовать
источник
str(excinfo.value)
необходимо использовать. Это также работает в pytest 4.x. В pytest 4.xstr(excinfo)
также работает, но не работает в pytest 5.0.0.Pytest постоянно развивается, и с одним из приятных изменений в недавнем прошлом теперь можно одновременно тестировать на
Два примера из документации:
Я использовал этот подход в ряде проектов и мне очень нравится.
источник
Правильный путь используется,
pytest.raises
но я нашел интересный альтернативный путь в комментариях здесь и хочу сохранить его для будущих читателей этого вопроса:источник
Это решение - то, что мы используем:
Пожалуйста, обратитесь к pytest, https://docs.pytest.org/en/latest/reference.html#pytest-raises.
источник
Лучшей практикой будет использование класса, который наследует unittest.TestCase, и запуск self.assertRaises.
Например:
Тогда вы бы выполнили это, запустив:
источник
pytest
это более популярно, чемnosex
, но вот как я использую Pytest.Вы пытались удалить "pytrace = True"?
Вы пытались запустить с '--fulltrace'?
источник