“py.test”与“pytest”命令

2024-05-16 01:08:03 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的情况下,py.test命令失败,而pytest运行得非常好。

我使用pytest烧瓶插件:

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选项运行flask,则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工作正常。


Tags: inpyimportrestconfigappflaskhome
2条回答

使用pytest ...或者更好的python -m pytest ...

你可以忘记旧名字,如果你还在某个地方发现它,那显然是个错误。

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

py.test调用是旧的且已损坏的关节。pytest是新的热度(从3.0开始)。py.testpytest调用将共存很长一段时间,但在某些时候py.test可能会被弃用。所以我建议#dropthedot

[...] so from pytest 3.0 we will supported and recommend use of pytest as the main command instead of py.test. It's possible that in future we will deprecate py.test and potentially even remove it.

--Dave Hunt

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

相关问题 更多 >