web-dev-qa-db-fra.com

pip installer les dépendances de test pour tox à partir de setup.py

J'ai fait mon projet avec setuptools et je veux le tester avec tox. J'ai répertorié les dépendances dans une variable et ajouté au paramètre setup() (tests_require et extras_require). Mon projet doit installer toutes les dépendances répertoriées dans tests_require pour tester mais pip install ne les installe pas.

J'ai essayé mais cela n'a pas fonctionné:

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

Comment puis-je installer des dépendances de test sans avoir à gérer plusieurs listes de dépendances (c'est-à-dire avoir toutes les dépendances répertoriées dans les deux test_requirements.txt et le tests_require variable)?

26
item4

J'ai atteint cet objectif en commettant un léger abus de exigences supplémentaires . Vous étiez presque là à essayer la syntaxe des extras, juste que tests_require les dépôts ne sont pas automatiquement disponibles de cette façon.

Avec un setup.py comme ça:

from setuptools import setup

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

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

Vous pouvez ensuite installer les dépendances de test avec la syntaxe des extras, par ex. à partir du répertoire racine du projet:

$ pip install .[test]

Donnez la même syntaxe à Tox dans tox.ini, pas besoin d'ajuster la valeur par défaut install_command:

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

Maintenant, vous n'avez plus besoin de maintenir la liste des dépendances à deux endroits, et ils sont exprimés là où ils devraient être pour un package publié: dans les métadonnées de packaging au lieu de requirements.txt des dossiers.

Il semble que ces petits extras piratent ce n'est pas si rare .

36
ches

Ce que vous pouvez faire est d'avoir un seul fichier (appelé test_requirements.txt) et listez les dépendances de test comme ceci:

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

Puis dans setup.py, analyse et stocke le contenu du fichier dans une liste et transmet cette liste à 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,
    ...
)
4
chown

Si vous utilisez la commande suivante, Tox installera votre test_requires avant d'exécuter les tests:

commands = {envpython} setup.py test

Vous devrez également ajouter à setup.py où sont les tests avec ceci:

test_suite="tests_module"

Enfin, ici est une réponse à une question similaire avec un bel exemple.

2
Javier

Tox recommande d'éviter test python setup.py . Donc, au lieu de "tests_require", nous sommes libres d'utiliser des "extras" avec lesquels tox s'entend.

L'appel à deps =. [Test] installera le package complet à partir de votre répertoire de travail actuel. Un peu de gaspillage puisque tox installera toujours le sdist après cette opération. De plus, si vous installez votre package principal à partir d'un sdist, vous souhaiterez probablement également installer les "extras" à partir de leur.

Votre modification vers install_command tentera d'installer "tests" à partir de "extras", et non "tests_require". Même si cela a fonctionné, cela affectera tous les éléments répertoriés dans les dépôts, ce n'est pas une bonne idée.

Solution

Tox 2.6 introduit extras option. Cela installera des "extras" à partir de sdist, uniquement pour votre sdist et au moment où il effectuait l'installation normale de sdist.

1
Guy Gangemi