web-dev-qa-db-fra.com

Commande "py.test" vs "pytest"

La commande py.test Échoue dans mon cas, tandis que pytest fonctionne parfaitement.

J'utilise le 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

Lorsque j'appelle $ py.test, J'obtiens l'erreur suivante:

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

Voici mon fichier conftest.py Réel:

import pytest
from app.app import create_app

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

Ma structure de projet est comme:

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

Alors, quelle est la différence entre les deux commandes? Et pourquoi l'un échoue et l'autre non?


mise à jour 1

1) J'ai dû changer mes importations relatives from .config import Config Ou from config import Config En absolues comme from app.config import Config

2) Exécution flask avec python3 -m app.app

3) maintenant pytest et py.test Fonctionnent normalement

Merci beaucoup pour votre aide, mes amis!


mise à jour 2

Cela devient bizarre ... lors de l'utilisation d'importations absolues, en exécutant python avec l'option -m Et flask avec debug=True alors la bibliothèque werkzeug ne recharge pas les sources comme prévu:

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

Cela m'a aidé dans mon app/app.py:

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

Alors python -m app.app Fonctionne très bien.

43
swiesend

Pour répondre plus en détail à la question sur la commande réelle (c'est-à-dire l'invocation de l'outil sur la ligne de commande):

Le py.test l'invocation est l'articulation ancienne et éclatée. pytest est la nouvelle nouveauté (depuis 3.0). py.test et pytest les invocations coexisteront longtemps je suppose, mais à un moment donné py.test est peut-être obsolète. Je recommanderais donc # dropthedot .

[...] donc à partir de pytest 3.0, nous prendrons en charge et recommanderons l'utilisation de pytest comme commande principale au lieu de py.test. Il est possible qu'à l'avenir, nous déconseillions py.test et que nous puissions même le supprimer.

- Dave Hunt

La rétrocompatibilité est une préoccupation très importante pour la communauté pytest, donc l'ancienne méthode pourrait ne jamais disparaître et ce n'est pas beaucoup de la charge de la maintenance de la conserver de toute façon (elle est simplement définie comme un point d'entrée différent dans setup.py ).

53
Oliver Bestwalter

Utilisation pytest ... ou mieux encore le python -m pytest ....

Vous pouvez oublier l'ancien nom, c'est clairement un bug si vous le repérez quelque part.

6
sorin