Flask s'appuie sur le framework pytest pour créer et exécuter les tests.
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.
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.
# 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
Grâce à la fixture http_client nous allons pouvoir envoyer une requête à notre application et observer le code de retour :
# 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.