如何在运行 pytest 测试时随意执行 ipd.set_trace()

我在测试套件中使用 pytest。在复杂的组件间测试中捕捉 bug 时,我希望将 import ipdb; ipdb.set_trace()放在代码的中间,以便调试它。

但是,由于 pytest 捕获 sys.stdin/sys.stdout ipdb 失败。

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

40246 次浏览

之所以引发错误,是因为 pytest 默认捕获输出。

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

py.test -s my_test.py

然后是 my_test.py:

import ipdb;
ipdb.set_trace()

pytest-ipdb is unfortunately not supported anymore.

The solution is to run pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

From the help command:

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

区别在于 Terminal alPdb 似乎会抛出错误,而 Pdb 不会(Ipython 文档)。

我就用这个

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

二○一九至一一年度为止,这里是应该解决的问题:

pip install ipdb gnureadline ptpython


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

你可以试试 pdbpp。与 ipdbpytest一起使用时相比,我在这方面取得了更大的成功。在这里可以看到我的答案: https://stackoverflow.com/a/69320311/2896799