Boire ou coder ... Pourquoi choisir?
Publié le 06 mai 2009 18:00

Tests fonctionnels avec Django

Après avoir vu la mise en place de l'environnement de test et des tests unitaires avec Django, voyons maintenant comment mettre en place nos tests fonctionnels. En écrivant cet article, je considère que vous avez lu l'article précédent et que vous avez donc compris ma méthode de hiérarchisation des tests.

Voici un test d'exemple (j'allais dire "de test". Mais c'est un chouilla trop répétitif).

from django.test import TestCase
from django.test.client import Client
from projet.pages.models import Pager
class PagesTest(TestCase):
    def setUp(self):
        self.client = Client()
        def test_view_page(self):
        Page(
            name='Conditions d\'utilisation',
            url='conditions',
            content='nothing for now'
        ).save()
        response = self.client.get('/conditions')
        self.failUnlessEqual(response.status_code, 200)
    def test_view_unknown_page(self):
        response = self.client.get('/nothing/')
        self.failUnlessEqual(response.status_code, 404)

Et analysons le code. Nous commençons par importer les diverse classes nécessaires à ces tests :

  • TestCase, le framework de test
  • Client, le client HTTP de test
  • Page, le modèle qui nous permet d'ajouter des données permettant ici les tests

Puis nous commençons les tests, en initialisant self.client à une nouvelle instance de Client afin de pouvoir faire des requêtes HTTP. Dans le premier test, nous créons un élément Page puis nous testons que lorsque nous appellons celui-ci, notre page est bien rendue. Et dans le second, nous vérifions que nous avons une bien une erreur 404 si nous appellons une page qui n'existe pas.

Vous noterez la méthode self.client.get() permettant de faire un appel HTTP avec la méthode du même nom.

Plusieurs méthodes sont ainsi disponibles pour faire les appels HTTP.

  • get(path, data={}, follow=False) - Fait une requête HTTP get
  • post(path, data={}, follow=False) - Fait une requête HTTP post
  • head(path, data={}, follow=False) - Fait une requête HTTP head
  • options(path, data={}, follow=False) - Fait une requête HTTP options
  • put(path, data={}, follow=False) - Fait une requête HTTP put
  • delete(path, data={}, follow=False) - Fait une requête HTTP delete

A cela s'ajoutent deux méthodes permettant d'identifier et de déconnecter l'utilisateur.

  • login(options) - Identifie l'utilisateur et retourne true si celle-ci a réussi. Exemple : self.client.login(username='test', password='test')
  • logout() - Déconnecte l'utilisateur auparavant connecté

Lorsque vous faites une requête quelconque, vous pouvez en tester le résultat. Voici les différentes méthodes disponibles.

  • client - Le client de test qui a été utilisé pour faire la requête
  • content - Le contenu de la page rendue
  • context - L'instance de la classe Context qui a été utilisée pour afficher le contenu de la page. Si il y a eu plusieurs templates de rendus, il s'agira d'une liste de contextes triés par ordre de rendu.
  • request - Les données request qui ont servi à faire la requête
  • status_code - Le code HTTP retourné par la page
  • template - L'instance de template qui a été utilisée afin d'afficher le contenu de la page. Si il y en a eu plusieurs, un tableau de templates triés par ordre d'affichage sera retourné.

Du coup vous avez maintenant toutes les clés en main pour commencer à faire vos tests fonctionnels. Y'a plus qu'à coder !

Commentaires

ksamuel
ksamuel dit: 11 février 2011 11:47

Pas un commentaire pour dire merci ? Ben merci.

Postez un commentaire

Markdown activé