pytest 找不到位于测试目录下的辅助模块

pytest can't find helper modules located under the tests directory

当使用 PyCharm 启动我的测试时,我完全没有导入问题,但如果我在终端中执行此操作,pytest 会抱怨找不到模块。正是 tests/tools.

下的那些

项目文件夹结构:

src/
    app/

tests/
    end_to_end/ # End to end/Acceptance tests
    tools/      # Helper modules used by some tests
    unit        # Unit tests

setup.py

setup.py的相关部分:

setup(...
      packages=find_packages('src'),
      package_dir={'': 'src'},
      install_requires=['requests'],
      test_suite='tests',
      tests_require=[
          'flexmock',
          'pytest',
          'wsgi_intercept'
      ])

执行时导入失败的行 py.test tests/end_to_end,无论 virtualenv 是否处于活动状态。从 app 包导入的模块没问题:

from tests.tools.foomodule import Foo # Fails
from app.barmodule import Bar         # Doesn't fail

我必须使用 pip install -e packagename 安装我的包,以便在从命令行进行 运行 测试时 可用 用于 pytest。我想我必须将 tools 文件夹作为一个包添加到我的 setup.py 中,但这对我来说很难看,因为这些模块仅用于帮助测试过程,并不打算分发.

另一方面,我可以在 integration advices from pytest website.

之后使用 python setup.py test 启动我的测试

可能您的 tests and/or tests/tools 目录中没有 __init__.py。 如果错过 python 确实将它们视为包并且无法导入它们。 您可以:

  • 添加 __init__.py(错误参见 here
  • 将 tests/tools 添加到 conftest.py 中的 PYTHONPATH 并导入一个文件(从 import tests.tools.MODULEimport MODULE

为了能够导入驻留在 src 文件夹之外的模块,我在 PyCharm 中转到 "Project settings",然后在 "Project structure" 中我标记了 tests/end_to_endtests/unit 作为 source folders.

我也改变了主意,决定将我的辅助模块放在这些文件夹中。这样我就可以直接导入它们,我的测试 运行 在终端也很好,因为当前工作目录总是添加到 PYTHONPATH.