MAISON CODE .
/ Tech · QA · Testing · Storybook · CSS

Test di regressione visiva: Pixel Perfect Forever

I test unitari controllano la logica. I test E2E controllano i flussi. I test di regressione visiva controllano i pixel. Come catturare le regressioni CSS prima che raggiungano la produzione.

AB
Alex B.
Test di regressione visiva: Pixel Perfect Forever

Perché Maison Code ne parla

In Maison Code Paris, agiamo come la coscienza architettonica dei nostri clienti. Spesso ereditiamo stack “moderni” costruiti senza una comprensione fondamentale della scala.

Discutiamo di questo argomento perché rappresenta un punto di svolta critico nella maturità ingegneristica. Implementarlo correttamente differenzia un MVP fragile da una piattaforma resiliente di livello aziendale.

Il problema della “perdita di CSS”.

Sei uno sviluppatore. Hai un componente “Button” utilizzato in 50 posti. Sembra fantastico. Un giorno, il team di marketing ti chiede di modificare il margine del piè di pagina per far respirare il testo del copyright. Vai su “global.css”. Vedi una classe generica .container. Aggiungi “margin-bottom: 20px”. Inserisci il codice. Inconsapevolmente, il Button era annidato all’interno di un .container. Ora ogni pulsante nell’app ha un margine extra di 20px. Il layout nella modalità “Iscriviti” ora è interrotto. Il pulsante viene spinto fuori dallo schermo. I test unitari sono superati: il componente pulsante è stato renderizzato senza arresti anomali. I test E2E superano: Burattinaio può scorrere fino al pulsante e fare clic su di esso in modo programmatico (i robot non si preoccupano dei cambiamenti di layout). L’esperienza utente non è riuscita: l’utente pensa che la tua app sia danneggiata. Questa è la Regressione visiva. Gli esseri umani sono notoriamente incapaci di individuare questi sottili cambiamenti (“Cecità al cambiamento”). Rilevare che la dimensione del carattere è cambiata da 14px a 13px su 100 pagine è impossibile per un revisore umano. Test di regressione visiva automatizza tutto questo. Si tratta di acquisire uno screenshot dello stato “Approvato” (Linea di base) e confrontarlo pixel per pixel con lo stato “Nuovo”. Se anche solo l’1% dei pixel è diverso, il test fallisce e mostra un “Diff” rosso.

Perché Maison Code parla di test visivi

Noi di Maison Code lavoriamo con marchi di lusso. Per un dashboard SaaS, forse un pulsante disallineato è accettabile. Per una casa di moda, L’estetica è funzionale. L’identità del marchio è il prodotto. Se il logo è disallineato di 2px o il peso del carattere non corrisponde alle linee guida per la stampa, ciò danneggia il valore del marchio. I clienti ci pagano per “Pixel Perfection”. Non possiamo fare affidamento sul QA manuale per rilevare “La spaziatura delle lettere è errata di 0,1 em”. Implementiamo pipeline di regressione visiva automatizzate (utilizzando Percy o Chromatic) per garantire che nessun “incidente CSS” raggiunga mai la produzione. Rendiamo immutabile il Design System.

Lo Strumento: Libro di Fiabe + Cromatico (o Percy)

Inizia con Libro di fiabe. Storybook è un workshop per la creazione di componenti dell’interfaccia utente in modo isolato. Crei una “Storia” per ogni stato del tuo componente. Button.stories.tsx:

  • “Primario” (Blu).
  • “Secondario” (Fantasma).
  • “Distruttivo” (Rosso).
  • “Caricamento” (Spinner).
  • “Disabilitato” (Grigio).

Chromatic (realizzato dai manutentori di Storybook) è il cloud runner. Si integra con il tuo CI (GitHub Actions).

  1. Crea: CI crea il sito statico Storybook.
  2. Carica: CI lo carica su Chromatic Cloud.
  3. Render: Chromatic avvia i browser cloud (Chrome, Firefox, Edge, Safari).
  4. Cattura: esegue il rendering di ogni singola storia e acquisisce uno screenshot a piena risoluzione.
  5. Confronta: confronta questi screenshot con la “Baseline” (l’ultimo commit su main).
  6. Rapporto: se i pixel sono cambiati, lo stato della build è “In attesa di revisione”.

