2026-02-12 19:35:22 +01:00
# Guida ai Test
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
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
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
## 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
2026-02-12 15:13:04 +01:00
``` text
tests/
2026-02-12 19:35:22 +01:00
├── 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
2026-02-12 15:13:04 +01:00
```
2026-02-12 19:35:22 +01:00
## 2) Tecnologie usate
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
- `Vitest` : per `unit` , `integration` , `component` , `stress`
- `Playwright` : per `e2e`
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Tradotto in modo semplice:
- Vitest controlla parti interne del progetto
- Playwright controlla il comportamento reale dell'app nel browser
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
## 3) Prerequisiti (prima di tutto)
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
### 3.1 Installa dipendenze
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Dalla root del progetto:
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
``` bash
npm install
```
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
### 3.2 Installa browser Playwright (solo E2E)
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
``` bash
npx playwright install chromium firefox
```
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Se non fai questo passo, gli E2E possono fallire subito con errore tipo:
- `Executable doesn't exist`
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
## 4) Comandi principali
2026-02-12 15:13:04 +01:00
``` bash
2026-02-12 19:35:22 +01:00
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
2026-02-12 15:13:04 +01:00
```
2026-02-12 19:35:22 +01:00
Ordine consigliato (quando vuoi verificare tutto):
1. `npm run test:all`
2. `npm run test:e2e`
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
## 5) Cosa testa ogni suite (spiegato semplice)
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
### 5.1 Unit (`tests/unit`)
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Cosa sono:
- test piccoli e veloci sulla logica del gioco
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
A cosa servono:
- trovano subito bug in regole punteggio/set/reset
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Esempi reali nel progetto:
- incremento/decremento punti
- cambio palla
- vittoria set con regola dei 2 punti di scarto
- reset stato
2026-06-21 18:04:13 +02:00
- `formInizio` (snapshot formazione di partenza del set)
2026-07-03 10:57:48 +02:00
- time out (`startTimeout` /`stopTimeout` : squadra, video, timestamp)
2026-06-21 18:04:13 +02:00
- generazione del referto (`buildRefertoHtml` )
- persistenza stato su disco (`persist.js` , con `fs` mockato)
- utility di rete (`server-utils.js` )
2026-07-03 10:57:48 +02:00
- elenco video spot (`spot-utils.js` , su cartella temporanea reale)
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Quando falliscono:
- quasi sempre c'e un problema nella logica core
2026-02-12 15:13:04 +01:00
2026-06-21 18:04:13 +02:00
> Nota: punteggio, set e servizio NON sono campi dello stato: si ricavano dalla
> `striscia` con `punteggio` / `setVinti` / `servizio`. Nei test si impostano gli
> scenari costruendo la `striscia`, non scrivendo `sp.punt`/`sp.set`.
2026-02-12 19:35:22 +01:00
### 5.2 Integration (`tests/integration`)
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Cosa sono:
- test su pezzi che lavorano insieme (es. WebSocket + handler)
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
A cosa servono:
- verificano che i messaggi si muovano nel modo corretto
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Esempi reali nel progetto:
- registrazione client `display` /`controller`
- broadcast stato ai client
- validazione input malformati
- autorizzazioni (solo controller puo inviare certe azioni)
2026-07-03 10:57:48 +02:00
- timer server-side del time out (auto-`stopTimeout` dopo 30s, `startedAt` impostato dal server)
- routing del server Express (`createApp` : rotte display/controller/asset, `/spot/list` e file statici `/spot/` )
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Quando falliscono:
- spesso c'e problema nel protocollo messaggi o nei controlli di ruolo
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
### 5.3 Component (`tests/component`)
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Cosa sono:
- test dei componenti Vue senza browser completo
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
A cosa servono:
- controllano rendering e comportamento UI locale
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Esempi reali nel progetto:
- punteggio mostrato correttamente
- stato connessione
- click bottoni controller
- dialog reset/config/cambi
2026-07-03 10:57:48 +02:00
- modal time out del controller (scelta squadra/video, banner, countdown)
- overlay time out del display (video, placeholder, countdown, dissolvenza)
2026-06-21 18:04:13 +02:00
- bottone REFERTO nel dialog PARTITA FINITA
2026-07-03 10:57:48 +02:00
- client WebSocket (`wsMixin` : connessione, riconnessione, `sendWs` , errori)
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Quando falliscono:
- spesso hai rotto template, computed, metodi o binding
### 5.4 Stress (`tests/stress`)
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Cosa sono:
- test per simulare carico elevato
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
A cosa servono:
- verificano che il sistema regga molti client e molte azioni rapide
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Esempi reali nel progetto:
- tanti client display connessi insieme
- burst di azioni consecutive
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Quando falliscono:
- possono emergere problemi di performance o consistenza stato
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
### 5.5 End-to-End (`tests/e2e`)
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Cosa sono:
- test realistici nel browser
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
A cosa servono:
- verificano che Controller e Display funzionino davvero insieme
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
File principali:
2026-06-21 18:04:13 +02:00
- `helpers.cjs` : helper condivisi (`openController` /`openDisplay` /`resetGame` /`addPoints` )
2026-02-12 19:35:22 +01:00
- `basic-flow.spec.cjs` : flusso base Controller <-> Display
- `game-operations.spec.cjs` : reset, config, toggle, cambi
- `game-simulation.spec.cjs` : simulazione partita
- `full-match.spec.cjs` : scenari partita completi
2026-07-03 10:57:48 +02:00
- `timeout.spec.cjs` : time out end-to-end (modal, overlay sul display, chiusura anticipata)
2026-06-21 18:04:13 +02:00
- `referto.spec.cjs` : generazione referto a PARTITA FINITA
2026-02-12 19:35:22 +01:00
- `accessibility.spec.cjs` : controlli accessibilita con axe
- `visual-regression.spec.cjs` : confronto screenshot con baseline
2026-02-12 15:13:04 +01:00
2026-06-21 18:04:13 +02:00
Note importanti:
2026-02-12 19:35:22 +01:00
- gli E2E sono configurati in seriale (`workers: 1` ) per evitare interferenze sullo stato partita condiviso.
2026-06-21 18:04:13 +02:00
- 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.
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
## 6) Come leggere i risultati
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
### 6.1 Risultati Vitest
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Caso OK (verde):
``` text
2026-06-21 18:04:13 +02:00
Test Files 10 passed (10)
Tests 212 passed (212)
2026-02-12 19:35:22 +01:00
```
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
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 `expected` e `received`
- infine vai alla riga indicata nello stack trace
### 6.2 Risultati Playwright
Caso OK:
``` text
2026-06-21 18:04:13 +02:00
75 passed
2026-02-12 19:35:22 +01:00
```
Caso KO:
- apri il report HTML
2026-02-12 15:13:04 +01:00
``` bash
2026-02-12 19:35:22 +01:00
npx playwright show-report
2026-02-12 15:13:04 +01:00
```
2026-02-12 19:35:22 +01:00
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.
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Cartella baseline:
- `tests/e2e/visual-regression.spec.cjs-snapshots/`
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Se cambia la UI in modo intenzionale:
- aggiorna snapshot
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
``` bash
npm run test:e2e -- --update-snapshots
2026-02-12 15:13:04 +01:00
```
2026-02-12 19:35:22 +01:00
Poi rilancia controllo:
``` bash
npm run test:e2e
2026-02-12 15:13:04 +01:00
```
2026-02-12 19:35:22 +01:00
Se la UI non doveva cambiare:
- non aggiornare snapshot
- correggi prima il codice UI/CSS
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
## 8) Errori comuni e soluzione veloce
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
- Errore Playwright `Executable doesn't exist` :
- esegui `npx playwright install chromium firefox`
- E2E instabili con punteggi strani:
- assicurati che i test restino seriali (`workers: 1` )
- assicurati che ogni test parta da stato pulito (reset)
- Selettore ambiguo (esempio bottone `Cambi` ):
- usa selector piu specifici, ad esempio `getByRole(..., { exact: true })`
- Failure accessibilita:
- controlla prima `alt` delle immagini e contrasto colori
## 9) Mini checklist prima di fare push
Esegui:
2026-02-12 15:13:04 +01:00
``` bash
2026-02-12 19:35:22 +01:00
npm run test:all
npm run test:e2e
2026-02-12 15:13:04 +01:00
```
2026-02-12 19:35:22 +01:00
Se hai cambiato UI e i visual falliscono per differenze volute:
``` bash
npm run test:e2e -- --update-snapshots
npm run test:e2e
```
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
## 10) Come aggiungere un nuovo test (consigli pratici)
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
- metti i test nel posto giusto:
- `tests/unit` per logica pura
- `tests/integration` per moduli che dialogano
- `tests/component` per Vue in isolamento
- `tests/stress` per carico
- `tests/e2e` per flussi reali
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
- mantieni nomi chiari:
- il titolo del test deve spiegare cosa verifica
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
- evita test dipendenti da ordine:
- ogni test deve potersi eseguire da solo
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
- negli E2E:
- porta sempre il sistema in stato iniziale
- usa selector robusti
- limita `waitForTimeout` e preferisci attese su condizioni reali
2026-02-12 15:13:04 +01:00
2026-02-12 19:35:22 +01:00
Se segui questi punti, i test restano stabili e facili da capire anche per chi entra ora nel progetto.