• 10 hours
  • Medium

Free online content available in this course.

course.header.alt.is_video

course.header.alt.is_certifying

Got it!

Last updated on 4/25/22

Implémentez vos tests pour le framework Flask avec pytest-flask

Pytest-flask est un plugin du framework de test Pytest qui fournit un ensemble d’outils pour tester une application utilisant le framework Flask.

Vous pouvez installer le plugin à l’aide de la commandepip:

pip install pytest-flask

Configurez pytest-flask

Vous allez tout d’abord créer ce qu’on appelle une fixture, pour configurer l’application pour le test. 

Considérons un fichierapp.pyqui contient cette application Flask qui renvoie simplementHello, World!sur la routeindex.

from flask import Flask

def create_app(config):
    app = Flask(__name__)
    app.config.from_object(config)

    @app.route('/index')
    def index():
        return 'Hello, World!'

    return app

Vous pouvez ensuite créer le fichierconftest.pydans un répertoire dédié aux tests qui contiendra la fixture. La fixture pourra ainsi être appelée dans chaque test qui nécessite l’application.

import pytest

from app import create_app


@pytest.fixture
def client():
    app = create_app({"TESTING": True})
    with app.test_client() as client:
        yield client

Il est maintenant temps de commencer à tester la fonctionnalité de notre application. Effectivement, nous avons mis en place un point de terminaison/indexqui renvoieHello, World!  .

Ainsi, vous allez créer un fichiertest_app.pydans le répertoiretests/pour implémenter l’ensemble de nos tests.

Testez le code de réponse

Pytest nous permet de tester le code d’état de la requête HTTP. Cela permet de déterminer le résultat d’une requête ou d’indiquer une erreur. Vous pouvez trouver le détail des codes d'état dans la documentation Mozilla.

Voici les codes les plus courants :

  • 200 : succès de la requête.

  • 401 : erreur d’authentification.

  • 403 : accès refusé.

  • 404 : page non trouvée.

  • 504 : le serveur ne répond pas.

C’est parti ! Maintenant que vous connaissez les codes d’état, nous pouvons mettre en place un test qui vérifie que le code de notre requête est égal à 200.

from tests.conftest import client


def test_should_status_code_ok(client):
	response = client.get('/index')
	assert response.status_code == 200

Décortiquons chaque ligne :

  • from tests.conftest import client: Importer la fixture qui contient l’application.

  • def test_should_status_code_ok(client): Appeler la fixtureclienten la déclarant comme argument.

  • response = client.get('/index'): Envoyer une requête HTTP GET à l’application avec le chemin passé en argument.

  • assert response.status_code == 200:  Grâce à la valeur de retour de la fonctionclient.get(), nous pouvons récupérer le code d’état HTTP avec l’attributstatus_code. Nous pouvons donc maintenant vérifier que le code est égal à 200.

Testez les données de la réponse

C’est super utile de tester le code de retour de la requête pour valider son résultat, mais il est encore plus intéressant de vérifier le contenu de la requête. 

Comment va-t-on pouvoir faire ?

Pytest nous fournit des fonctions pour vérifier le contenu de la data. Comme pour le test précédent, nous pouvons trouver la data dans la réponse de la fonctionclient.get(). Cependant, il faut décoder le contenu de la data avant de pouvoir la comparer avec la valeur attendue.

Voilà le test que nous pouvons mettre en place pour vérifier le contenu de notre point de terminaison :

def test_should_return_hello_world(client):
	response = client.get('/index')
	data = response.data.decode() #Permet de décoder la data dans la requête
	assert data == 'Hello, World!'

Effectuez des requêtes POST

Dans la plupart des applications, la majorité des fonctionnalités requièrent la connexion d’un utilisateur. Nous avons donc besoin de connecter et déconnecter notre client de test. Dans ce cas, vous allez devoir envoyer une requêtePOSTavec en paramètres les informations de connexion (le nom d’utilisateur et le mot de passe).

Vous pouvez donc utiliser la méthodepost(). Voici un exemple :

username = 'testUser'
password = 'testPassword'
client.post('/login', data={'username' : username, 'password' : password})

Vous devez fournir la route dans le premier argument et, dans le second, un dictionnaire contenant l’ensemble des données nécessaires à votre requête.

Maintenant que vous savez faire une requêtePOSTpour la connexion d’un utilisateur, vous pouvez utiliser la même méthode pour d'autres requêtes de ce type. 

À vous de jouer !

Je vous propose de reprendre le code source d’un projet utilisant le framework Flask pour vous entraîner à la mise en place de test unitaire à l’aide de pytest-flask. Je vous invite à regarder la vidéo ci-dessous pour en apprendre plus sur l’application :

Votre mission :

  • Rédigez un plan de test pour ce projet.

  • Créez la suite de tests sur l’ensemble du projet à l’aide de pytest-flask. 

Avant de commencer l’implémentation de la suite de tests, vous pouvez regarder ce premier exemple de test unitaire dans ce projet afin d’avoir un point de départ :

Retrouvez une proposition de correction sur GitHub !

En résumé

  • Pytest permet aussi de créer et exécuter des tests sur un projet Flask.

  • Le plugin pytest-flask fournit un ensemble d'outils utiles pour tester les applications et extensions Flask.

  • L’attributstatus_codefournit le code de retour HTTP de la requête.

  • Il est possible de retrouver les données renvoyées par la requête à l’aide de l’attributdata. Ainsi, vous pouvez vérifier le contenu de la réponse une fois celui-ci décodé, et valider votre test.

  • Le client de test fournit la méthodepost()pour simuler une requêtePOST. Vous pouvez fournir la data en paramètre de cette méthode.

Vous avez tout compris ? C’est parfait ! Nous allons maintenant attaquer les tests sur le Framework Django. Ce n’est pas fini, il y a encore plein de belles choses à voir dans le chapitre suivant.

Example of certificate of achievement
Example of certificate of achievement