Boire ou coder ... Pourquoi choisir?
Publié le 05 mai 2009 22:00

Tests unitaires avec Django

Par défaut, Django inclue deux frameworks de tests différents. Le premier, Doctest, impose de placer ses tests dans une chaine de caractères. Le second, Unit Tests, est plus conventionnel et requiert de créer une méthode pour chacun de nos tests. Le premier nous faisant perdre toute colorisation syntaxique, nous allons donc voir uniquement le second dans cet article.

Chacune de vos applications Django peut prendre des tests. Ceux-ci sont exécutés avec la commande manage.py tests Qui va exécuter, pour chaque application, toutes les méthodes contenues dans le fichier tests.py de votre application.

Bien évidemment, placer tous nos tests dans ce fichier serait illisible. Créons donc notre architecture de test : |- application |-- tests.py |-- test |--- functional |---- my_functional_test.py |--- unit |---- my_unit_test.py

Nous séparons donc nos tests unitaires et fonctionnels et permettons de créer plusieurs fichiers pour chaque si nous le désirons. Puis dans tests.py, il faut les inclure ces fichiers. from project.application.test.functional.my_test import HomepageTests from project.application.test.unit.my_test import UserTests

Remplissons maintenant nos tests unitaires. Dans chaque fichier de test, nous devons faire appel au framework approprié en haut de page. from django.test import TestCase

Puis nous créons la méthode UserTests, importée plus haut et qui contiendra nos tests. class SimpleTest(TestCase):   def test_basic_addition(self):     self.failUnlessEqual(1 + 1, 2) Nous testons ici que 1 + 1 est bien égal à 2. A vous par la suite de créer vos tests selon vos besoins.

Les méthodes permettant de faire les tests sont les suivantes :

  • setUp() - Méthode appellée pour préparer les fixtures des tests et donc avant ceux-ci. Il est inutile de l'appeller. En revanche, vous pouvez la surcharger.
  • tearDown() - Méthode appellée après que le test ait été exécuté (qu'il ait réussi ou non).
  • assertTrue(expression, message) - Vérifie que l'expression est bien égale à vrai.
  • assertEqual(first, second, message) - Vérifie que la première expression est égale à la seconde
  • failUnlessEqual(first, second, message) - Alias de assertEqual
  • assertNotEqual(first, second, message) - Vérifie que la première expression est différente de la seconde
  • failIfEqual(first, second, message) - Alias de assertNotEqual
  • assertAlmostEqual(first, second, décimales, msg) - Vérifie que les deux valeurs sont approximativement égales en calculant leur différence, puis l'arrondit à son nombre de décimales (défault : 7) et en les comparant à zéro.
  • failUnlessAlmostEqual(first, second, décimales, msg) - Alias de assertAlmostEqual
  • assertNotAlmostEquat(first, second, décimales, msg) - Vérifie que les deux valeurs sont approximativement égales en calculant leur différence, puis l'arrondit à son nombre de décimales (défault : 7) et en les comparant à zéro.
  • failIfAlmostEqual(first, second, décimales, msg) - Alias de assertNotAlmostEqual
  • assertRaises(exception, callable, ...) - Vérifie qu'une exception a été levée. Le test passera si l'exception définie est levée et échouera si il s'agit d'une autre ou qu'aucune exception n'est levée
  • failUnlessRaises(exception, callable) - Alias de assertRaises()
  • failIf(expr, msg) - Opposé de failUnless
  • assertFalse(expr, msg) - Alias de failIf
  • fail(msg) - Retourne une erreur

Vous pouvez donc maintenant tester toutes les méthodes de vos modèles de manière efficace. Vous pouvez donc continuer avec les tests fonctionnels.

Commentaires

Samuel Martin
Samuel Martin dit: 29 septembre 2009 22:00 Site web

Correction, ce n'est pas : python manage.py tests mais python manage.py test ...

Samuel Martin
Samuel Martin dit: 29 septembre 2009 22:00 Site web

Excellent tutoriel. Je me permets de rajouter les indications suivantes : 1. Ajouter un fichier init.py à chaque niveau de l'arborescence, donc dans le cas présent j'en compte 4 2. Nommer le dossier "tests" et non "test" 3. Placer tout import "from project.application..." dans le fichier init.py à la racine de tests

Postez un commentaire

Markdown activé