Как справиться с неудачами при тестировании

Остановка после первой (или N) неудачи

Остановить процесс тестирования после первых (N) неудач:

pytest -x           # stop after first failure
pytest --maxfail=2  # stop after two failures

Использование pdb — The Python Debugger с pytest

Падение до pdb при сбоях

Python поставляется со встроенным отладчиком 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).

Использование встроенной функции точки останова

В 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 секунд (недоступно в Windows).

Примечание

Эта функциональность была интегрирована из внешнего плагина pytest-faulthandler, с двумя небольшими отличиями:

  • Чтобы отключить его, используйте -p no:faulthandler вместо --no-faulthandler: первый можно использовать с любым плагином, поэтому он экономит одну опцию.

  • Опция командной строки --faulthandler-timeout стала опцией конфигурации faulthandler_timeout. Он по-прежнему может быть настроен из командной строки с помощью -o faulthandler_timeout=X.

Предупреждение о невыполнимых исключениях и необработанных исключениях потока

Добавлено в версии 6.2.

Примечание

Эти функции работают только на Python>=3.8.

Необрабатываемые исключения - это исключения, которые возникают в ситуации, когда они не могут быть переданы вызывающей стороне. Наиболее распространенным случаем является исключение, вызванное в реализации __del__.

Не обработанные исключения потока - это исключения, поднятые в Thread, но не обработанные, что приводит к неаккуратному завершению потока.

Оба типа исключений обычно считаются ошибками, но могут остаться незамеченными, поскольку не приводят к аварийному завершению программы. Pytest обнаруживает эти условия и выдает предупреждение, которое отображается в сводке выполнения теста.

Плагины автоматически включаются при выполнении pytest, если в командной строке не заданы опции -p no:unraisableexception (для невыводимых исключений) и -p no:threadexception (для исключений потоков).

Предупреждения можно выборочно заглушить с помощью метки pytest.mark.filterwarnings. Категории предупреждений - pytest.PytestUnraisableExceptionWarning и pytest.PytestUnhandledThreadExceptionWarning.

Вернуться на верх