{{tag>dev python test 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''.
# 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 :
# 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"A propos
" 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 =====
* [[https://flask.palletsprojects.com/en/stable/testing/|Tester les applications Flask (documentation Flask)]]
* https://ichi.pro/fr/comment-tester-les-applications-flask-192350830008348
* https://fr.wadaef.net/comment-tester-une-api-construite-avec-flask/
* https://medium.com/@elissavetcodes/unit-testing-flask-routes-python-27fa6aa6868c
* https://stackoverflow.com/questions/69370708/how-can-i-use-pytest-to-test-routes-created-using-flask
* https://www.digitalocean.com/community/tutorials/unit-test-in-flask