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)?
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 .
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,
...
)
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.
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.
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.