在使用py.test时可以使用Python调试器进行调试吗?

121 投票
7 回答
125585 浏览
提问于 2025-04-15 21:51

我正在用py.test来测试我的Python程序。想用Python的调试工具来调试我的测试代码,正常情况下我会在代码里加上pdb.set_trace(),但是我试了之后发现不行。

把pdb.set_trace()放在代码里没用(出现了IOError: reading from stdin while output is captured的错误)。我还试过用--pdb这个选项来运行py.test,但这似乎也不管用,因为我想在我的断言之前看看发生了什么。当断言失败时,它会中断,而如果我想继续往下走,就意味着要结束程序。

有没有人知道怎么调试,或者说调试和py.test根本就不兼容?

7 个回答

32

最简单的方法是使用py.test这个工具来创建断点。

你可以在这里了解更多信息

import pytest
def test_function():
    ...
    pytest.set_trace()    # invoke PDB debugger and tracing

或者,如果你想用一行代码来调用pytest的调试器,可以把import pdb; pdb.set_trace()改成import pytest; pytest.set_trace()

47

我发现可以在运行 py.test 时关闭捕获功能,然后像往常一样使用 pdb.set_trace()。

> py.test --capture=no
============================= test session starts ==============================
platform linux2 -- Python 2.5.2 -- pytest-1.3.3
test path 1: project/lib/test/test_facet.py

project/lib/test/test_facet.py ...> /home/jaraco/projects/project/lib/functions.py(158)do_something()
-> code_about_to_run('')
(Pdb)
185

其实很简单:在你想要开始调试的地方放一个 assert 0,然后用下面的命令运行你的测试:

py.test --pdb 

完成啦 :)

另外,如果你使用的是pytest-2.0.1或更高版本,还有一个叫 pytest.set_trace() 的工具,你可以把它放在测试代码的任何地方。这里有相关文档。它会在你进入pdb调试器命令行之前,自动关闭捕获功能。

撰写回答