Il flusso di lavoro: revisione delle differenze

Lo sviluppatore apre la dashboard cromatica. Vedono “Pulsante (primario) cambiato”. Attivano/disattivano la “Vista Diff” (Diapositiva/Sovrapposizione). Vedono i pixel rossi che mostrano lo spostamento. Scenario A (accidentale): “Ops, ho rotto l’imbottitura.” -> Azione: Rifiuta. Torna al codice. Correggi i CSS. Scenario B (intenzionale): “Sì, ho aumentato intenzionalmente la dimensione del carattere.” -> Azione: Accetta. Questa azione “Accetta” aggiorna la Baseline. Le build future verranno confrontate con questa nuova versione. Questo crea un traccia di controllo visivo. Sai esattamente quando il pulsante è stato modificato e chi lo ha approvato.

Gestione dei dati dinamici (la fragilità)

I test visivi odiano i dati dinamici. Se il tuo componente esegue il rendering di Date.now(), ogni screenshot fallirà. Se il tuo componente esegue il rendering di Math.random(), fallisce. Se carica un avatar utente da randomuser.me, fallisce. Soluzione: Dati fittizi. Le tue storie devono essere Deterministe. Passa oggetti di scena hardcoded. data="2025-01-01T12:00:00Z". Risposte API fittizie utilizzando Mock Service Worker (MSW) per restituire sempre lo stesso JSON. Blocca le animazioni. Uno screenshot acquisito a “0,1s” di un’animazione in dissolvenza sarà diverso da “0,2s”. Disabilitare le animazioni nell’ambiente di test.

/* anteprima-head.html nel libro delle fiabe */
<stile>
  *, *::prima, *::dopo {
    animazione: nessuna !importante;
    transizione: nessuna !importante;
  }
</stile>

Test su più browser

Funziona sul tuo Mac (Chrome). Funziona su Windows (Edge)? O iPhone (Safari)? I browser eseguono il rendering dei caratteri e delle ombre in modo diverso. Gli strumenti di regressione visiva eseguono il rendering in più browser reali nel cloud. Rilevano bug specifici del browser. “Il gradiente manca su Safari.” “La griglia è rotta su Firefox.” Ottieni questa copertura gratuitamente senza possedere un Device Lab.

Test reattivi

Non è sufficiente testare su Desktop (1920px). Devi testare su Tablet (768px) e Mobile (375px). La tua griglia potrebbe collassare in una pila. Il tuo menu potrebbe trasformarsi in un hamburger. Cromatico consente di specificare le finestre. “viste: [375, 768, 1200]”. Saranno necessari 3 screenshot per componente. Questo triplica la tua copertura. Rileverai immediatamente i bug “Il pulsante sovrappone il testo su iPhone SE”.

Il punto di vista dello scettico

“È troppo costoso. Sia in termini di soldi che di tempo.” Contropunto: Denaro: Sì, Chromatic/Percy costa denaro (utilizzo dell’istantanea). Confrontalo con lo stipendio di un ingegnere del controllo qualità che fa clic manualmente su 500 schermate su 3 browser. Oppure il costo di un “hotfix” quando si interrompe l’interfaccia utente di Checkout in produzione. Tempo: la revisione delle istantanee richiede 1 minuto. “Sì, sembra bello.” Il debug di un bug di layout in produzione richiede 3 ore. I test visivi hanno una leva elevata. Rileva i bug che le macchine (unit test) non riescono a vedere.

Domande frequenti

