pytest无法找到位于tests目录下的辅助模块。

3
当我使用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时会失败的导入行。从app包中导入的模块是可以正常工作的:

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

我必须使用pip install -e packagename安装我的软件包,以便在从命令行运行测试时对pytest可用。我想我将不得不将tools文件夹作为一个包添加到我的setup.py中,但这让我感觉很丑陋,因为这些模块仅用于辅助测试过程,并不打算分发。
另一方面,我可以按照pytest网站的integration advices使用python setup.py test来启动我的测试。

你在Pycharm中创建虚拟环境吗? - FierceScarf
我正在使用 pyenvpyenv-virtualenv 来管理我的开发环境。在 PyCharm 中的配置将项目解释器指向特定的虚拟环境。 - user3072532
2个回答

1

可能你的tests和/或tests/tools目录中没有__init__.py文件。如果缺少这些文件,Python会将它们视为包并且无法导入它们。

  • 添加__init__.py文件(不好,请参见此处
  • 在你的conftest.py中将tests/tools添加到你的PYTHONPATH中,并从一个文件中导入(从import tests.tools.MODULEimport MODULE

我接受了你的答案,因为你尝试解决问题而不触及原始目录布局 :) - user3072532
但是,通过操作Python路径,特别是如果更改了导入的语义名称,会更糟糕... - ely
仅当您不遵循pytest的最佳实践时(https://pytest.readthedocs.io/en/2.7.3/goodpractises.html),@ely才是正确的。如果您的测试不可导入,pytest已经更改了您的Python路径,解决方案完全可以。如果您的测试可导入,则不需要此解决方案。 - sax
让pytest透明地改变路径是一个已记录和预期的事情,这是pytest可以做到的(甚至可以使用python -m pytest显式地执行)。为了导入东西而手动更改路径并以一种方式进一步进行操作,使得模块的路径在完全限定的导入名称中没有反映,除非您知道在Python路径上使用了什么修改,这是一种不好的模式,应该避免。 - ely

0
为了能够导入位于src文件夹外的模块,我在PyCharm的“项目设置”中进入“项目结构”,将tests/end_to_endtests/unit标记为源代码文件夹
我还改变了主意,决定将我的辅助模块放在这些文件夹里。这样我就可以直接导入它们,在终端中运行我的测试也很好,因为当前工作目录总是添加到PYTHONPATH中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接