• 10 heures
  • Difficile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 28/11/2023

Écrivez des tests pour votre API

Découvrez le TestCase de DRF

Les tests sont un élément important de tout projet de développement. Ils permettent de garantir la pérennité du projet, sa maintenance, et surtout de déployer la conscience plus tranquille.

Une nouvelle classe de test APITestCase  est fournie par DRF. Elle est faite pour fonctionner de la même façon que la classe TestCase. Sa principale différence étant d’utiliser un client qui permet une utilisation plus simple des appels. Il est donc recommandé de l’utiliser pour ne pas avoir à définir plusieurs paramètres pour réaliser nos appels lors des tests.

Écrivez des tests avec APITestCase

Créons notre fichier de test dans l’application shop  et mettons en place un test qui vérifie l’endpoint de récupération des catégories actives.

Nous allons pour cela :

  • Créer deux catégories dont une inactive ;

  • Réaliser notre appel ;

  • Vérifier que le status code de la réponse est bien un succès : 200 ; 

  • Nous assurer que le contenu de la réponse est bien celui attendu, et qu'il ne comprend pas la catégorie désactivée.

Nous écrirons aussi un test qui s’assurera que la création d’une catégorie n’est pas possible, et tombe bien en erreur.

Créons d'abord un fichier  tests.py  pour nos tests. Puis, c’est parti pour nos deux tests :

from django.urls import reverse_lazy
from rest_framework.test import APITestCase

from shop.models import Category

class TestCategory(APITestCase):
    # Nous stockons l’url de l'endpoint dans un attribut de classe pour pouvoir l’utiliser plus facilement dans chacun de nos tests
    url = reverse_lazy('category-list')

    def format_datetime(self, value):
        # Cette méthode est un helper permettant de formater une date en chaine de caractères sous le même format que celui de l’api
        return value.strftime("%Y-%m-%dT%H:%M:%S.%fZ")

    def test_list(self):
        # Créons deux catégories dont une seule est active
        category = Category.objects.create(name='Fruits', active=True)
        Category.objects.create(name='Légumes', active=False)

        # On réalise l’appel en GET en utilisant le client de la classe de test
        response = self.client.get(self.url)
        # Nous vérifions que le status code est bien 200
        # et que les valeurs retournées sont bien celles attendues
        self.assertEqual(response.status_code, 200)
        excepted = [
            {
                'id': category.pk,
                'name': category.name,
                'date_created': self.format_datetime(category.date_created),
                'date_updated': self.format_datetime(category.date_updated),
            }
        ]
        self.assertEqual(excepted, response.json())

    def test_create(self):
        # Nous vérifions qu’aucune catégorie n'existe avant de tenter d’en créer une
        self.assertFalse(Category.objects.exists())
        response = self.client.post(self.url, data={'name': 'Nouvelle catégorie'})
        # Vérifions que le status code est bien en erreur et nous empêche de créer une catégorie
        self.assertEqual(response.status_code, 405)
        # Enfin, vérifions qu'aucune nouvelle catégorie n’a été créée malgré le status code 405
        self.assertFalse(Category.objects.exists())

Suivez-moi dans le screencast ci-dessous pour la mise en place et le lancement de ces premiers tests. Nous verrons d'abord notre premier test :

Et ensuite, nous vérifierons qu'aucune catégorie n'existe avant d'en créer une :

À vous de jouer

Écrivez vous aussi des tests pour l’endpoint de produits. Il peut également être intéressant de créer une classe de test pour notre projet, contenant notre méthode d’aide au formatage de date, qui sera étendu par nos classes de tests.

  • Mettez en place une classe ShopAPITestCase.

  • Refactorisez TestCategory  pour qu’elle étende notre nouvelle classe ShopAPITestCase.

  • Écrivez la classe de test TestProduct  qui va tester :

    • l’endpoint de liste et de détail d’un produit ;

    • que le filtre sur la liste fonctionne correctement ;

    • qu’il n’est pas possible de créer, modifier et supprimer un produit.

Pour réaliser cela, vous pouvez partir de la branche P1C6_exercice. Elle contient déjà ce que nous venons de faire ensemble.

Une solution est proposée sur la branche P1C6_solution.

En résumé

  • DRF met à disposition une classe de tests qu’il faut utiliser pour tester une API.

  • Il est important de tester le status code de retour ainsi que le contenu de la réponse.

  • Ne pas oublier de tester les cas d’erreur.

  • Les tests ne sont pas la partie la plus intéressante à écrire, mais ils garantissent la stabilité d’un projet dans le temps.

Nous voilà avec une API DRF simple et validée par nos premiers tests ! Avant de passer à l’étape suivante, validez vos acquis dans le quiz de la partie 1 – je vous attends dans la partie 2 !

Exemple de certificat de réussite
Exemple de certificat de réussite