pytest en profondeur : fixtures, conftest, parametrize & marqueurs
pytest est le moteur qui exécute vos tests dans les deux stacks. Quatre fonctionnalités font l'essentiel du gros du travail — apprenez-les et vous avez fait le plus gros du chemin.
L'idée, en une ligne
pytest vous laisse préparer les choses une fois, exécuter un test sur plusieurs entrées, et étiqueter les tests pour choisir lesquels s'exécutent.
1. Fixtures — setup et nettoyage
Une fixture prépare quelque chose dont un test a besoin (comme un navigateur ouvert) et le nettoie après. Décorez une fonction avec @pytest.fixture, puis tout test qui la nomme en paramètre reçoit sa valeur.
Contrôlez la durée de vie d'une fixture avec scope : function (par défaut), class, module, package, ou session. Un navigateur connecté est une fixture session ou module naturelle — configurez-le une fois, réutilisez-le.
2. conftest.py — l'étagère partagée
Mettez les fixtures partagées dans un fichier appelé conftest.py. Aucun import nécessaire : chaque test de ce dossier et en dessous peut juste les demander par leur nom.
3. parametrize — un test, plusieurs entrées
@pytest.mark.parametrize exécute le même corps de test sur une liste d'entrées, chacune rapportée comme son propre cas. Enveloppez une seule ligne dans pytest.param(..., marks=..., id=...) pour lui donner un nom ou une étiquette.
4. Marqueurs — des étiquettes filtrables
Les marqueurs étiquettent les tests — @pytest.mark.smoke, @pytest.mark.regression — pour que vous puissiez n'exécuter qu'un groupe avec pytest -m smoke. Enregistrez-les dans pyproject.toml et ajoutez --strict-markers pour qu'une faute de frappe échoue bruyamment au lieu de sauter silencieusement.
Voyez-le à l'œuvre
# conftest.py — a shared fixture, no import needed below
import pytest
from playwright.sync_api import sync_playwright
@pytest.fixture(scope="session")
def browser():
with sync_playwright() as p:
b = p.chromium.launch()
yield b # tests run here
b.close() # cleanup after the whole session
# test_search.py
import pytest
@pytest.mark.smoke
@pytest.mark.parametrize("term,hits", [
("backpack", 1),
("jacket", 1),
pytest.param("", 6, id="empty-shows-all"),
])
def test_search_counts(term, hits):
assert search(term) == hits # runs 3 named cases
# pyproject.toml
# [tool.pytest.ini_options]
# markers = ["smoke: fast critical-path checks"]Lisez-le de haut en bas : la fixture browser ouvre Chromium une fois et le ferme à la fin. Le test s'exécute trois fois, une par ligne d'entrée, et l'étiquette smoke vous laisse l'isoler plus tard.
Basé sur la doc officielle pytest — Fixtures, Parametrize, Markers
Toutes les leçons de Automatisation UI : Selenium + Playwright + pytest
- Sélecteurs Selenium : trouver l'élément que vous voulez
- Attentes, actions & frames — tuer l'instabilité à la source
- Playwright : attente automatique, sélecteurs & tracing
- pytest en profondeur : fixtures, conftest, parametrize & marqueurs
- Le Page Object Model, fait correctement
- Les cas difficiles : éléments dynamiques, iframes, uploads & simulation réseau