Pytest,目录结构和导入错误

时间:2018-03-04 23:11:48

标签: python unit-testing import directory pytest

我正在使用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时没有测试)

那么所有这些导入应该如何使它全部工作并且在测试期间没有错误?

1 个答案:

答案 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)