【问题标题】:Pytest, directory structure and import errorsPytest,目录结构和导入错误
【发布时间】:2018-03-04 23:11:47
【问题描述】:

我正在用 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 时,此导入有效) .

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

【问题讨论】:

  • 你的__init__.py在哪里?
  • 对不起,我忘了__init__.py。它在那里,我只是忘记在帖子中添加这个。我将编辑我的帖子。
  • Football(项目根目录)中添加一个空的conftest.py(不是“context.py”)。它将解析测试中的导入。

标签: python unit-testing import directory pytest


【解决方案1】:

您需要将__init__.py 添加到您的 Football/football 目录中,以便发现 python 包。然后,您可以做的一件事是在项目的根级别添加setup.py,并在其中使用find_packages() 递归查找要添加到python 路径的包。然后,您必须在运行测试之前将您的项目安装到虚拟环境中。 tox 之类的工具通过在调用测试命令之前自动设置虚拟环境来更轻松地完成这些步骤。

另一种选择是使用monkeypatch 固定装置(一个 pytest 内置)并为您的测试修改 PYTHONPATH。你可以把它放在你的测试/conftest.py 中。您仍然需要在 Football/football 目录中创建一个__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)

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 2019-03-15
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    相关资源
    最近更新 更多