Pytest,目录结构和导入错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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而不进行测试时有效)。

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

答案

您需要将__init__.py添加到您的足球/足球目录以进行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)

以上是关于Pytest,目录结构和导入错误的主要内容,如果未能解决你的问题,请参考以下文章

pytest模块导入ImportError:没有模块命名

Pytest权威教程24-Pytest导入机制及系统路径

pytest为什么不能运行指定目录下的用例

从 reduceByKey() 调用函数时单元测试期间的导入错误

Pytest 和覆盖率:为啥覆盖率结果会随目录结构而变化?

Pytest-bdd(二):项目结构