Comando “py.test” vs “pytest”

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  from app.app import create_app File "/home/sebastian/develop/py/flask-rest-template/app/app.py", line 1, in  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 fonts 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.

– Dave Hunt

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.