112

我正在为我的测试套件使用 pytest。在复杂的组件间测试中捕获错误时,我想将其放置import ipdb; ipdb.set_trace()在我的代码中间以允许我对其进行调试。

但是,由于 pytest 捕获 sys.stdin/sys.stdout ipdb 失败。如何在使用 pytest 进行测试时使用 ipdb。

我对在失败后跳转到 pdb 或 ipdb 不感兴趣,而是在代码中的任何地方放置中断并能够在失败发生之前在那里对其进行调试。

4

5 回答 5

170

引发错误是因为 pytest 默认捕获输出。

您可以使用选项运行 pytest -s(关闭捕获输出)。例如:

py.test -s my_test.py

然后在my_test.py

import ipdb;
ipdb.set_trace()
于 2013-05-06T21:29:06.177 回答
53

不幸的是,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 docs)。

于 2017-04-12T16:12:07.280 回答
6

截至2019年 11 月,这是应该解决的问题:

pip install ipdb gnureadline ptpython

export PYTEST_ADDOPTS='--pdb --pdbcls=IPython.terminal.debugger:Pdb'
于 2019-11-27T12:00:31.763 回答
3

这就是我使用的

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

于 2019-11-15T19:40:36.090 回答
0

你可能想pdbpp试一试。与ipdb使用pytest. 在这里查看我的答案:https ://stackoverflow.com/a/69320311/2896799 。

于 2021-09-24T19:40:09.647 回答