我使用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。测试这些系统?


当前回答

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

PYTHONPATH=. py.test

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

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

其他回答

我不确定为什么是py。test不会在PYTHONPATH本身中添加当前目录,但这里有一个变通方法(从存储库的根目录执行):

python -m pytest tests/

它能工作是因为Python为你在PYTHONPATH中添加了当前目录。

正如Luiz Lezcano Arialdi所指出的,正确的解决方案是将您的包安装为可编辑包。

因为我正在使用Pipenv,所以我考虑在他的回答中逐步添加如何使用Pipenv将当前路径安装为可食用路径,允许运行pytest而不需要任何破坏代码或丢失文件。

你需要有以下最小的文件夹结构(文档):

package/
    package/
        __init__.py
        module.py
    tests/
        module_test.py
    setup.py

Setup.py主要有以下最小代码(文档):

import setuptools

setuptools.setup(name='package', # Change to your package name
                 packages=setuptools.find_packages())

然后你只需要运行pipenv install——dev -e。Pipenv将当前路径安装为可编辑包(——dev标志是可选的)(文档)。

现在您应该能够毫无问题地运行pytest了。

此外,如果在虚拟环境中运行pytest,请确保在虚拟环境中安装了pytest模块。激活虚拟环境并运行pip install pytest。

由于无法导入模块,测试经常会中断。

经过研究,我发现系统在错误的地方查看文件,我们可以通过在相同的文件夹中复制包含模块的文件来轻松克服这个问题,以便正确导入。

另一个解决方案建议是更改导入的声明,并向MutPy显示单元的正确路径。然而,由于多个单元可能具有这种依赖关系,这意味着我们也需要在它们的声明中提交更改,因此我们更喜欢简单地将单元移动到文件夹中。

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

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