Pip установить тестовые зависимости для tox из setup.py

Я сделал свой проект с setuptools, и я хочу проверить его с помощью tox. Я перечислил зависимости в переменной и добавил к параметру setup() (tests_require и extras_require). Мой проект должен установить все зависимости, перечисленные в tests_require, чтобы проверить, но pip install не устанавливает их.

Я пробовал это, но это не сработало:

install_command = pip install {opts} {packages}[tests]

Как установить тестовые зависимости без необходимости управлять несколькими списками зависимостей (т.е. иметь все зависимости, перечисленные как в переменной test_requirements.txt, так и в переменной tests_require)?

Ответ 1

Я достиг этого, совершив небольшое злоупотребление дополнительными требованиями . Вы почти пытались использовать синтаксис extras, так что tests_require deps автоматически не доступны таким образом.

С setup.py следующим образом:

from setuptools import setup

test_deps = [
    'coverage',
    'pytest',
]
extras = {
    'test': test_deps,
}

setup(
    # Other metadata...
    tests_require=test_deps,
    extras_require=extras,
)

Затем вы можете установить тестовые зависимости с помощью синтаксиса extras, например. из корневого каталога проекта:

$ pip install .[test]

Дайте тот же синтаксис Tox в tox.ini, не нужно настраивать значение по умолчанию install_command:

[testenv]
commands = {posargs:pytest}
deps = .[test]

Теперь вам не нужно поддерживать список зависимостей в двух местах, и они выражаются там, где они должны быть для опубликованного пакета: в метаданных упаковки вместо requirements.txt файлов.

Похоже, что это небольшое дополнение hack не так уж и необычно.

Ответ 2

Что вы можете сделать, это иметь один файл (называемый test_requirements.txt) и перечислять тестовые зависимости, например:

dnspython==1.12.0
easydev==0.8.3
enum34==1.0.4
fabric==1.10.1
...

Затем в setup.py проанализировать и сохранить содержимое файла в списке и передать этот список в setup:

tests_require = [line.strip() for line in 
                 open('test_requirements.txt')
                 if line.strip() and not line.strip().startswith('--')]

setuptools.setup(
    ...
    tests_require=tests_require,
    ...
)

Ответ 3

Если вы используете следующую команду, Tox установит ваши test_requires перед запуском тестов:

commands = {envpython} setup.py test

Вам также нужно добавить в setup.py, где находятся тесты с этим:

test_suite="tests_module"

Наконец, вот ответ на аналогичный вопрос с хорошим примером.

Ответ 4

Tox рекомендует избегать теста python setup.py. Таким образом, вместо "tests_require" мы можем использовать "дополнительные", с которыми tox справляется.

Вызов deps =. [Test] установит весь пакет из вашего текущего рабочего каталога. Немного впустую, так как tox по-прежнему будет устанавливать sdist после этой операции. Кроме того, если вы устанавливаете свой основной пакет из sdist, вы, вероятно, захотите установить и дополнительные компоненты из них.

При редактировании команды install_command вы попытаетесь установить "тесты" из "дополнений", а не "tests_require". Даже если это сработает, это повлияет на все предметы, перечисленные в deps, не очень хорошая идея.

Решение

В Tox 2.6 введена опция дополнений. Это установит дополнительные функции из sdist, только для вашего sdist и в то время, когда он делал обычную установку sdist.