python - Comando "py.test" vs "pytest"
flask python-import (2)
El comando py.test
está fallando en mi caso, mientras que pytest
está ejecutando totalmente bien.
Yo uso el plugin 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
Cuando invoco $ py.test
obtengo el siguiente error:
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
Este es mi archivo conftest.py
real:
import pytest
from app.app import create_app
@pytest.fixture
def app():
app = create_app()
return app
La estructura de mi proyecto es como:
.
├── app
│ ├── __init__.py
│ ├── app.py
│ └── config.py # flask configuration objects
├── conftest.py # pytest configruation
├── requirements.txt
├── ...
└── tests
└── ...
Entonces, ¿cuál es la diferencia entre los dos comandos? ¿Y por qué uno falla y el otro no?
actualización 1
1) Tuve que cambiar mis importaciones relativas from .config import Config
o from config import Config
a from app.config import Config
absolutos como from app.config import Config
2) Matraz de funcionamiento con python3 -m app.app
3) ahora pytest
y py.test
funcionan normalmente
Muchas gracias por su ayuda, amigos!
actualización 2
Esto se está volviendo raro ... cuando se usan importaciones absolutas, ejecutando python con la opción -m
y matraz con debug=True
entonces la biblioteca werkzeug
no está recargando las fuentes como se esperaba:
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
Esto me ayudó en mi app/app.py
:
if __name__ == ''__main__'':
app.run(debug=True, use_reloader=False)
Entonces python -m app.app
funciona bien.
Para responder a la pregunta sobre el comando real (es decir, la invocación de la herramienta en la línea de comandos) con un poco más de detalle:
La invocación py.test
es la articulación antigua y rota. pytest
es el nuevo hotness (desde 3.0). py.test
invocaciones py.test
y pytest
coexistirán durante mucho tiempo, supongo, pero en algún momento py.test
puede estar obsoleto. Así que lo recomendaría a #dropthedot .
[...] desde pytest 3.0 admitiremos y recomendaremos el uso de pytest como comando principal en lugar de py.test. Es posible que en el futuro desechemos py.test y, posiblemente, lo eliminemos.
La compatibilidad con versiones anteriores es una preocupación muy importante para la comunidad pytest, por lo que la forma antigua nunca desaparecerá y no será una carga de mantenimiento mantenerla de todos modos (solo se define como un punto de entrada diferente en setup.py ).
Use pytest ...
o incluso mejor python -m pytest ...
Puedes olvidarte del nombre antiguo, es claramente un error si aún lo encuentras en algún lugar.