68 votes

"Commande "py.test" vs "pytest

Le site py.test échoue dans mon cas, alors que pytest fonctionne très bien.

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'invoque $ py.test Je reçois 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

C'est mon actuel conftest.py fichier :

import pytest
from app.app import create_app

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

La structure de mon projet est la suivante :

.
 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 pas l'autre ?


mise à jour 1

1) J'ai dû changer mes importations relatives from .config import Config ou from config import Config à ceux qui sont absolus comme from app.config import Config

2) Faire tourner le ballon avec python3 -m app.app

3) maintenant pytest y py.test travail normal

Merci beaucoup pour votre aide, les amis !


actualisation 2

Cela devient bizarre... lors de l'utilisation d'importations absolues, l'exécution de python avec la commande -m et flask avec debug=True alors le 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 __name__ == '__main__':
    app.run(debug=True, use_reloader=False)

Entonces python -m app.app fonctionne bien.

6 votes

pytest est la commande nouveau et vous avez probablement une ancienne version de pytest qui traîne.

1 votes

Merci pour l'astuce ! Je vais donc utiliser uniquement pytest à l'avenir...

0 votes

Qu'est-ce que which pytest y which py.test dire ?

88voto

Oliver Bestwalter Points 2646

Pour répondre à la question sur la commande réelle (c'est-à-dire l'invocation de l'outil sur la ligne de commande) de manière un peu plus détaillée :

Le site py.test L'invocation est le vieux joint cassé. pytest est la nouvelle mode (depuis 3.0). py.test y pytest coexisteront encore longtemps, je suppose, mais à un moment donné py.test pourrait être déprécié. Je recommande donc de #dropthedot .

[...] Ainsi, à partir de pytest 3.0, nous supporterons et recommanderons l'utilisation de pytest comme commande principale au lieu de py.test. Il est possible qu'à l'avenir nous dépréciions py.test et que nous le supprimions.

-- 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 un gros problème de maintenance de la conserver de toute façon (elle est simplement définie comme un point d'entrée différent dans le fichier setup.py ).

0 votes

Mais au moins afficher un avertissement aurait été beaucoup plus utile, actuellement certaines erreurs ne se produisent pas lorsque pytest est utilisé alors qu'elles le font avec py.test ce qui est assez déroutant si on n'est pas au courant de la dépréciation de py.test.

1 votes

@aderchox Je ne suis pas au courant d'un tel problème et je ne vois pas comment ils pourraient se comporter différemment (regardez le lien à setup.py dans ma réponse - il s'agit littéralement de deux noms différents pour exactement la même chose). Si vous avez vraiment trouvé un problème et qu'il est reproductible, veuillez ouvrir une question sur le gestionnaire de problèmes de pytest.

8voto

sorin Points 23747

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X