Как выполнить ipdb.set_trace () по желанию при запуске тестов pytest


97

Я использую pytest для своего набора тестов. При обнаружении ошибок в сложном межкомпонентном тесте я хотел бы разместить их import ipdb; ipdb.set_trace()в середине своего кода, чтобы я мог его отлаживать.

Однако, поскольку pytest перехватывает sys.stdin / sys.stdout, ipdb не работает. Как я могу использовать ipdb при тестировании с помощью pytest.

Меня не интересует переход к pdb или ipdb после сбоя, но мне нужно размещать разрывы в любом месте кода и иметь возможность отлаживать его там до того, как произойдет сбой.

Ответы:


154

Ошибка возникает из-за захвата вывода py.test.

Вы должны запустить py.test с -sопцией (отключить вывод захвата). Например:

py.test -s my_test.py

11
Если кто-то хочет сделать это в Django, добавьте addopts = -sв pytest.iniфайл.
Рахул Гупта

39

pytest-ipdb, к сожалению, больше не поддерживается.

Решение - запустить pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

Из команды помощи:

pytest -h
  --pdb                 start the interactive Python debugger on errors.
  --pdbcls=modulename:classname
                        start a custom interactive Python debugger on errors.
                        For example:
                        --pdbcls=IPython.terminal.debugger:TerminalPdb

Разница лишь в том, что кажется, что TerminalPdb выдает ошибки, а Pdb - нет ( документы Ipython ).


1
TerminalPdbснова работает и является предпочтительным решением, поскольку оно даст вам завершение вкладки.
Уве Л. Корн

обратите внимание на ppdb, он получил самоанализ качества
ipython


0

По состоянию на 2019-11 год вот что должно исправить:

pip install ipdb gnureadline ptpython

export PYTEST_ADDOPTS='--pdb --pdbcls=IPython.terminal.debugger:Pdb'

1
если вы установите prompt-toolkit версию, 2.0.10то ipdb снова будет работать нормально, потому что он ломается из-за недавнего обновления этого пакета до 3.0.0
Павел Барчик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.