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 :

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.git

Ajoutons à 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.ini, à mettre dans le même dossier que setup.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[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.html

Pour lancer les tests, une commande suffit à présent :

(tox-django) tox

Il est également possible de préciser un environnement particulier :

(tox-django) tox -e py34
Aller plus loin avec tox