“py.test”与“pytest”命令

Posted

技术标签:

【中文标题】“py.test”与“pytest”命令【英文标题】:"py.test" vs "pytest" command 【发布时间】:2017-01-22 13:18:16 【问题描述】:

在我的情况下,py.test 命令失败,而 pytest 运行完全正常。

我使用 pytest-flask 插件:

platform linux -- Python 3.5.2, pytest-3.0.2, py-1.4.31, pluggy-0.3.1
rootdir: /home/sebastian/develop/py/flask-rest-template, inifile: 
plugins: flask-0.10.0

当我调用 $ py.test 时,我收到以下错误:

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/_pytest/config.py", line 301, in _getconftestmodules
    return self._path2confmods[path]
KeyError: local('/home/sebastian/develop/py/flask-rest-template')

During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/_pytest/config.py", line 332, in _importconftest
    return self._conftestpath2mod[conftestpath]
KeyError: local('/home/sebastian/develop/py/flask-rest-template/conftest.py')

During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/_pytest/config.py", line 338, in _importconftest
    mod = conftestpath.pyimport()
  File "/usr/local/lib/python3.5/dist-packages/py/_path/local.py", line 650, in pyimport
    __import__(modname)
  File "/usr/local/lib/python3.5/dist-packages/_pytest/assertion/rewrite.py", line 207, in load_module
    py.builtin.exec_(co, mod.__dict__)
  File "/home/sebastian/develop/py/flask-rest-template/conftest.py", line 2, in <module>
    from app.app import create_app
  File "/home/sebastian/develop/py/flask-rest-template/app/app.py", line 1, in <module>
    from flask import Flask
ImportError: No module named 'flask'
ERROR: could not load /home/sebastian/develop/py/flask-rest-template/conftest.py

这是我的实际conftest.py 文件:

import pytest
from app.app import create_app

@pytest.fixture
def app():
    app = create_app()
    return app

我的项目结构如下:

.
├── app
│   ├── __init__.py
│   ├── app.py
│   └── config.py   # flask configuration objects
├── conftest.py     # pytest configruation
├── requirements.txt
├── ...
└── tests
    └── ...

那么,这两个命令有什么区别呢?为什么一个失败而另一个没有?


更新 1

1) 我必须将我的相对导入 from .config import Configfrom config import Config 更改为绝对导入,例如 from app.config import Config

2) 使用 python3 -m app.app 运行烧瓶

3) 现在pytestpy.test 工作正常

非常感谢你们的帮助,伙计们!


更新 2

这越来越奇怪了...当使用绝对导入时,使用 -m 选项运行 python 并使用 debug=True 运行烧瓶,然后 werkzeug 库不会按预期重新加载源:

http://chase-seibert.github.io/blog/2015/06/12/flask-werkzeug-reloader-python-dash-m.html

https://github.com/pallets/werkzeug/issues/461

https://github.com/pallets/flask/issues/1246

这对我的app/app.py 有帮助:

if __name__ == '__main__':
    app.run(debug=True, use_reloader=False)

然后python -m app.app 工作正常。

【问题讨论】:

pytest 命令是 new 方式,你可能有一个旧版本的 pytest。 感谢您的提示!所以以后我只会用pytest... which pytestwhich py.test 怎么说? /usr/local/bin/py.test/usr/local/bin/pytest。当我像sudo pip3 install pytest 一样安装时,两者都带有pytest-3.0.2-py2.py3-none-any.whl 哈!它是关于相对进口的......当我做from .config import Config 然后pytest 运行良好。但是当像from config import Config 这样导入时,它会失败...... 【参考方案1】:

更详细地回答有关实际命令(即在命令行上调用工具)的问题:

py.test 调用是旧的和破坏的联合。 pytest 是新的热点(从 3.0 开始)。我猜py.testpytest 调用将共存很长时间,但在某些时候py.test 可能会被弃用。所以我会推荐给#dropthedot。

[...] 所以从 pytest 3.0 开始,我们将支持并推荐使用 pytest 作为主命令,而不是 py.test。将来我们可能会弃用 py.test 甚至删除它。

-- Dave Hunt

向后兼容性对于 pytest 社区来说是一个非常重要的问题,因此旧方法可能永远不会消失,而且无论如何保留它也不会造成太大的维护负担(它只是在 setup.py 中定义为不同的入口点) .

【讨论】:

但至少显示一个警告会更有用,目前使用 pytest 时不会发生一些错误,而使用 py.test 会很混乱,如果不知道py.test 的弃用 @aderchox 我不知道这样的问题,我不确定它们的行为会如何不同(查看我的回答中指向setup.py 的链接 - 它实际上是两个不同的名称一样)。如果您确实在那里发现了问题并且可以重现,请在 pytest 问题跟踪器上打开一个问题。【参考方案2】:

使用pytest ... 甚至更好的python -m pytest ...

您可以忘记旧名称,如果您仍然在某个地方发现它显然是一个错误。

【讨论】:

以上是关于“py.test”与“pytest”命令的主要内容,如果未能解决你的问题,请参考以下文章

pytest命令允许参数

pytest的执行方式及搜索原则

pytest完整

如何查看在 Django 的 manage.py test 命令期间运行了哪些测试

找不到 Py.test 命令,但已安装库

@Patch 装饰器与 pytest 夹具不兼容