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.py
qui 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.py
dans 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/index
qui renvoieHello, World!
.
Ainsi, vous allez créer un fichiertest_app.py
dans 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 fixtureclient
en 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êtePOST
avec 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êtePOST
pour 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’attribut
status_code
fournit 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’attribut
data
. 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éthode
post()
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.