web-dev-qa-db-ja.com

「py.test」対「pytest」コマンド

私の場合、py.testコマンドは失敗しますが、pytestは完全に正常に実行されます。

私は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

$ 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
    └── ...

では、2つのコマンドの違いは何ですか?そして、なぜ一方が失敗し、もう一方が失敗しないのですか?


アップデート1

1)相対インポートfrom .config import Configまたはfrom config import Configfrom app.config import Configなどの絶対インポートに変更する必要がありました

2)python3 -m app.appでflaskを実行

3)pytestおよびpy.testは正常に動作するようになりました

皆さん、どうもありがとうございました!


アップデート2

これは奇妙になります...絶対インポートを使用し、pythonを-mオプションで実行し、flaskをdebug=Trueで実行すると、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 __== '__main__':
    app.run(debug=True, use_reloader=False)

その後、python -m app.appは正常に動作します。

43
swiesend

実際のコマンド(コマンドラインでのツールの呼び出しを意味する)に関する質問にもう少し詳しく答えるには:

py.test呼び出しは、古くて破壊されたジョイントです。 pytestは新しいホットネスです(3.0以降)。 py.testpytestの呼び出しは長い間共存するでしょうが、ある時点でpy.testは廃止される可能性があります。 #dropthedot をお勧めします。

[...]したがって、pytest 3.0以降では、py.testの代わりにpytestをメインコマンドとして使用することをサポートおよび推奨します。将来的にはpy.testを廃止し、場合によっては削除する可能性もあります。

- デイブハント

後方互換性はpytestコミュニティにとって非常に重要な関心事であるため、古い方法は決してなくなることはなく、それを維持することはメンテナンスの負担にはなりません( setup.pyの別のエントリポイントとして定義されているだけです) )。

53

つかいます pytest ...またはさらに良いpython -m pytest ...

古い名前は忘れることができますが、まだどこかで見つけた場合は明らかにバグです。

6
sorin