D: Posso utilizzare Playwright per questo? R: Sì (expect(page).toHaveScreenshot()). Il drammaturgo è fantastico. Differenza: Test visivi su drammaturgo/Cypress: ideale per pagine intere (Integrazioni). “La home page sembra corretta?” Libro di fiabe/Cromatico: ideale per la libreria dei componenti (atomi). “Il componente specifico ‘Avviso’ sembra corretto in tutte e 5 le varianti?” Consigliamo entrambi. Usa la cromaticità per il tuo sistema di progettazione. Utilizza Playwright per i flussi utente critici (Checkout).

D: Come posso gestire le differenze di anti-aliasing di 1px? R: Il rendering del testo è difficile. Le differenze della GPU causano spostamenti di 1px. Gli strumenti hanno impostazioni di “Soglia”. “soglia: 0,1”. (Ignorare le differenze inferiori allo 0,1%). Dispongono inoltre di algoritmi di “rilevamento anti-aliasing” per ignorare il rumore di smussamento dei caratteri.

Conclusione

Il test di regressione visiva abilita “Fearless CSS”. Puoi eseguire il refactoring dell’intera architettura SASS su Tailwind e, se gli screenshot corrispondono al 100%, sai con certezza matematica che non hai rotto nulla. Porta il rigore ingegneristico al design. Smetti di strizzare gli occhi davanti allo schermo. Lascia che lo faccia il robot.

13. Gestire i falsi positivi (la regola dell’1%)

A volte, gli spostamenti di 1px sono inevitabili (aggiornamenti del motore di rendering del browser). Impostiamo una Soglia dell’1%. Se la differenza è < 1% dei pixel totali, il test viene superato automaticamente. Questo filtra il “rumore” (differenze di anti-aliasing) ma cattura i “segnali” (pulsante mancante). Utilizziamo anche Regioni di layout. Diciamo allo strumento: “Ignora il piè di pagina (ha un anno di copyright dinamico). Controlla tutto il resto”. Questo “test mirato” riduce la desquamazione del 90%.

14. Perché il cromatico è meglio del fai-da-te

Abbiamo provato a realizzarlo da soli con Puppeteer + AWS S3. È stato un incubo. Gestione delle linee di base, parallelizzazione di 500 screenshot, gestione dei rami git… Cromatico risolve questo problema. È costruito dai manutentori di Storybook. Gestisce la “Storia Git” in modo nativo. Sa che “Feature Branch A” dovrebbe essere paragonato a “Main Branch”, non a “Feature Branch B”. Il costo di € 300/mese consente di risparmiare € 5.000/mese sullo stipendio DevOps.

15. Conclusione

Il problema con i test visivi è il “rumore”. Se esegui uno snapshot di contenuto dinamico, ottieni falsi positivi. Implementiamo l’Isolamento dei componenti. Mascheriamo le regioni dinamiche con i CSS: .dynamic-ad-slot { visibilità: nascosta; }. Oppure prendiamo in giro i dati per renderli statici. Utilizziamo anche Linee di base specifiche del ramo. Quando sviluppiamo un ramo di funzionalità “feat-new-header”, lo confrontiamo con “main”. Se l’intestazione cambia, il test fallisce. Lo contrassegniamo come “Accettato” nel ramo. Quando ci uniamo a “principale”, l’istantanea accettata diventa la nuova linea di base.

14. Il ROI dei test visivi

Il costo è di € 300 al mese per Chromatic. Sembra molto. Confrontalo con:

  1. Danno al marchio: un marchio di lusso con un layout non funzionante sembra un sito truffa.
  2. Tempo di sviluppo: trascorrere 4 ore per correggere una regressione causata da una modifica CSS globale.
  3. Tempo QA: pagare un essere umano per verificare 500 schermi. Il ROI è in genere 10x. Ti permette di schierarti il ​​venerdì senza paura.

15. Conclusione

Se sei stanco dei cicli “Ho corretto l’intestazione ma ho rotto il piè di pagina”, Maison Code può implementare una pipeline di test visivi. Impostiamo flussi di lavoro Storybook, Chromatic e CI per fissare il tuo progetto sul posto. Definiamo le linee di base e formiamo il tuo team su come rivedere le differenze.


Assumi i nostri architetti.