Python 通常的pytest工作流程-can';t在文件中运行测试
我试图设置一个项目(Python3.4.4,pytest 3.3.1)来使用pytest,但pytest无法在文件或目录中运行测试。我认为我使用pytest是错误的,但不是正确的工作流程 我试过的 根据中的建议,以及出于个人偏好,将源代码和测试放在单独的文件夹中,我已将我的项目设置如下:Python 通常的pytest工作流程-can';t在文件中运行测试,python,pytest,Python,Pytest,我试图设置一个项目(Python3.4.4,pytest 3.3.1)来使用pytest,但pytest无法在文件或目录中运行测试。我认为我使用pytest是错误的,但不是正确的工作流程 我试过的 根据中的建议,以及出于个人偏好,将源代码和测试放在单独的文件夹中,我已将我的项目设置如下: parent_directory/ setup.py src/ project_name/ __init__.py # empty
parent_directory/
setup.py
src/
project_name/
__init__.py # empty
utils.py
tests/
__init__.py # empty
project_name/
__init__.py # empty
test_utils.py # has `import project_name.utils.py`
有了这个精确的设置,他说我应该能够运行测试
使用
pytest会将当前目录添加到sys.path中(“除了通过python调用也会将当前目录添加到sys.path中”)。如果我尝试从父目录/src
执行此操作,则不会收集任何测试(收集了0项
)。如果我从parent\u目录/
执行此操作,我将得到ImportError:没有名为“project\u name”的模块
在--(参见“测试根路径”)之后,我发现在src/
中添加(一个空的)conftest.py将使pytest在不指定PYTHONPATH的情况下识别应用程序模块”
完成此操作后,我可以转到父目录/
并成功运行
pytest
及
请注意,我可以从python-mpytest
切换到pytest
,这让我很高兴
但是,如果我尝试在特定文件(或目录)中运行测试,例如
一、 再次获取导入错误:没有名为'project\u name'的模块
。这种行为令我十分惊讶
我查过:
- -不同的目录结构
- (第一个建议是
sys.path
“hack”,第二个建议是环境变量,如果一个人同时处理多个项目,这是不实际的——当然有更好的方法)
- -不同的目录结构
问题:
什么是正确的工作流程,允许我保留我的目录结构,同时最好从父目录/
调用以下所有内容:
pytest
pytest -k test_some_specific_test_function_name
pytest tests/project_name/test_utils.py
没有一些手动sys.path
hacking
我肯定我错过了一些明显的东西。谢谢 Pytest将将当前目录添加到sys.path
,但这并不一定意味着它使您的包可以从源代码树导入。事实上,使用src
和test
布局的整个要点是防止pytest针对源代码树进行测试
您可以通过从项目的顶级目录运行python解释器并尝试导入包来检查这一点。除非它已经安装在您的工作环境中,否则它不会工作
通过使用src
和test
布局,pytest将被迫针对安装的软件包版本进行测试。以这种方式组织项目的动机来看。以下是关键段落:
您将被迫测试已安装的代码(例如,通过在virtualenv中安装)。这将确保部署的代码正常工作(正确打包),否则测试将失败。很早。在发布损坏的分发版之前
因此,如果您想在项目中使用这种布局,您需要在测试之前安装软件包。这两种方法都有优点和缺点,但pytest推荐使用,我倾向于同意
[更新]
为了方便本地测试,您可以使用setup.py develope
或pip install-e在中安装软件包。这使您的软件包看起来已安装在您的环境中,但源代码树中的任何更新都将立即反映在“已安装”版本中。1
如果您选择采用这种方法,您应该确保您使用的是沙盒开发环境(例如virtualenv
或conda
),这样您就不会污染您的系统环境
1您应该知道,如果您的软件包提供了C/C++或Cython扩展,则需要手动重新生成它们。似乎我无意中选择了一种更适合库而不是应用程序的布局。现在,我希望能够在开发过程中本地运行测试(全部,一个,一个dir/文件),而无需每次安装/部署应用(+在CI服务器上)。我有一个应用程序运行的固定配置。1) 什么样的布局效果好?2) 如果我想在不安装的情况下运行快速测试并拥有安装后测试套件,通常的解决方案是什么?如果你能(甚至非常简短地)给出你的答案,我将非常感激。好的洞察力,阅读链接和更多,谢谢,感谢!
pytest -k test_some_specific_test_function_name
pytest tests/project_name/test_utils.py
pytest
pytest -k test_some_specific_test_function_name
pytest tests/project_name/test_utils.py