我试图调试一个使用tox进行单元测试的python代码库。其中一个失败的测试由于弄清楚而证明是困难的,并且我想使用pudb来逐步完成代码。
首先想到的是,人们只会想到pip install pudb
然后在单位测试代码中添加import pudb
和pudb.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?
答案 0 :(得分:2)
有一个名为pytest-pudb
的软件包,它会覆盖像tox这样的自动化测试环境中的pudb入口点,以成功跳转到调试器。
要使用它,只需让你的tox.ini文件在其testenv依赖项中同时包含pudb
和pytest-pudb
条目,类似于:
[tox]
envlist = lint, py3
[testenv]
deps =
pytest
pudb
pytest-pudb
commands = pytest tests