pytest-cov не работает с tox

Это моя tox.ini конфигурация

[tox]
envlist = py36

[testenv]
commands = pytest -vv --pep8 --flakes \
            --cov=quest --cov-report \
            term-missing --profile {posargs}
deps = -rrequirements.txt

Когда я запускаю tox, я получаю эту ошибку

$ tox
GLOB sdist-make: /Users/hanxue/DrRed/quest-backend/setup.py
py36 inst-nodeps: /Users/hanxue/DrRed/quest-backend/.tox/dist/quest-3.0.0.zip
py36 installed: aniso8601==1.2.1,apipkg==1.4,argon2-cffi==16.3.0,cffi==1.10.0,click==6.7,configparser2==4.0.0,execnet==1.5.0,Flask==0.12.2,Flask-Cors==3.0.3,Flask-JWT==0.3.2,Flask-JWT-Extended==3.3.1,Flask-Login==0.4.0,Flask-RESTful==0.3.6,Flask-SocketIO==2.9.2,Flask-SQLAlchemy==2.3.2,gevent==1.2.2,gevent-websocket==0.10.1,greenlet==0.4.12,httplib2==0.10.3,itsdangerous==0.24,Jinja2==2.9.6,MarkupSafe==1.0,matrix==2.0.1,passlib==1.7.1,pep8==1.7.0,psycopg2==2.7.3,py==1.4.34,pycparser==2.18,pyflakes==1.6.0,PyJWT==1.4.2,pytest==3.2.3,pytest-cache==1.0,pytest-flakes==2.0.0,pytest-flask==0.10.0,pytest-pep8==1.0.6,python-dateutil==2.6.1,python-engineio==1.7.0,python-socketio==1.8.1,pytz==2017.2,quest==3.0.0,six==1.10.0,SQLAlchemy==1.1.12,Werkzeug==0.12.2
py36 runtests: PYTHONHASHSEED='65686078'
py36 runtests: commands[0] | pytest -vv --pep8 --flakes --cov=quest --cov-report term-missing --profile
usage: pytest [options] [file_or_dir] [file_or_dir] [...]
pytest: error: unrecognized arguments: --cov=quest --cov-report --profile
  inifile: None
  rootdir: /Users/hanxue/DrRed/quest-backend
ERROR: InvocationError: '/Users/hanxue/DrRed/quest-backend/.tox/py36/bin/pytest -vv --pep8 --flakes --cov=quest --cov-report term-missing --profile'
___________________________________ summary ____________________________________
ERROR:   py36: commands failed

Обратите внимание, что список установленных пакетов не включает pytest-cov и coverage, хотя они явно включены в мои requirements.txt и tox.ini включают строку

deps = -rrequirements.txt

Запуск команды pytest напрямую работает нормально

$ PYTHONPATH=src/ pytest -vv --pep8 --flakes --cov=quest --cov-report term-missing --profile

Как мне установить отсутствующую библиотеку pytest-coverage с помощью tox?

Обновление 1

Содержание requirements.txt

aniso8601==1.2.1
argon2-cffi==16.3.0
cffi==1.10.0
click==6.7
colorama==0.3.9
configparser2==4.0.0
Coverage==4.4.1
Flask==0.12.2
Flask-RESTful==0.3.6
Flask-Login==0.4.0
Flask-Cors==3.0.3
Flask-JWT==0.3.2
Flask-JWT-Extended==3.3.1
Flask-SocketIO==2.9.2
Flask-SQLAlchemy==2.3.2
gevent==1.2.2
gevent-websocket==0.10.1
gprof2dot==2017.9.19
greenlet==0.4.12
httplib2==0.10.3
itsdangerous==0.24
Jinja2==2.9.6
MarkupSafe==1.0
matrix==2.0.1
passlib==1.7.1
psycopg2==2.7.3
pycparser==2.18
PyJWT==1.4.2
pytest==3.2.3
pytest-cache==1.0
pytest-colordots==1.1
pytest-cov==2.5.1
pytest-flakes==2.0.0
pytest-flask==0.10.0
pytest-pep8==1.0.6
pytest-profiling==1.2.11
python-dateutil==2.6.1
python-socketio==1.8.1
python-engineio==1.7.0
pytz==2017.2
six==1.10.0
SQLAlchemy==1.1.12
Werkzeug==0.12.2

person Hanxue    schedule 25.10.2017    source источник
comment
Можем ли мы увидеть ваши requirements.txt и tox.ini полностью?   -  person phd    schedule 25.10.2017
comment
Это мой tox.ini в полном объеме. Добавлено requirements.txt   -  person Hanxue    schedule 25.10.2017
comment
Вы изменили requirements.txt после того, как tox уже создал виртуальные среды? Кажется, tox не устанавливает дополнительных требований, когда requirements.txt был изменен. Я нашел его минуту назад и был вынужден удалить все виртуальные среды tox, чтобы установить требования, которые я добавил.   -  person phd    schedule 26.10.2017
comment
@phd да, я обновил requirements.txt после того, как tox создал виртуальную среду. Как принудительно обновить виртуальные среды tox с помощью дополнений в requirements.txt?   -  person Hanxue    schedule 26.10.2017


Ответы (2)


Кажется, что tox не устанавливает дополнительных требований, когда requirements.txt, который используется в tox.ini с deps = -rrequirements.txt, был изменен после того, как tox создал свои виртуальные среды. Я не сейчас, если это ошибка в tox.

Либо удалите виртуальные среды (rm -rf .tox) и позвольте tox воссоздать их с обновленным requirements.txt, либо обновите существующие виртуальные среды самостоятельно: активируйте, pip install, деактивируйте в цикле по всем виртуальным средам в .tox/. Что-то типа

source .tox/py27/bin/activate
pip install --upgrade -r requirements.txt
deactivate

Обновление. Кажется, это старая известная проблема, которая все еще открыта и обсуждается.

Переустановите virtualenv с помощью tox при изменении требований.txt или setup.py

person phd    schedule 26.10.2017

Помимо @phd answer, я нашел еще два метода.

Используйте tox-pip-расширения

Используйте tox-pip-extensions и добавьте это в tox.ini

[tox]
tox_pip_extensions_ext_venv_update = true

Воссоздать виртуальную среду

Запускайте --recreate перед запуском tox каждый раз

$ tox --recreate && tox
person Hanxue    schedule 27.10.2017
comment
recreate можно использовать в tox.ini. Но это замедляет все вызовы tox. - person phd; 27.10.2017