pytest python src布局

Dan*_*nny 2 python pytest

我正在尝试使用src目录推荐的python包布局之一.

在此输入图像描述

我的问题是当我从命令行运行pytest时,我的测试没有找到我的python包.我尝试从这个目录的顶层运行并在tests目录中运行,但仍然收到ModuleNotFoundError异常.我用pytest-3.5.0运行python 3.5.

从这种类型的python包布局中执行pytest的推荐方法是什么?

Abd*_*iJK 7

如果您正在使用py.test运行测试,它将找不到应用程序,因为您必须没有安装它.您可以python -m pytest用来运行测试,因为python会将您当前的工作目录自动添加到PATH中.

因此,python -m pytest ..如果您在src目录中执行此操作,则可以使用

我通常使用的结构是:

root
??? packagename
?   ??? __init__.py
?   ??? ...
??? tests
    ??? ...    
Run Code Online (Sandbox Code Playgroud)

这样,当我只是python -m pytest在根目录中运行时,它工作正常.欲了解更多信息,访问:https://stackoverflow.com/a/34140498/1755083

第二个选项,如果你仍想运行它,py.test你可以使用:

PYTHONPATH=src/ py.test
Run Code Online (Sandbox Code Playgroud)

并从根运行它.这只是将src文件夹添加到PYTHONPATH中,现在您的测试将知道在哪里找到该packagename包.

第三个选项是使用pip with -e以可编辑模式安装包.这将创建一个指向该packagename文件夹的链接并使用pip进行安装 - 因此所做的任何修改packagename都会立即反映在pip的安装中(因为它是一个链接).这个问题是,如果你移动了repo,你需要重做安装,如果你有超过1个克隆/包,你需要跟踪安装了哪个.

  • 将包放入 `src/` 的整个想法是_防止_它被导入。您想要测试已安装的包,而不是开发文件夹。 (9认同)

buh*_*htz 6

您的布局看起来不错,是今天推荐的。

但我认为你的问题出import在你的test_*.py文件中。您不应该关心在单元测试中从哪里导入包;只需导入它们即可。

通过以下方式在开发模式下安装--editable

这怎么可能做到呢?您必须在开发模式下“安装”您的软件包。使用--editable的选项pip。在这种情况下,不会构建和安装真正的包,而是仅使用符号链接将包文件夹(开发人员版本中的源)公开给操作系统,因为它将是真正的发布包。

现在你的单元测试永远不需要关心包安装在哪里以及如何导入它。只需导入它即可,因为系统已知该包。

注意:这是今天推荐的方式。sys.path其他通过操作或环境变量进行修改的“解决方案”PYTHONPATH只是来自 Python 的早期,现在应该避免。