【问题标题】:Folder structure and import problems with pytestpytest 的文件夹结构和导入问题
【发布时间】:2019-03-15 19:26:39
【问题描述】:

想象一个简单的文件夹结构:

my_folder/
    __init__.py
    funcs.py
    tests/
        test_funcs.py

funcs.py:

def f():
    return 2

__init__.py:

from funcs import f

test_funcs.py:

from funcs import f

def test_f():
    assert f() == 2

这是文档中建议的方法之一: https://pytest.readthedocs.io/en/reorganize-docs/new-docs/user/directory_structure.html

但是当我从 my_folder 运行 pytest 时:

tests/test_funcs.py:1: in <module>
    from funcs import f
E   ModuleNotFoundError: No module named 'funcs'

这很奇怪,因为我本以为 pytest 设置了它运行的路径,所以如果不手动处理就不会出现这些错误。

文档也没有对此给出任何指示......他们只是说:

通常您可以通过指向测试目录或模块来运行测试:

pytest tests/test_appmodule.py      # for external test dirs
pytest src/tests/test_appmodule.py  # for inlined test dirs
pytest src                          # run tests in all below test directories
pytest                              # run all tests below current dir

我错过了什么?

【问题讨论】:

  • 你的 __init__.py 你应该有 from .funcs import f -- 你正在做一个相对于包的导入
  • @AnthonySottile 我也考虑过这个解决方案。不幸的是,使用该修改运行 pytest 仍然会产生相同的错误:E ModuleNotFoundError: No module named 'funcs'
  • 哦,你的测试文件也应该有from my_folder.funcs import f -- $ python -m pytest -q my_folder ==> 1 passed in 0.01 seconds
  • 行得通! (当它在 my_folder 之外运行时)。但是在 my_folder 中运行 pytest 仍然失败
  • 这证明文档缺少一些东西!您甚至提供了另一种运行测试的方法!文档只是说pytest...

标签: python python-import pytest


【解决方案1】:

必须从模块funcs所在的目录运行测试文件test_funcs.py才能成功导入。

作为一种解决方法,您可以修改sys.path,它决定了interpeter 的模块搜索路径。

test_funcs.py:

import sys
sys.path.append('/Users/Yahya/Desktop/my_folder')

from funcs import f

def test_f():
    assert f() == 2

【讨论】:

  • 只是要注意:路径"/Users/Yahya/Desktop/my_folder" 只是一个例子。如果要确定my_folder的绝对路径,可以打开终端cd my_folderpwd
  • 我知道这种解决方法,但您是说文档有误,或者至少明显不完整? (见添加的报价)
  • monkeypatching sys.path 几乎从来都不是正确的方法
  • tests/test_funcs.py 中使用funcs 的唯一方法是将__init__.py(原样)从my_folder 移动到tests。在此传输之后从 my_folder 运行 pytest 将导致通过测试。不幸的是,文档特别建议不要这样做:“你的测试目录中不应该有 init.py 文件”
【解决方案2】:

这是一个非常简单的方法:

  1. 清空__init__.py
  2. 从高于my_folder 的级别运行python -m pytestpython -m pytest tests(但不是pytest

解释: 运行带有-m 选项的模块会将其包含在PYTHONPATH 中,因此与导入语句相关的所有事情都会顺利解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2022-07-16
    相关资源
    最近更新 更多