我使用easy_install在Mac上安装pytest,并开始为一个具有如下文件结构的项目编写测试:

repo/
   |--app.py
   |--settings.py
   |--models.py
   |--tests/
          |--test_app.py

py运行。在repo目录中进行测试,一切都如您所料。

但是当我在Linux或Windows上尝试同样的事情时(两者都有pytest 2.2.3),每当它第一次从我的应用程序路径导入某些东西时,它就会发出吠叫。例如,from app import some_def_in_app。

我需要编辑我的PATH来运行py。测试这些系统?


当前回答

根据Dirk Avery在Medium上的一篇文章(我个人经验也支持),如果你在项目中使用虚拟环境,那么你就不能使用系统范围的pytest安装;您必须在虚拟环境中安装它并使用该安装。

特别是,如果在两个地方都安装了它,那么简单地运行pytest命令将不起作用,因为它将使用系统安装。正如其他答案所描述的,一个简单的解决方案是运行python -m pytest而不是pytest;这是因为它使用了环境版本的pytest。或者,你也可以卸载系统版本的pytest;重新激活虚拟环境后,pytest命令应该可以工作。

其他回答

我得到这个错误,因为我使用相对导入不正确。在OP示例中,test_app.py应该使用e.g.导入函数。

from repo.app import *

然而,尽管__init__.py文件分散在文件结构中,但这不会起作用,并会创建所见的ImportError类型,除非文件和测试文件在同一目录中。

from app import *

以下是我在一个项目中所做的一个例子:

这是我的项目结构:

microbit/
microbit/activity_indicator/activity_indicator.py
microbit/tests/test_activity_indicator.py

为了能够从test_activity_indicator.py访问activity_indicator.py,我需要:

使用正确的相对导入启动test_activity_indicator .py:

    from microbit.activity_indicator.activity_indicator import *

在整个项目结构中放置__init__.py文件:

    microbit/
    microbit/__init__.py
    microbit/activity_indicator/__init__.py
    microbit/activity_indicator/activity_indicator.py
    microbit/tests/__init__.py
    microbit/tests/test_activity_indicator.py

将pytest本身作为一个模块运行: Python -m pytest测试

例如,当项目层次结构为package/src package/tests时,在从src导入的测试中,就会发生这种情况。作为模块执行会将导入视为绝对的,而不是相对于执行位置。

我得到这个错误由于一些更简单的(你甚至可以说微不足道)。我还没有安装pytest模块。所以一个简单的安装python-pytest为我解决了这个问题。

'pytest'将在setup.py中作为测试依赖项列出。确保您也安装了测试需求。

我们通过添加以下环境变量修复了这个问题。

PYTHONPATH=${PYTHONPATH}:${PWD}/src:${PWD}/test

您可以在项目根中使用PYTHONPATH运行

PYTHONPATH=. py.test

或者使用pip install作为可编辑导入

pip install -e .   # install package using setup.py in editable mode