Les quatre patterns que les SDET utilisent vraiment
Il y a 23 design patterns célèbres. Bonne nouvelle — vous n'en avez besoin que de quatre pour l'automatisation de tests, et les nommer clairement est un signal fort en entretien.
L'idée, en une ligne
Un design pattern n'est qu'une façon nommée et réutilisable d'organiser le code. Quatre d'entre eux couvrent presque tout ce que vous construirez dans un framework de test.
Les quatre, et où chacun s'inscrit
- Page Object Model (POM) — une classe par écran expose les actions et cache les sélecteurs. Quand l'id du bouton de login change, vous éditez un fichier, pas cinquante tests. C'est le pattern que les examinateurs attendent le plus.
- Factory — une fonction qui construit un objet selon l'entrée, pour que les appelants ne codent pas en dur le type exact. Une factory de driver renvoie Chrome, Firefox, ou une session Grid distante à partir d'une seule chaîne de config. Les tests demandent juste « un driver ».
- Singleton — exactement une instance partagée. La config est l'usage honnête : chargez les réglages une fois, lisez-les partout, ne re-parsez pas le fichier à chaque test.
- Builder — assembler un objet complexe étape par étape avec des défauts sensés. Parfait pour les données de test : partez d'un utilisateur valide et ne surchargez que le champ à tester.
# Factory: tests ask for a driver, stay browser-agnostic
def make_driver(kind):
if kind == "chrome":
return webdriver.Chrome()
if kind == "remote": # points at Selenium Grid
return webdriver.Remote(GRID_URL, options=ChromeOptions())
raise ValueError(f"unknown driver: {kind}")
# Builder: start valid, override only what the test cares about
class UserBuilder:
def __init__(self):
self._u = {"name": "Ada", "role": "member", "active": True}
def role(self, r): # fluent override, returns self
self._u["role"] = r
return self
def build(self):
return dict(self._u)
admin = UserBuilder().role("admin").build() # intent is obviousLisez-le de haut en bas : la factory renvoie « un driver » sans que le test se soucie du navigateur, et le builder produit un utilisateur admin en ne changeant que le seul champ qui compte.
Avancé — savoir quand ne pas le faire
Le geste senior n'est pas de dégainer des patterns partout — c'est de savoir quand les éviter. N'enveloppez pas un helper de deux lignes dans une factory. Un pattern mérite sa place quand il supprime une vraie douleur répétée, pas parce qu'il a un nom sophistiqué.
Basé sur la doc Page Object Model de Selenium et les patterns créationnels classiques du Gang of Four (factory, singleton, builder)
Toutes les leçons de Architecture de framework & CI/CD
- Concevoir un framework de zéro : les couches
- Les quatre patterns que les SDET utilisent vraiment
- Données de test : fixtures vs factories vs ensemencement
- CI avec GitHub Actions : exécuter UI + API à chaque push
- Docker & Selenium Grid : des environnements de test reproductibles
- Parallèle, réessais & quarantaine des tests instables