Команда "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
    └── ...

Итак, в чем разница между двумя командами? И почему одна неудача, а другая нет?


update 1

1) Мне пришлось изменить относительный импорт from .config import Config или from config import Config на абсолютные значения, например from app.config import Config

2) Текущая колба с python3 -m app.app

3) теперь pytest и py.test работают нормально

Большое спасибо за вашу помощь, ребята!


update 2

Это становится странным... при использовании абсолютного импорта, запуская python с опцией -m и флягой с 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 __name__ == '__main__':
    app.run(debug=True, use_reloader=False)

Тогда python -m app.app отлично работает.

Ответы

Ответ 1

Более подробно ответьте на вопрос о фактической команде (что означает вызов инструмента в командной строке):

Вызов py.test - это старый и разоренный сустав. pytest - новая жара (начиная с 3.0). py.test и pytest вызовы будут сосуществовать в течение длительного времени, я думаю, но в какой-то момент py.test может быть устаревшим. Поэтому я бы рекомендовал # dropthedot.

[...], поэтому из pytest 3.0 мы будем поддерживать и рекомендовать использование pytest в качестве основной команды вместо py.test. Возможно, что в будущем мы будем осуждать py.test и потенциально даже удалять его.

- Дэйв Хант

Обратная совместимость - это очень важная проблема для сообщества pytest, поэтому старый способ никогда не исчезнет, ​​и это не так много нагрузки на обслуживание, чтобы сохранить его в любом случае (он просто определяется как другая точка входа в setup.py).

Ответ 2

Используйте pytest ... или еще лучше python -m pytest ....

Вы можете забыть о старом имени, это явно ошибка, если вы все еще заметили это где-то.