Spec-Zone.ru › pytest

Как обрабатывать сбои тестов

Остановка после первого сбоя (или 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API