将pytest与src图层一起使用

时间:2018-05-03 12:47:25

标签: python pytest

pytest recommends包括一个用于分隔项目中源代码的附加目录:

my_package
├── src  # <-- no __init__.py on this layer
│   └── my_package
│       ├── __init__.py
│       └── util_module
│           ├── __init__.py
│           └── utils.py
└── tests
    ├── __init__.py
    └── test_util_module
        ├── __init__.py
        └── test_utils.py

可悲的是,他们没有说 1 关于测试代码中的导入应该如何在这种情况下工作,这对于我的IDE在this naive example 2 ,但是使用pytest导致以下错误:

my_package $ pytest

====================== test session starts ======================
platform linux -- Python 3.6.4, pytest-3.5.1, py-1.5.3, pluggy-0.6.0
rootdir: /home/user/workspace/my_package, inifile:
collected 0 items / 1 errors     

============================ ERRORS =============================
___ ERROR collecting tests/test_util_module/test_utils.py ___
ImportError while importing test module '/home/user/workspace/my_package/tests/test_util_module/test_utils.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_util_module/test_utils.py:1: in <module>
    from test.test_module.some_file import starify
E   ModuleNotFoundError: No module named 'my_package.util_module'
!!!! Interrupted: 1 errors during collection !!!!!

我可以通过将测试导入更改为from src.my_package.util_module.utils import starify来修复此问题,但我的IDE抱怨src部分是多余的,所以我想保留它。

1:不再是这种情况了。从版本3.7.3开始,pytest建议在good practices顶部的@ hoefling回答中提供可编辑安装。

2:设置为virtualenv env -p python3.6; source env/bin/activate; pip install pytest

2 个答案:

答案 0 :(得分:10)

调整PYTHONPATH(如评论中所示)是解决导入问题的一种可能性。另一个是在conftest.py目录中添加一个空的src文件:

$ touch src/conftest.py

pytest会将src添加到sys.path。这是一种欺骗pytest将代码库添加到sys.path的简单方法。

但是,当您打算构建分发时,通常会选择src布局,例如提供setup.py(在这种情况下)明确指定根包dir:

from setuptools import find_packages, setup


setup(
    ...
    package_dir={'': 'src'},
    packages=find_packages(where='src'),
    ...
)

并在开发模式下(通过python setup.py developpip install --editable .)安装软件包,同时您还在开发它。这样,您的包my_package已正确集成到Python的网站包结构中,无需使用PYTHONPATH

答案 1 :(得分:1)

在使用github动作(已知问题)时,PYTHONPATH更新对我不起作用。使用这个带有pytest.ini文件的pytest-pythonpath安装反而对我有用:

pip install pytest-pythonpath # accompany with python_path in pytest.ini, so PYTHONPATH is updated with location for modules under test

使用此命令,基本的“ pytest”命令可以在子目录中愉快地找到所有测试,并根据我的pytest.ini(在pycharm中设置为与源文件夹匹配)找到正在测试的模块