Как выполнить 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
petRUShka
источник
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 ).

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

Это то, что я использую

py.test tests/ --pdbcls=IPython.core.debugger:Pdb -s

Аволива
источник
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
Павел Барчик