Как обрабатывать сбои тестов
Остановка после первого сбоя (или N сбоев)
Чтобы остановить тестирование после первого сбоя (или N сбоев):
pytest -x # stop after first failure pytest --maxfail=2 # stop after two failures
Использование pdb — отладчик Python с pytest
Переход в pdb при сбоях
В Python есть встроенный отладчик под названием pdb. pytest позволяет перейти к приглашению pdb с помощью параметра командной строки:
pytest --pdb
Это запустит отладчик Python при каждом сбое (или прерывании с клавиатуры). Часто требуется сделать это только при первом сбое теста, чтобы разобраться в конкретной ситуации:
pytest -x --pdb # drop to PDB on first failure, then end test session pytest --pdb --maxfail=3 # drop to PDB for first three failures
Обратите внимание: при любом сбое информация об исключении сохраняется в sys.last_value, sys.last_type и sys.last_traceback. В интерактивном режиме это позволяет перейти к отладке после сбоя с помощью любого отладчика. Также можно вручную получить доступ к информации об исключении, например:
>>> import sys
>>> sys.last_traceback.tb_lineno
42
>>> sys.last_value
AssertionError('assert result == "ok"',)
Переход в pdb в начале теста
pytest позволяет сразу перейти к приглашению pdb в начале каждого теста с помощью параметра командной строки:
pytest --trace
Это запустит отладчик Python в начале каждого теста.
Установка точек останова
Чтобы установить точку останова в коде, используйте встроенный вызов Python import pdb;pdb.set_trace(): pytest автоматически отключит перехват вывода для этого теста:
- Перехват вывода в остальных тестах не затрагивается.
- Вывод предыдущего теста, который уже был перехвачен, будет обработан соответствующим образом.
- Перехват вывода возобновится после завершения сеанса отладчика (с помощью команды
continue).
Использование встроенной функции breakpoint
В Python 3.7 появилась встроенная функция breakpoint(). Pytest поддерживает использование breakpoint() со следующими особенностями:
- Когда вызывается
breakpoint(), а дляPYTHONBREAKPOINTзадано значение по умолчанию, pytest использует собственный интерфейс отладки PDB вместо системного интерфейсаPdbпо умолчанию. - После завершения тестов система возвращается к системному интерфейсу трассировки
Pdb. - Если передать pytest параметр
--pdb, собственный интерфейс трассировки Pdb будет использоваться как дляbreakpoint(), так и для неудачных тестов и необработанных исключений. -
Параметр
--pdbclsпозволяет указать пользовательский класс отладчика.
Обработчик ошибок
Добавлено в версии 5.0.
Стандартный модуль faulthandler можно использовать для вывода трассировок стека Python при ошибке сегментации или по истечении времени ожидания.
Этот модуль автоматически включается при запуске pytest, если в командной строке не указан параметр -p no:faulthandler.
Кроме того, параметр конфигурации faulthandler_timeout=X позволяет вывести трассировки стека всех потоков, если выполнение теста длится дольше X секунд.
Примечание
Эта функциональность перенесена из внешнего плагина pytest-faulthandler с двумя небольшими отличиями:
- Чтобы отключить её, используйте
-p no:faulthandlerвместо--no-faulthandler: первый параметр можно использовать с любым плагином, поэтому он позволяет обойтись без ещё одной опции. - Параметр командной строки
--faulthandler-timeoutзаменён параметром конфигурацииfaulthandler_timeout. Его по-прежнему можно задать в командной строке с помощью-o faulthandler_timeout=X.
Предупреждение о неперехватываемых исключениях и необработанных исключениях в потоках
Добавлено в версии 6.2.
Необработанные исключения — это исключения, возникающие в ситуации, когда они не могут быть переданы вызывающему коду. Наиболее распространённый случай — исключение, возникшее при реализации __del__.
Необработанные исключения в потоках — это исключения, возникающие в Thread, но не обрабатываемые, из-за чего поток завершается некорректно.
Оба типа исключений обычно считаются ошибками, но могут остаться незамеченными, поскольку не приводят к аварийному завершению самой программы. Pytest обнаруживает такие ситуации и выводит предупреждение, которое отображается в сводке результатов тестирования.
Плагины автоматически включаются при запуске pytest, если в командной строке не указаны параметры -p no:unraisableexception (для неперехватываемых исключений) и -p no:threadexception (для исключений в потоках).
Предупреждения можно выборочно отключить с помощью маркера pytest.mark.filterwarnings. Категории предупреждений: pytest.PytestUnraisableExceptionWarning и pytest.PytestUnhandledThreadExceptionWarning.
© 2015–2026 Holger Krekel and pytest-dev team
Licensed under the MIT License.
https://docs.pytest.org/en/stable/how-to/failures.html