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
Correction, ce n'est pas : python manage.py tests mais python manage.py test ...
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