tox permet d’automatiser l’exécution de la suite de tests d’un projet dans plusieurs environnements virtuels (différentes versions de Python ou d’interpréteurs) en une seule commande. Cela s’avère vite indispensable lorsque l’on développe un module open source.
Cet article fait partie fait partie d’une série d’articles présentant quelques bonnes pratiques qui vous permettront d’avoir un environnement de développement Python aux petits oignons :
- Les environnements virtuels. Partie 1
- Personnaliser le script de démarrage du shell Python. Partie 2
- Valider son code Python avec flake8. Partie 3
- Standardiser l’exécution des tests avec tox. Partie 4
Standardiser l’exécution des tests avec tox
Intégrons le à un projet existant, au hasard Django :
# Créons un projet dédié
mkproject tox-django
(tox-django) cdproject
# Installation de tox
(tox-django) pip install tox
# Clone du code du projet Django
(tox-django) git clone git@github.com:django/django.gitAjoutons à présent un fichier tox.ini permettant d’installer le projet et de lancer la suite de tests du projet dans deux environnements : Python 2.7 et Python 3.4. On en profite pour générer un rapport de couverture de test HTML qui s’ouvrira automatiquement.
(tox-django) cd django
(tox-django) vi tox.ini[tox]
envlis = py27,py34
[testenv:py27]
changedir = tests
# Installe coverage dans l'environnement virtuel
deps =
coverage
# Commandes externes à l'environnement virtuel, pour éviter les warnings
whitelist_externals = open
# La documentation expliquant comment lancer la suite de tests Django est ici :
# https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/unit-tests/
commands =
pip install -r requirements/py2.txt
coverage erase
coverage run --rcfile=.coveragerc --include=*site-packages/django/* runtests.py --settings=test_sqlite --parallel=1
coverage html
open coverage_html/index.html
[testenv:py34]
changedir = tests
deps =
coverage
whitelist_externals = open
commands =
pip install -r requirements/py3.txt
coverage erase
coverage run --rcfile=.coveragerc --include=*site-packages/django/* runtests.py --settings=test_sqlite --parallel=1
coverage html
open coverage_html/index.htmlPour lancer les tests, une commande suffit à présent :
(tox-django) toxIl est également possible de préciser un environnement particulier :
(tox-django) tox -e py34