我有这个目录结构:
app/
pyproject.toml
src/
app/
__init__.py
app.py
functions1.py
functions2.py
tests/
test_functions1.py
test_functions2.py
如果我从应用程序目录(
app>python path/to/app/src/app/app.py -flags
)在命令行上运行它,它就可以工作。 但是,当我使用 pytest (app>pytest path/to/app/tests/test_functions1.py
) 运行测试时,在收集过程中出现以下错误(适应于这个虚拟示例):
ImportError while importing test module 'path/to/app/tests/test_functions1.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests\test_functions1.py:9: in <module>
from app.functions1 import MyClass
src\app\functions1.py:13: in <module>
from functions2 import other_function
E ModuleNotFoundError: No module named 'functions2'
根据 pytest 文档,我的 TOML 中有以下内容:
[tool.pytest.ini_options]
pythonpath = "src"
addopts = [
"--import-mode=importlib",
]
有人可以告诉我在这种情况下导入函数的正确方法吗?
编辑: 感谢您的链接建议。 我做了一些更改并更新了这个答案,但我相信我的问题可能特定于 pytest (该链接是更一般的讨论)。
我认为问题是我的导入命名空间在使用 pytest 运行时不正确,但我不确定如何正确引用它们而不破坏测试之外的应用程序。 如果我这样做:
functions1.py
from app.functions2 import other_function
而不是:
functions1.py
import functions2 import other_function
然后我的测试有效,但
app>python path/to/app/src/app/app.py -flags
失败并出现 ModuleNotFoundError: No module named 'app'
。 请注意,other_function
由functions2.py
中的函数使用,但不是由我正在测试的functions2.py
中的特定函数使用。
如果其他人遇到这些问题,问题是我没有在可编辑模式下安装我正在本地处理的包(即导航到包,然后执行
pip install -e .
)。 完成后,我的测试将在测试和主 app.module
文件中以 .py
的形式导入。这是在文档中提到的,所以我没有任何借口!
干杯, 蒂姆