gpt4 book ai didi

python - pytest 与 pip install 中断

转载 作者:行者123 更新时间:2023-12-04 08:11:56 25 4
gpt4 key购买 nike

我正在一个存储库中工作,该存储库在一个名为 test 的目录中包含测试和一些测试帮助程序库。 (https://github.com/covid-projections/covid-data-model/tree/main/test)。神秘pip install dash似乎打破了我们的测试。我在 debian 笔记本电脑上的 pyenv 中使用 python 3.7.9。我用一个非常简单的例子重现了这个问题:
激活新的 pyenv virtualenv 并使用 pip install git+https://github.com/pytest-dev/pytest 安装最新的 pytest .创建一个空的./test/__init__.py以及以下两个文件:

$ cat ./test/real_test.py
from test import test_helpers

def test_one():
assert "foobar" == test_helpers.SOME_CONSTANT
$ cat ./test/test_helpers.py
SOME_CONSTANT = "foo"
运行 test/real_test.py 会按预期进行,但未通过测试。现在 pip install dash==1.19.0并且测试无法运行
_____________________________________________________________________________ ERROR collecting test/real_test.py _____________________________________________________________________________
ImportError while importing test module '/home/thecap/tmp/nomodule/test/real_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../../.pyenv/versions/3.7.9/lib/python3.7/importlib/__init__.py:127: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'test.real_test'
运行 pytest --import-mode=importlib test/real_test.py (在 https://github.com/pytest-dev/pytest/issues/7408 的评论中找到)给了我一 pip 提示,它不包括用于搜索库的路径中的 cwd,因为它正在查看 test在 pyenv 中,而不是在 cwd 中。
ImportError while importing test module '/home/thecap/tmp/nomodule/test/real_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
test/real_test.py:1: in <module>
from test import test_helpers
E ImportError: cannot import name 'test_helpers' from 'test' (/home/thecap/.pyenv/versions/3.7.9/lib/python3.7/test/__init__.py)
运行后对我来说很神秘 pip uninstall dash测试按预期运行 pytest test/real_test.py但仍被 pytest --import-mode=importlib test/real_test.py 所破坏.
我怀疑将我们的测试从 test/ 移出至 tests/将解决此问题,但我想了解为什么安装破折号会破坏事情,如果我们当前的设置有问题,请帮助其他人避免它。
(我也在 https://github.com/pytest-dev/pytest/discussions/8270 上发布了这篇文章,希望对堆栈溢出有更多的回应。)

最佳答案

这里的问题是您的本地 test包阴影 test 标准库中的模块。一般来说,对任何 stdlib 模块进行命名是一种不好的做法,应该避免;然而,由于

The test package is meant for internal use by Python only. It is documented for the benefit of the core developers of Python. Any use of this package outside of Python’s standard library is discouraged as code mentioned here can change or be removed without notice between releases of Python.



The test package contains all regression tests for Python as well as the modules test.support and test.regrtest. test.support is used to enhance your tests while test.regrtest drives the testing suite.


这意味着 test不在回归测试运行之外使用。 future 的情况并非如此, 不过 - it's importing test.support when installing aliases ,导致 stdlib 的 test出席 sys.modules之前 pytest开始测试收集。你安装了 futures连同 dash , 自 it's a direct dependency .现在,当您启动 pytest运行,它会加载 dash导入 future 的插件进口 test之后,在尝试收集您的本地 test 时包, pytest导入失败,因为另一个 test已经导入了!
解决方案
我建议重命名本地 test打包成例如 tests .这将停止 stdlib 模块的名称隐藏。
如果您无法重命名测试包,可以想象几种解决方法来规避 stdlib 的 test 的导入。 :
清理导入
创建文件 conftest.py在您的项目根目录中(不在 test 目录中,否则它将不起作用),并包含以下内容:
import sys

sys.modules.pop("test", None)
这将“取消导入”stdlib 的 test , 制作您的本地 test可在测试集合上导入的包。
更改 sys.path本地化 test在 stdlib 之前可选择的包
只需运行 python -m pytest ...PYTHONPATH=. pytest ...确保项目的根目录插入到 sys.path 中的站 pip 之前, 所以 import test将始终以导入本地包结束。

关于python - pytest 与 pip install 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65910240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com