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
答案 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 develop
或pip 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中设置为与源文件夹匹配)找到正在测试的模块