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