"py.test"vs"pytest"命令

swi*_*end 47 python python-import pytest flask

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
Run Code Online (Sandbox Code Playgroud)

当我调用时,$ 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
Run Code Online (Sandbox Code Playgroud)

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

import pytest
from app.app import create_app

@pytest.fixture
def app():
    app = create_app()
    return app
Run Code Online (Sandbox Code Playgroud)

我的项目结构如下:

.
??? app
?   ??? __init__.py
?   ??? app.py
?   ??? config.py   # flask configuration objects
??? conftest.py     # pytest configruation
??? requirements.txt
??? ...
??? tests
    ??? ...
Run Code Online (Sandbox Code Playgroud)

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


更新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)
Run Code Online (Sandbox Code Playgroud)

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

Oli*_*ter 58

要更详细地回答关于实际命令的问题(意味着在命令行上调用工具):

py.test调用是老捣毁联合.pytest是新的热点(从3.0开始).py.testpytest调用会共存很长一段时间我猜想,但在某些时候py.test可能会被弃用.所以我建议#dropthedot.

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

- 戴夫亨特

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


sor*_*rin 6

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

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