【发布时间】:2018-06-11 11:08:59
【问题描述】:
我将所有 pytest 文件存储在项目根目录下的 tests 子目录中。该目录或以上目录中没有__init__.py,pytest tests/test_a.py 按预期工作。我也可以直接从tests 文件夹中运行pytest test_a.py。
|--<project_root>
+---[tests]
test_a.py
base.py
config.py
conftest.py
test_a.py 中的测试类继承自 base.py。现在,问题是由于缺少__init__.py,IDE 工具无法工作并且无法解析导入。在tests 下添加__init__.py 可以解决IDE 中的所有导入错误,但使用pytest test_a.py 将不再运行测试,因为py.test 无法导入conftest.py。
在我的 conftest.py 我有以下导入:
from config import HOST_URL_DEFAULT, USER, PASSWORD
导致:
ModuleNotFoundError: No module named 'config'
ERROR: could not load /project_root/tests/conftest.py
有没有办法解决这个问题,让 IDE 工具和 pytest 继续工作?如果可能,我想避免使用点导入。
更新:阅读this answer后,我想我终于开始了解更多python导入的工作原理了。
【问题讨论】:
-
为什么
pytest导入config.py失败? -
@MisterMiyagi:pytest 无法导入的是
conftest.py,抱歉打错了。我没有在测试代码的任何地方明确导入conftest.py,但该文件存在并且我正在使用它。我更新了问题以显示导致错误的确切原因。 -
所以问题在于您的 IDE 而不是
pytest?也许可以告诉 IDEtests是项目设置中某处的命名空间包。如果您将__init__.py放在tests目录中,config模块的限定名称将更改为tests.config,您必须按照答案建议调整导入。无论哪种方式,可能值得查看Good Integration Practices 以获取有关不同测试布局的提示。 -
至少在PyCharm中,可以在项目设置中添加
tests作为源根;这解决了导入问题。