Как справиться с неудачами при тестировании¶
Остановка после первой (или 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.