Outils pour utilisateurs

Outils du site


dev:python:flask:tests_unitaires_via_pytest

:TODO_DOCUPDATE:

Flask : tests unitaires avec pytest

Flask s'appuie sur le framework pytest pour créer et exécuter les tests.

Nomenclature

Par défaut les tests sont regroupés dans le dossier ./tests du projet. Les tests sont des fonctions dont le nom commence par test_ regroupées dans des modules Python dont le nom commence également par test_. Dans une approche POO, les tests peuvent également être regroupés dans des classes dont le nom commence par Test.

Les fixtures

Le framework pytest propose le concept de fixtures pour désigner des éléments de code pouvant être réutilisés entre les tests. Ces fixtures permettent de définir un environnement constant et reproductible à l'intérieur duquel les tests peuvent s'exécuter.

Dans sa forme la plus simple une fixture retourne une valeur, mais la fixture peut également se charger d'initialiser un contexte, produire une valeur (via yield) puis supprimer le contexte de travail une fois les tests terminés.

On définit les fixtures dans le module tests/conftest.py.

conftest.py
# tests/conftest.py
 
import pytest
from wsgi import create_app
from wsgi.configs import TestingConfig
 
@pytest.fixture()
def app():
    app = create_app(custom_config=TestingConfig)
 
    # other setup can go here
 
    yield app
 
    # clean up / reset resources here
 
 
@pytest.fixture()
def http_client(app):
    return app.test_client()
 
 
@pytest.fixture()
def cli_runner(app):
    return app.test_cli_runner()

Dans cet exemple 3 fixtures sont crées app, http_client et cli_runner. Ces 3 fixtures vont pouvoir être passées en paramètre de chacun de nos tests.

Pour lancer la séquence de tests, on se place à la racine du projet :

python -m pytest

Envoyer des requêtes grâce au client HTTP

Grâce à la fixture http_client nous allons pouvoir envoyer une requête à notre application et observer le code de retour :

test_wsgi.py
# tests/test_wsgi.py
 
 
def test_wsgi_about_page(http_client):
  """
  Vérifie que la page about est accessible
  """
  response = http_client.get("/about")
  assert response.status_code == 200
  assert b"<h1>A propos</h1>" in response.data

Dans cet exemple le test permet de vérifier à la fois le code de retour de la requête HTTP ainsi que la présence d'une chaine de caractère attendue dans la page.

Références

dev/python/flask/tests_unitaires_via_pytest.txt · Dernière modification : 2025/07/27 14:56 de yoann