Pytest:如何解决测试文件夹中缺少 __init__.py 的问题?

ccp*_*zza 7 python pytest

我将所有 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__.pytestsIDE 中解决了所有导入错误,但测试将不再运行,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 导入的工作原理了。

Mis*_*agi 9

在 中添加__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 ...) 取决于PYTHONPATHsys.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详细信息,请参阅文档中链接的博客