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

Posted

技术标签:

【中文标题】如何在运行pytest测试时随意执行ipdb.set_trace()【英文标题】:How to execute ipdb.set_trace() at will while running pytest tests 【发布时间】:2013-04-08 00:34:34 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

您可能想试试pdbpp。与ipdbpytest 一起使用时,我使用它取得了更大的成功。在这里查看我的答案:https://***.com/a/69320311/2896799。

【讨论】:

【参考方案2】:

由于pytest默认捕获输出而引发错误。

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

py.test -s my_test.py

然后在my_test.py:

import ipdb;
ipdb.set_trace()

【讨论】:

如果想在 Django 中执行此操作,请将 addopts = -s 添加到 pytest.ini 文件中。【参考方案3】:

截至 2019-11 以下是应该解决的问题:

pip install ipdb gnureadline ptpython

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

【讨论】:

如果您安装prompt-toolkit 版本2.0.10 然后ipdb 将再次正常工作,因为最近将此软件包更新到3.0.0 导致它中断【参考方案4】:

这是我用的

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

【讨论】:

【参考方案5】:

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

【讨论】:

TerminalPdb 再次工作,这是首选的解决方案,因为它可以让您完成标签。 留意 ppdb,它有 ipython 质量自省

以上是关于如何在运行pytest测试时随意执行ipdb.set_trace()的主要内容,如果未能解决你的问题,请参考以下文章

pytest测试框架(三)

pytest之执行测试pytest.main()的使用

如何在 pytest 中保持单元测试和集成测试分开

pytest中的测试用例执行顺序

pytest---分布式执行用例(pytest-xdist)

Pytest 在测试后花费的时间最多?