我将所有 pytest 文件存储tests在项目根目录下的子目录中。__init__.py该目录或以上目录中没有pytest tests/test_a.py并按预期工作。我也可以pytest test_a.py直接从tests文件夹中运行。
|--<project_root>
+---[tests]
test_a.py
base.py
config.py
conftest.py
Run Code Online (Sandbox Code Playgroud)
中的测试类test_a.py继承自base.py. 现在的问题是,由于缺少__init__.pyIDE 工具,因此无法解决导入问题。添加__init__.py在testsIDE 中解决了所有导入错误,但测试将不再运行,pytest test_a.py因为 py.test 无法导入conftest.py。
在我的conftest.py我有以下进口:
from config import HOST_URL_DEFAULT, USER, PASSWORD
Run Code Online (Sandbox Code Playgroud)
这导致:
ModuleNotFoundError: No module named 'config'
ERROR: could not load /project_root/tests/conftest.py
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题,这样两个 IDE 工具都可以工作并 pytest继续工作?如果可能,我想避免使用点导入。
更新:阅读此答案后,我想我终于开始更多地了解 python 导入的工作原理了。
在 中添加__init__.py和使用相对或绝对导入conftest.py:
# relative
from .config import HOST_URL_DEFAULT, USER, PASSWORD
# absolute
from tests.config import HOST_URL_DEFAULT, USER, PASSWORD
Run Code Online (Sandbox Code Playgroud)
在包中(由 标识__init__.py),您需要明确的导入路径。使用不合格的导入 ( from config import ...) 取决于PYTHONPATH或sys.modules包含您的包根目录 - 这通常不可靠,应避免使用,因为它绕过了包基础结构。
你在这里(config.py由其他模块使用)是一个包。把它当作一个。
pytest并没有劝阻使用测试包的有__init__.py!这有名副其实的用例 - 比如你的。
什么pytest 不阻碍是具有源包和在同一源根测试包。但是,这意味着您应该移动源包,而不是测试包!
mysource/ # root directory for both mypackage and mytests
+- mypackage/ # should be src/mypackage instead!
+- __init__.py
+- abcd.py
+- mytests
+- __init__.py
+- tests_abcd.py # ``from mypackage import abcd`` imports from source
Run Code Online (Sandbox Code Playgroud)
问题是运行mytests意味着也mypackage可以从源代码导入。也就是说,您的测试针对的是源包,而不是已安装的包。如果您的安装过程中有任何错误,测试将无法捕捉到它。有关pytest详细信息,请参阅文档中链接的博客。
| 归档时间: |
|
| 查看次数: |
4801 次 |
| 最近记录: |