我正在使用Python编写我的第一个项目,我发现Python和PyTest令人沮丧的是,使目录结构和导入模块工作变得复杂。
我有一个像这样的目录结构:
Football
football
__init__.py
file1.py
file2.py
file3.py
main.py
tests
context.py
test_file1.py
test_file2.py
test_file3.py
显然,文件的名称与上例不同。
当我想从file1.py或main.py中的file2.py导入类File2时,在file1.py或main.py中写道:
from file2 import File2
我的context.py文件的内容是:
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
import football
这是其中一个测试文件(例如'test_file1.py')的内容或多或少的内容:
from context import football
from football.file1 import File1
当我运行football / main.py时,它可以运行。
但是当我运行pytest时,我或多或少地得到了错误:
football/file1.py:2: in <module>
from file2 import File2
E ImportError: No module named 'file2'
因此它正确导入'file1.py'文件,但是当该文件导入'file2.py'时,它会引发无法导入的错误(尽管这种导入在我运行football / main.py时没有测试)
那么所有这些导入应该如何使它全部工作并且在测试期间没有错误?
答案 0 :(得分:1)
您需要将__init__.py
添加到您的Football / football目录中以进行python包发现。然后,您可以做的一件事是在项目的根级别添加setup.py并在其中使用find_packages()以递归方式查找要添加到python路径的包。然后,您必须在运行测试之前将项目安装到虚拟环境中。像tox这样的工具可以在调用测试命令之前自动设置虚拟环境,从而更轻松地完成这些步骤。
另一个选择是使用monkeypatch fixture(pytest builtin)并修改PYTHONPATH以进行测试。你可以把它放在你的tests / conftest.py中。您还需要在足球/足球目录中创建__init__.py
。
@pytest.fixture(autouse=True) # run this automatically before tests
def pythonpath(monkeypatch):
path_to_project = "<path to your project root>"
monkeypatch.setenv('PYTHONPATH', path_to_project)