在使用py.test时可以使用Python调试器进行调试吗?
我正在用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调试器命令行之前,自动关闭捕获功能。