我将所有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
test_a.py
中的测试类继承自base.py
。现在,问题是因为缺少__init__.py
IDE工具不起作用并且无法解析导入。在__init__.py
下添加tests
会解决IDE中的所有导入错误,但测试不再使用pytest test_a.py
运行,因为py.test无法导入conftest.py
。< / p>
在我的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导入的工作原理了。
答案 0 :(得分:2)
添加__init__.py
并在conftest.py
中使用相对或绝对导入:
# relative
from .config import HOST_URL_DEFAULT, USER, PASSWORD
# absolute
from tests.config import HOST_URL_DEFAULT, USER, PASSWORD
在包中(由__init__.py
标识),您需要明确的导入路径。使用不合格的导入(from config import ...
)取决于PYTHONPATH
或sys.modules
,包括您的软件包根目录 - 这通常不健全,应该避免,因为它会绕过软件包基础结构。
你在这里(其他模块使用的config.py
)是一个包。把它视为一个。
pytest
不阻止使用__init__.py
的测试包!有一些名副其实的用例 - 比如你的。
pytest
does discourage在同一源根目录中拥有源包和测试包。但是,这意味着您应该移动源包,而不是您的测试包!
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
问题是运行mytests
意味着mypackage
也可以从源代码导入。也就是说,您的测试正在处理源包,而不是您安装的包。如果您的安装过程中有任何错误,测试将无法捕获它。 See the blog linked in the pytest
docs for details