Comment combiner nose, rednose et django

Mar 18 août 2009

Ça faisait un moment que je n'avais pas djangoté, et je ne disposais pas d'un environnement "optimal" pour coder. Ce qui suit est un reminder personnel, mais j'imagine qu'il pourra parfaitement convenir à quelqu'un qui aurait envie de coder en Python, voire avec Django en utilisant Nose

C'est quoi tout ça ?

  • Django est un framework, permettant de développer des applications web en utilisant des niveaux d'abstraction élevés.
  • Nose est un "teste-tout". Cet utilitaire exécute tous ce qui ressemble de près ou de loin à un test dans un projet Python et affiche le rapport d'exécution. Si tu n'utilises pas le développement dirigé par les tests, disons que... que tu ne sais pas à quel point tu es dans l'erreur. Et en fait, maintenant, tu n'as aucune excuse pour ne pas mettre en oeuvre le TDD. Et si tu ne t'y mets pas, eh bien... toutes les souffrances que tu endures à chaque fois qu'un bout de code pète ou fait péter une autre partie de tes programmes... tu les mérites.
  • Rednose est un plugin pour Nose. Ça peut paraître gadget, mais en fait, la seule chose qu'il fasse, c'est coloriser le rapport de résultats renvoyé par la commande nosetests. En fait, c'est tout bête, mais ça a un effet motivant. On lance ses tests. Si l'un d'entre eux échoue, on voit la sortie en couleurs, avec une mise en page qui rend le message plus compréhensible et plus facile à exploiter. Si tous ces tests passent, la sortie est en couleurs également, mais verte. L'effet "vert == ok" est très satisfaisant, quelque part, ça récompense l'effort.

Comment ça s'installe

Nose est empaqueté pour Ubuntu, mais il vaut quand même mieux installer ce programme via easy_install.

Personnellement, je préfère installer les paquetages en utilisant mon répertoire "home" comme racine. Ainsi, je ne touche pas à l'intégralité de mon installation, et les choses sont plus sécurisées. On peut également utiliser virtualenv, pour se sentir encore plus en sécurité. Pour installer Nose :

$ easy_install --prefix=~ nose

Pour installer RedNose :

$ easy_install --prefix=~ rednose

Pour s'assurer que tout fonctionne, on se place dans le répertoire d'un projet Python, et on lance :

$ nosetests

La sortie est en "noir et blanc" (en monochrome, quoi). En revanche, la commande :

$ nosetests --rednose

Tu devrais voir quelque chose qui ressemble à ça :

Sortie Rednose en couleurs
Cliquer pour voir en plus grand

C'est beau non ?

Et Django dans tout ça ?

Le soucis, c'est que si on lance nosetests dans la racine d'un projet Django, on prend un vilain message d'erreur du genre :

ImportError: Could not import settings 'settings'
(Is it on sys.path? Does it have syntax errors?):
No module named settings

Problème connu... variables d'environnement, DJANGO_SETTINGS_MODULE, blablabla... pour enlever cette épine du pied, rien de plus simple : installer le plugin NoseDjango. Idem que les autres, quoi :

$ easy_install --prefix=~ NoseDjango

On peut ensuite lancer la commande nosetests depuis le projet Django. Et hop.

Bonus :

Pour que le plugin RedNose soit activé en permanence (et donc, qu'on n'ait pas à ajouter l'option --rednose à chaque lancement), il suffit de positionner la variable d'environnement comme suit :

export NOSE_REDNOSE=1

(on met ça dans son .bashrc, genre - j'invente rien, c'est dans la doc)

TDD, ça roxe les ours polaires.