Content slides
Introduction¶
Un test de régression visuel vérifie que les modifications de code n'ont pas introduit de changements visuels non désirés
Contrairement aux tests unitaires, qui vérifient la logique, les tests visuels se concentrent sur le rendu final (UI) perçu par l'utilisateur
Pourquoi utiliser les tests visuels ?¶
- Cohérence de l'interface : Détecter les décalages de pixels, les erreurs de couleurs ou de polices
- Effets de bord : Identifier si une modification CSS sur une page a cassé un élément sur une autre page
- Validation de design : Automatiser la comparaison pour aider les équipes Produit et Design
- Cross-browser : S'assurer que le rendu est identique sur Chrome, Firefox ou Safari
Pixel Comparison vs DOM Snapshots¶
Il existe deux approches principales :
- Pixel Comparison (BackstopJS) : Compare deux images bit à bit
- Problème : Très sensible à l'environnement (GPU, OS, polices)
- DOM Snapshots (Percy) : Capture le DOM et les assets (CSS/Images)
- Avantage : Le rendu est généré dans le cloud de manière stable et reproductible
BackstopJS¶
BackstopJS est un outil open-source basé sur Puppeteer qui utilise la comparaison de pixels
- Points forts : Gratuit, tourne en local, rapports HTML détaillés
- Points faibles : Nécessite impérativement Docker en CI pour garantir un rendu identique entre le dev et la machine de build
BackstopJS - Configuration¶
Initialisation : backstop init
{
"id": "my_app",
"viewports": [
{ "label": "desktop", "width": 1280, "height": 800 },
{ "label": "mobile", "width": 375, "height": 667 }
],
"scenarios": [
{
"label": "Homepage",
"url": "http://localhost:3000",
"selectors": ["document"],
"misMatchThreshold": 0.1
}
],
"engine": "puppeteer"
}
BackstopJS - Exécution¶
-
Création des références : Capturer l'état "OK" de l'application
-
Exécution des tests : Comparer le code actuel aux références
-
Approuver les changements : Si le changement est voulu, il devient la nouvelle référence
BackstopJS - GitLab CI¶
Utilisation de l'image officielle pour éviter les problèmes de rendu :
visual_test:
stage: test
image: backstopjs/backstopjs:latest
script:
- backstop test --docker
artifacts:
when: on_failure
paths:
- backstop_data/html_report
BrowserStack Percy¶
Percy est une solution SaaS qui gère la complexité du rendu et de la comparaison dans le cloud
- Workflow : Capture le DOM localement \(\rightarrow\) Envoi au cloud Percy \(\rightarrow\) Rendu et comparaison \(\rightarrow\) Dashboard de validation
- Avantage : Parfait pour les équipes, permet d'approuver les changements via une interface web
BrowserStack Percy - Configuration¶
Installation : npm install --save-dev @percy/cli @percy/puppeteer
// visual_test.js
const percySnapshot = require('@percy/puppeteer')
const puppeteer = require('puppeteer')
(async () => {
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto('http://localhost:3000')
// Capture envoyée directement à Percy
await percySnapshot(page, 'Homepage')
await browser.close()
})()
Exécution : npx percy exec -- node visual_test.js
BrowserStack Percy - GitLab CI¶
percy_test:
stage: test
image: node:lts
variables:
PERCY_TOKEN: $PERCY_TOKEN # Défini dans les réglages du projet
script:
- npm ci
- npx percy exec -- node visual_test.js