Aggiunge casi per team 'guest' in nuovoSet, cambi senza array `cambi`, resetta con striscia vuota e startTimeout senza startedAt: gameState.js passa dal 100% al 100% statement ma sale al 99% branch.
Guida ai Test
Obiettivo della guida:
- capire che tipi di test esistono nel progetto
- capire a cosa servono davvero
- sapere come lanciarli senza errori
- sapere come leggere i risultati
- sapere cosa fare quando qualcosa fallisce
0) Perche facciamo i test?
Un test è un controllo automatico.
In pratica:
- tu cambi il codice
- lanci i test
- i test ti dicono se hai rotto qualcosa
Se i test sono verdi, hai una buona probabilita che il progetto sia ancora stabile. Se i test sono rossi, c'e un problema da capire e sistemare.
1) Struttura delle cartelle test
tests/
├── unit/ # Test della logica pura (molto veloci)
├── integration/ # Test di moduli che comunicano tra loro
├── component/ # Test dei componenti Vue in isolamento
├── stress/ # Test sotto carico (molti client/azioni)
├── e2e/ # Test end-to-end su browser reale
└── README.md # Questa guida
2) Tecnologie usate
Vitest: perunit,integration,component,stressPlaywright: pere2e
Tradotto in modo semplice:
- Vitest controlla parti interne del progetto
- Playwright controlla il comportamento reale dell'app nel browser
3) Prerequisiti (prima di tutto)
3.1 Installa dipendenze
Dalla root del progetto:
npm install
3.2 Installa browser Playwright (solo E2E)
npx playwright install chromium firefox
Se non fai questo passo, gli E2E possono fallire subito con errore tipo:
Executable doesn't exist
4) Comandi principali
npm run test # Vitest in watch mode (resta in ascolto)
npm run test:all # Tutta la suite Vitest una volta
npm run test:unit # Unit + integration
npm run test:component # Solo component test
npm run test:stress # Solo stress test
npm run test:e2e # Tutti gli E2E Playwright
npm run test:e2e:ui # Playwright con interfaccia grafica
Ordine consigliato (quando vuoi verificare tutto):
npm run test:allnpm run test:e2e
5) Cosa testa ogni suite (spiegato semplice)
5.1 Unit (tests/unit)
Cosa sono:
- test piccoli e veloci sulla logica del gioco
A cosa servono:
- trovano subito bug in regole punteggio/set/reset
Esempi reali nel progetto:
- incremento/decremento punti
- cambio palla
- vittoria set con regola dei 2 punti di scarto
- reset stato
formInizio(snapshot formazione di partenza del set)- time out (
startTimeout/stopTimeout: squadra, video, timestamp) - generazione del referto (
buildRefertoHtml) - persistenza stato su disco (
persist.js, confsmockato) - utility di rete (
server-utils.js) - elenco video spot (
spot-utils.js, su cartella temporanea reale)
Quando falliscono:
- quasi sempre c'e un problema nella logica core
Nota: punteggio, set e servizio NON sono campi dello stato: si ricavano dalla
strisciaconpunteggio/setVinti/servizio. Nei test si impostano gli scenari costruendo lastriscia, non scrivendosp.punt/sp.set.
5.2 Integration (tests/integration)
Cosa sono:
- test su pezzi che lavorano insieme (es. WebSocket + handler)
A cosa servono:
- verificano che i messaggi si muovano nel modo corretto
Esempi reali nel progetto:
- registrazione client
display/controller - broadcast stato ai client
- validazione input malformati
- autorizzazioni (solo controller puo inviare certe azioni)
- timer server-side del time out (auto-
stopTimeoutdopo 30s,startedAtimpostato dal server) - routing del server Express (
createApp: rotte display/controller/asset,/spot/liste file statici/spot/)
Quando falliscono:
- spesso c'e problema nel protocollo messaggi o nei controlli di ruolo
5.3 Component (tests/component)
Cosa sono:
- test dei componenti Vue senza browser completo
A cosa servono:
- controllano rendering e comportamento UI locale
Esempi reali nel progetto:
- punteggio mostrato correttamente
- stato connessione
- click bottoni controller
- dialog reset/config/cambi
- modal time out del controller (scelta squadra/video, banner, countdown)
- overlay time out del display (video, placeholder, countdown, dissolvenza)
- bottone REFERTO nel dialog PARTITA FINITA
- client WebSocket (
wsMixin: connessione, riconnessione,sendWs, errori)
Quando falliscono:
- spesso hai rotto template, computed, metodi o binding
5.4 Stress (tests/stress)
Cosa sono:
- test per simulare carico elevato
A cosa servono:
- verificano che il sistema regga molti client e molte azioni rapide
Esempi reali nel progetto:
- tanti client display connessi insieme
- burst di azioni consecutive
Quando falliscono:
- possono emergere problemi di performance o consistenza stato
5.5 End-to-End (tests/e2e)
Cosa sono:
- test realistici nel browser
A cosa servono:
- verificano che Controller e Display funzionino davvero insieme
File principali:
helpers.cjs: helper condivisi (openController/openDisplay/resetGame/addPoints)basic-flow.spec.cjs: flusso base Controller <-> Displaygame-operations.spec.cjs: reset, config, toggle, cambigame-simulation.spec.cjs: simulazione partitafull-match.spec.cjs: scenari partita completitimeout.spec.cjs: time out end-to-end (modal, overlay sul display, chiusura anticipata)referto.spec.cjs: generazione referto a PARTITA FINITAaccessibility.spec.cjs: controlli accessibilita con axevisual-regression.spec.cjs: confronto screenshot con baseline
Note importanti:
- gli E2E sono configurati in seriale (
workers: 1) per evitare interferenze sullo stato partita condiviso. - il controller viene aperto in viewport portrait (layout "mobile") tramite
openController: in landscape userebbe la dashboard estesa con selettori diversi. - lo stato è UNICO e persistente sul server: ogni test inizia con
resetGame, che azzera e reimposta i nomi di default per garantire determinismo.
6) Come leggere i risultati
6.1 Risultati Vitest
Caso OK (verde):
Test Files 10 passed (10)
Tests 212 passed (212)
Significa:
- tutti i test Vitest sono passati
Caso KO (rosso):
- guarda prima il nome del file test
- poi il nome del test (
describe/test) - poi la riga con
expectedereceived - infine vai alla riga indicata nello stack trace
6.2 Risultati Playwright
Caso OK:
75 passed
Caso KO:
- apri il report HTML
npx playwright show-report
Nel report puoi vedere:
- step del test
- errori precisi
- screenshot/diff
- trace
7) Visual Regression (screenshot)
I test visual confrontano immagini attuali con immagini baseline.
Cartella baseline:
tests/e2e/visual-regression.spec.cjs-snapshots/
Se cambia la UI in modo intenzionale:
- aggiorna snapshot
npm run test:e2e -- --update-snapshots
Poi rilancia controllo:
npm run test:e2e
Se la UI non doveva cambiare:
- non aggiornare snapshot
- correggi prima il codice UI/CSS
8) Errori comuni e soluzione veloce
-
Errore Playwright
Executable doesn't exist:- esegui
npx playwright install chromium firefox
- esegui
-
E2E instabili con punteggi strani:
- assicurati che i test restino seriali (
workers: 1) - assicurati che ogni test parta da stato pulito (reset)
- assicurati che i test restino seriali (
-
Selettore ambiguo (esempio bottone
Cambi):- usa selector piu specifici, ad esempio
getByRole(..., { exact: true })
- usa selector piu specifici, ad esempio
-
Failure accessibilita:
- controlla prima
altdelle immagini e contrasto colori
- controlla prima
9) Mini checklist prima di fare push
Esegui:
npm run test:all
npm run test:e2e
Se hai cambiato UI e i visual falliscono per differenze volute:
npm run test:e2e -- --update-snapshots
npm run test:e2e
10) Come aggiungere un nuovo test (consigli pratici)
-
metti i test nel posto giusto:
tests/unitper logica puratests/integrationper moduli che dialoganotests/componentper Vue in isolamentotests/stressper caricotests/e2eper flussi reali
-
mantieni nomi chiari:
- il titolo del test deve spiegare cosa verifica
-
evita test dipendenti da ordine:
- ogni test deve potersi eseguire da solo
-
negli E2E:
- porta sempre il sistema in stato iniziale
- usa selector robusti
- limita
waitForTimeoute preferisci attese su condizioni reali
Se segui questi punti, i test restano stabili e facili da capire anche per chi entra ora nel progetto.