Як виконувати ipdb.set_trace () за бажанням під час запуску тестів pytest


96

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

Однак, оскільки pytest ловить sys.stdin / sys.stdout ipdb не вдається. Як я можу використовувати ipdb під час тестування за допомогою pytest.

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

Відповіді:


153

Помилка підвищується через захоплення виводу py.test.

Вам слід запустити py.test з -sопцією (вимкнути вихід захоплення). Наприклад:

py.test -s my_test.py

10
Якщо ви хочете зробити це у 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знову працює, і найкраще рішення, оскільки воно дасть вам заповнення вкладки.
Уве Л. Корн,

виглядати БДПП, її отримали IPython якості самоаналізу
msudder


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.