veza/docs/VISUAL_TESTING_STRATEGY.md
senke be7d7b02cc feat(e2e): Playwright + pixelmatch stack for pixel-perfect visual regression
- playwright.config.visual.ts: dedicated config, viewport 1280x720, Chromium only,
  snapshots in e2e/tests/visual/__snapshots__
- e2e/tests/visual/visual-regression.spec.ts: login, register, dashboard (full/header/sidebar),
  player bar, playlists, 404, mobile/tablet viewports; dark theme + reduceMotion
- scripts/visual-diff.js: optional pixelmatch script to generate diff image from two PNGs
- docs/VISUAL_TESTING_STRATEGY.md: strategy, commands, CI, workflow
- npm scripts: test:visual, test:visual:update, test:visual:report
- deps: pixelmatch, pngjs; @playwright/test aligned to 1.58.1
- baseline snapshots added for login, dashboard, playlists, 404, viewports

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 20:01:30 +01:00

5.1 KiB
Raw Blame History

Stratégie de tests visuels (Playwright + pixelmatch)

Objectif : vue fiable du frontend via des screenshots automatiques et une comparaison pixel-perfect pour éviter les régressions visuelles.


1. Stack

Outil Rôle
Playwright Lancement du navigateur, navigation, capture décran, comparaison avec les baselines.
toHaveScreenshot() Comparaison pixel à pixel (Playwright utilise en interne un algorithme type pixelmatch).
pixelmatch + pngjs Script optionnel scripts/visual-diff.js pour générer une image de diff à partir de deux PNG (expected/actual).

Les baselines (golden screenshots) sont versionnées dans le dépôt. En CI, on compare les nouvelles captures aux baselines ; en local, on peut mettre à jour les baselines après un changement volontaire.


2. Config dédiée : playwright.config.visual.ts

  • Répertoire des tests : e2e/tests/visual/
  • Snapshots : e2e/tests/visual/__snapshots__/ (un fichier par test, nommé {arg}-{projectName}{ext}).
  • Viewport fixe : 1280×720 (Chromium uniquement) pour des captures reproductibles.
  • Réduction des animations : reduceMotion: 'reduce' pour limiter la flou du à des animations.
  • Un worker : exécution séquentielle pour éviter les variations de charge.
  • Auth : les tests login/register utilisent un contexte sans cookie. Les tests “app” (dashboard, sidebar, player) utilisent e2e/.auth/user.json sil existe ; sinon certains tests (ex. sidebar) sont skippés. Pour créer ou mettre à jour les baselines authentifiés, exécuter dabord les tests E2E normaux (avec global setup) une fois : npx playwright test --config=playwright.config.ts (cela crée e2e/.auth/user.json), puis npm run test:visual:update.

3. Suite de tests : e2e/tests/visual/visual-regression.spec.ts

  • Auth (sans cookie) : login, register — full page, thème dark forcé.
  • App (avec auth) : dashboard full page, header, sidebar, barre de lecture — thème dark forcé.
  • Routes : playlists, 404.
  • Viewports : mobile 375×667, tablette 768×1024.

Chaque test :

  1. Navigue vers lURL.
  2. Attend networkidle et les éléments principaux.
  3. Force le thème dark (document.documentElement.classList.add('dark')).
  4. Attend un délai de stabilisation (800 ms).
  5. Appelle expect(...).toHaveScreenshot(...) avec maxDiffPixels (et éventuellement maxDiffPixelRatio).

Tolérance pixel-perfect : par défaut maxDiffPixels: 0. En CI, si besoin (police, anti-aliasing), on peut relâcher via la variable denvironnement VISUAL_MAX_DIFF_PIXELS (ex. 50).


4. Commandes npm (apps/web)

# Lancer les tests visuels (compare aux baselines)
npm run test:visual

# Mettre à jour les baselines après un changement volontaire
npm run test:visual:update

# Ouvrir le rapport HTML des derniers runs
npm run test:visual:report

En CI, exécuter npm run test:visual après le build. En cas déchec, les artefacts contiennent les dossiers test-results-visual avec expected / actual / diff.


5. Workflow recommandé

  1. Développement : modifier lUI, lancer npm run test:visual. Si le changement est voulu, lancer npm run test:visual:update et committer les nouveaux fichiers dans e2e/tests/visual/__snapshots__/.
  2. CI : exécuter npm run test:visual (sans --update-snapshots). En cas déchec, télécharger les artefacts (expected, actual, diff) pour analyser.
  3. Optionnel : après un échec, utiliser node scripts/visual-diff.js <expected.png> <actual.png> [diff.png] pour générer une image de diff avec pixelmatch (seuillage personnalisable).

6. Bonnes pratiques

  • Thème : forcer dark dans les tests pour des baselines cohérentes.
  • Viewport : ne pas changer de taille dans un même projet “visual” sauf tests dédiés (mobile/tablette).
  • Données : utiliser des mocks ou un compte de test stable pour que le contenu (dashboard, playlists) ne change pas dun run à lautre.
  • Animations : reduceMotion + délai de stabilisation pour éviter les flous.
  • Nommage : noms de snapshots courts et explicites (ex. login-page.png, dashboard-sidebar.png).

7. Fichiers clés

Fichier Rôle
playwright.config.visual.ts Config viewport, snapshot path, projet Chromium.
e2e/tests/visual/visual-regression.spec.ts Tous les tests toHaveScreenshot.
e2e/tests/visual/__snapshots__/ Baselines PNG (à committer).
scripts/visual-diff.js Script optionnel pixelmatch pour diff image.
docs/VISUAL_TESTING_STRATEGY.md Ce document.

8. Intégration CI (exemple)

# Exemple GitHub Actions
- name: Run visual regression
  run: cd apps/web && npm run test:visual
  env:
    VISUAL_MAX_DIFF_PIXELS: "0"   # ou "50" si tolérance acceptée

- name: Upload visual test results
  if: failure()
  uses: actions/upload-artifact@v4
  with:
    name: visual-test-results
    path: apps/web/e2e/test-results-visual/

Cette stratégie donne une vue automatique et pixel-perfect du frontend via Playwright et, en option, pixelmatch pour lanalyse des diffs.