modulo 07 / lezione 50
Leggere e verificare codice generato
Test manuali strutturati: checklist riproducibili
Trasformare prove casuali in verifiche ripetibili e condivisibili.
Test manuali strutturati: checklist riproducibili
Test automatici sono potenti ma non sostituiscono test manuali. Un occhio umano coglie cose che gli automatici saltano: estetica, fluidità, accessibilità reale, sensazione di velocità. Ma test manuali “a vista” sono inaffidabili: dipendono da cosa ricordi di provare. Checklist strutturate sono la versione ripetibile dei test manuali.
Perché questa lezione conta
Senza checklist, ogni test manuale è “io provo qualche cosa”. Quel “qualche cosa” varia di volta in volta. Risultato: cose che funzionavano si rompono senza che te ne accorga; cose nuove non vengono testate sotto certi browser/casi. Checklist riproducibile = test manuale che chiunque può eseguire, ottenendo gli stessi segnali. Trasforma test in pratica condivisibile.
Obiettivo operativo
Alla fine devi saper:
- costruire checklist per un flusso utente in formato riproducibile;
- eseguire la checklist registrando evidenze (screenshot, dati, output);
- usare AI per generare checklist iniziale e poi affinarla con esperienza.
Nucleo della lezione
1. Struttura di una checklist
Ogni voce di checklist ha 5 elementi:
Setup: stato di partenza richiesto. “Utente loggato come admin”, “DB con 3 task di esempio”, “Browser pulito senza cache”.
Azione: cosa fai. “Click su Salva”, “Apri /admin/users”, “Tab attraverso form”.
Dato usato: input concreto. “Email: test@example.com”, “Password: minlength6”, “File: 2MB jpg”.
Risultato atteso: cosa dovrebbe succedere. “Modal conferma con messaggio X”, “Redirect a /home con welcome”, “Bordo rosso e errore inline”.
Risultato osservato: cosa succede. Compili durante esecuzione, non a memoria.
Esempio voce:
[ ] Login con credenziali valide
Setup: utente `test@test.it` esiste, password "test1234". Browser pulito.
Azione: apri /login, compila email e password, click "Accedi".
Dato: email = `test@test.it`, password = test1234
Atteso: redirect a /home con saluto "Benvenuto, Test"
Osservato: ___
Compilato durante test → tracciabile, ripetibile.
2. Cosa testare
Categorie da coprire per app web:
Flussi utente principali:
- registrazione + login
- recupero password
- onboarding
- creazione/modifica/cancellazione di entità chiave
- pagamento (se applicabile)
- logout
Stati UI:
- vuoto (no dati)
- loading (durante fetch)
- errore (rete, server, validazione)
- successo (conferma esplicita)
- pieno (lista lunga, scroll)
Browser e dispositivi:
- browser principali (Chrome, Safari, Firefox)
- mobile vs desktop (viewport diverse)
- iOS Safari (peculiarità: vh, scroll, touch)
- altre lingue se app supporta i18n
Accessibilità:
- navigazione solo da tastiera (Tab, Shift+Tab, Enter, Esc)
- focus visibile su elementi interattivi
- contrasto colori
- screen reader (almeno VoiceOver/NVDA su una pagina chiave)
Performance percepita:
- caricamento iniziale
- transizioni
- form submit
- ricerca
Resilience:
- refresh durante operazione
- back/forward del browser
- doppio tab della stessa app
- offline → online
Per ogni feature, scegli categorie pertinenti e voci specifiche.
3. Registrazione evidenze
Test manuale senza traccia = test che non c’è stato. Registra:
- Screenshot: dei punti critici. Tools: Cmd+Shift+4 macOS, Snip&Sketch Windows, screenshot integrati nel browser.
- Console log: copia errori/warning rilevanti, verbatim.
- Network: status code di chiamate API, payload se rilevante.
- Dati usati: email, password, valori specifici → riproducibilità.
- Versione/commit testato: hash git breve. Quando aggiungi commit, ripeti checklist.
- Data/ora del test.
Salva tutto in cartella qa/ o sezione del task tracker. Diventa archivio di test sessions.
Caso guidato: da prova casuale a checklist
Prova casuale:
Ho provato il form e sembra ok.
Questa frase non è riutilizzabile. Non dice browser, dati, stato iniziale, risultato atteso, né cosa è stato escluso. Trasformala:
## Feature: creazione task
Versione: commit `abc123`
Browser: Chrome desktop, viewport 1440x900
Setup:
- utente già loggato;
- lista task vuota;
- DevTools Console aperta.
[ ] Creazione con titolo valido
Dato: "Pagare bolletta"
Atteso: nuova riga in lista, messaggio "Task creato", input svuotato.
Osservato:
[ ] Titolo vuoto
Dato: campo vuoto
Atteso: submit bloccato, messaggio "Inserisci un titolo".
Osservato:
[ ] Doppio click su Salva
Dato: "Comprare pane"
Atteso: un solo task creato.
Osservato:
[ ] Refresh dopo creazione
Atteso: task ancora presente.
Osservato:
La checklist non deve coprire tutto il mondo. Deve rendere ripetibile ciò che hai davvero provato. Quando trovi un bug, aggiungi una voce: quel bug diventa regressione futura.
Procedura pratica
Per nuova feature significativa:
- Genera checklist iniziale (con AI se serve, vedi prompt sotto).
- Personalizza: aggiungi voci specifiche al tuo caso, rimuovi non pertinenti.
- Esegui: in ordine, una voce alla volta. Compili “osservato” man mano.
- Annota difetti: bug trovati con screenshot/log.
- Salva: checklist + evidenze in cartella dedicata.
- Aggiorna checklist: voci che hanno trovato bug → aggiungi a checklist permanente per regression future.
Laboratorio guidato
Feature: form di iscrizione newsletter.
Checklist iniziale:
SETUP COMUNE
- Browser pulito (no cookie precedenti)
- /newsletter accessibile
[ ] 1. Iscrizione con email valida
Azione: inserisci "test@example.com", click "Iscrivi"
Atteso: messaggio "Iscritto! Ti abbiamo inviato email di conferma"
Osservato: ___
[ ] 2. Email vuota
Azione: clicca "Iscrivi" senza compilare
Atteso: bordo rosso campo email + errore "Inserisci email"
Osservato: ___
[ ] 3. Email malformata
Azione: inserisci "abc", click "Iscrivi"
Atteso: errore "Email non valida"
Osservato: ___
[ ] 4. Email già iscritta
Azione: inserisci email già nel sistema, click "Iscrivi"
Atteso: messaggio "Email già iscritta. Vuoi riinviare conferma?"
Osservato: ___
[ ] 5. Tastiera-only
Azione: senza mouse, Tab, Tab, type email, Tab, Enter
Atteso: form si compila, submit, conferma
Osservato: ___
[ ] 6. Mobile (Safari iOS, viewport 375)
Azione: form aperto, compila, submit
Atteso: layout responsive, tastiera adatta (email keyboard)
Osservato: ___
[ ] 7. Offline durante submit
Azione: chrome devtools → offline, compila form, submit
Atteso: messaggio "Connessione assente. Riprova"
Osservato: ___
[ ] 8. Refresh dopo submit successo
Azione: dopo conferma, F5
Atteso: pagina ricarica, form vuoto, no doppio invio
Osservato: ___
[ ] 9. Back browser dopo submit
Azione: dopo conferma, click freccia indietro
Atteso: pagina precedente, no resubmit confirmation
Osservato: ___
[ ] 10. Submit ripetuto rapidamente (doppio click)
Azione: click rapidi consecutivi
Atteso: solo un invio (debounce/disable)
Osservato: ___
10 voci, 30-45 min di esecuzione. Trovi bug = correggi + aggiungi voce per regression.
Output atteso
Una checklist per la prossima feature significativa, in formato testuale o markdown, con sezioni setup + voci + spazio “osservato”. Salvabile in cartella qa/feature-name.md.
Quando fermare il test
Una checklist non è un romanzo infinito. Per una feature media, 10-15 voci bastano. Fermati quando hai coperto: flusso principale, un errore prevedibile, un caso limite, refresh o ritorno pagina, mobile o tastiera. Se una voce richiede più di 5 minuti, probabilmente è troppo grande: dividila.
Quando trovi un bug, non continuare come se niente fosse. Segna la voce come fallita, raccogli evidenza minima e apri un sotto-task. Dopo il fix, ripeti quella voce e almeno due voci vicine. Questo è il passaggio che trasforma test manuale in protezione da regressioni.
Per una consegna didattica, aggiungi sempre una riga finale: “decisione”. Può essere passa, passa con note, blocca. Così lo studente impara che testare non è solo osservare: è decidere se il lavoro può avanzare.
Studio passo passo
Studia questa lezione in tre passaggi, senza correre subito al prompt o al codice.
- Prima lettura: chiarisci l’obiettivo: trasformare prove casuali in verifiche ripetibili e condivisibili. Se non riesci a riscriverlo in una frase tua, rileggi il nucleo della lezione.
- Seconda lettura: trasforma i contenuti in domande operative:
- Checklist per flussi utente: setup, azione, dato usato, risultato atteso, risultato osservato.
- Test su browser, viewport, stato vuoto, stato carico, errore, refresh, navigazione da tastiera.
- Registrare prove: screenshot, log console, dati usati, commit o versione testata.
- Applicazione: svolgi il laboratorio: scrivere ed eseguire una checklist manuale per una pagina o un flusso di autenticazione simulato. L’output da ottenere è: una checklist riproducibile che un’altra persona potrebbe eseguire ottenendo gli stessi segnali.
Prima di passare alla lezione successiva, controlla di avere un artefatto concreto: una tabella, un prompt, una checklist, un mini report, un diff commentato o una decisione scritta. Nel vibe coding la comprensione resta astratta finché non produce una traccia verificabile.
Checklist di verifica
- ho almeno una checklist scritta per il mio progetto principale;
- ogni voce ha setup + azione + dato + atteso;
- registro screenshot/log durante esecuzione;
- aggiungo voci alla checklist quando un bug emerge;
- conosco le 6 categorie di test (flussi, stati, browser, accessibilità, performance, resilience).
Errori comuni
“Provo a vista”. Senza checklist, manchi cose. Sempre.
Voci vaghe. “Verifica funzionamento”. Non testabile. Cosa? Come? Con quale dato?
Nessuna registrazione. Test fatto, niente traccia. Domani ripeti tutto.
Mai aggiornare. Bug trovato → fix → checklist immutata. Bug torna fra mesi.
Solo happy path. 80% delle voci sono caso normale. Edge case e ostili sottorappresentati.
Test solo su browser principale. Mobile/Safari iOS hanno pattern specifici. Almeno uno sguardo lì.
Niente accessibilità. Tastiera-only è 5 minuti, screen reader 10. Skipparli = utenti reali esclusi.
Prompt di lavoro
Genera checklist di test manuali per questa feature: [descrizione]
Categorie da coprire (scegli pertinenti):
- flussi principali (3-5 voci)
- stati UI (vuoto, loading, errore, successo, pieno) (1 voce per stato)
- browser/dispositivi (Chrome, Safari, mobile)
- accessibilità tastiera (1-2 voci)
- resilience (refresh, back, offline) (2-3 voci)
Output: lista numerata con per ogni voce:
- setup
- azione
- dato concreto
- atteso
Spazio per "osservato" → vuoto, da compilare.
Lunghezza target: 10-15 voci per feature media.
Niente test automatici. Niente codice. Solo checklist eseguibile da umano.
Esercizio finale
Esegui checklist per una feature del tuo progetto in produzione. Probabilmente trovi 1-3 bug minori che usavi senza notare. Quei bug sono lo stato di base senza checklist: presenti ma invisibili. Per ognuno: fix, aggiungi voce permanente alla checklist, regressi prevenuti per il futuro.