Python 通常的pytest工作流程-can';t在文件中运行测试

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

我试图设置一个项目(Python3.4.4,pytest 3.3.1)来使用pytest,但pytest无法在文件或目录中运行测试。我认为我使用pytest是错误的,但不是正确的工作流程

我试过的 根据中的建议,以及出于个人偏好,将源代码和测试放在单独的文件夹中,我已将我的项目设置如下:

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