如何使用PUDB在Tox中调试我的python单元测试?

时间:2018-05-18 21:52:27

标签: pytest tox pudb

我试图调试一个使用tox进行单元测试的python代码库。其中一个失败的测试由于弄清楚而证明是困难的,并且我想使用pudb来逐步完成代码。

首先想到的是,人们只会想到pip install pudb然后在单位测试代码中添加import pudbpudb.settrace()。但这会导致ModuleNotFoundError:

>       import pudb
>E       ModuleNotFoundError: No module named 'pudb'
>tests/mytest.py:130: ModuleNotFoundError
> ERROR: InvocationError for command '/Users/me/myproject/.tox/py3/bin/pytest tests' (exited with code 1)

注意到.tox项目文件夹导致人们意识到在tox中有一个site-packages文件夹,这是有道理的,因为tox的目的是在不同的virtualenv场景下管理测试。这也意味着有一个tox.ini配置文件,deps部分可能如下所示:

[tox]
envlist = lint, py3

[testenv]
deps =
    pytest
commands = pytest tests

pudb添加到deps列表应解决ModuleNotFoundError,但会导致另一个错误:

self = <_pytest.capture.DontReadFromInput object at 0x103bd2b00>

    def fileno(self):
>       raise UnsupportedOperation("redirected stdin is pseudofile, "
                                   "has no fileno()")
E       io.UnsupportedOperation: redirected stdin is pseudofile, has no fileno()

.tox/py3/lib/python3.6/site-packages/_pytest/capture.py:583: UnsupportedOperation

所以,我在这一点上陷入困​​境。是不是可以在Tox中使用pudb而不是pdb?

1 个答案:

答案 0 :(得分:2)

有一个名为pytest-pudb的软件包,它会覆盖像tox这样的自动化测试环境中的pudb入口点,以成功跳转到调试器。

要使用它,只需让你的tox.ini文件在其testenv依赖项中同时包含pudbpytest-pudb条目,类似于:

[tox]
envlist = lint, py3

[testenv]
deps =
    pytest
    pudb
    pytest-pudb
commands = pytest tests