Skip to content
Test da eseguire prima della pubblicazione di una nuova release di un’app Flutter per iOS & Android

Test da eseguire prima della pubblicazione di una nuova release di un’app Flutter per iOS & Android

By Pier Luigi Papeschi

Ad ogni release è bene strutturare una serie di controlli che ci fanno evitare di pubblicare un’app con bug banali o gravi. La lista è pensata per iOS e Android con Flutter, ma molti controlli sono di carattere generale. Se cerchi un articolo che spieghi come pubblicare una nuova app, leggi questi articoli. Andiamo veloci in modo schematico:

1. Build e configurazione

  • Eseguire flutter analyze per verificare che non ci siano errori o warning.
  • Eseguire tutti gli unit test con flutter test se ne abbiamo fatti.
  • Verificare che la build nel modo Release compili correttamente su Android e iOS
  • Controllare version e build number in pubspec.yaml.
  • Verificare che ambiente, API URL e configurazioni siano quelli di produzione.
  • Controllare che non siano rimasti flag di debug, mock, dati fasulli o endpoint necessari solo per le fasi di staging.
  • Verificare che eventuali chiavi e configurazioni sensibili non siano incluse impropriamente nell’app.
  • Controllare che logging e strumenti di debug non espongano dati sensibili. Meglio evitare ogni log in produzione.

2. Installazione e aggiornamento

  • Installare l’app da zero su un dispositivo Android e iOS reale.
  • Verificare il primo avvio.
  • Aggiornare una versione precedente dell’app alla nuova versione senza disinstallarla.
  • Controllare che dati locali, preferenze e sessioni vengano mantenuti correttamente dopo l’upgrade.
  • Verificare eventuali migrazioni di database.
  • Verificare il comportamento dopo chiusura forzata e nuovo avvio.

3. Autenticazione (opzionale)

  • Registrazione nuovo account.
  • Login con credenziali corrette.
  • Login con credenziali errate.
  • Logout.
  • Recupero password.
  • Cambio password, se previsto.
  • Scadenza della sessione/token.
  • Refresh automatico del token.
  • Avvio dell’app con sessione già autenticata.
  • Cancellazione account, se prevista.
  • Verificare che un utente non possa accedere a schermate protette dopo il logout.

4. UX parti principali dell’app

Per ogni funzionalità importante verificare almeno:

  • Input vuoti.
  • Input non validi.
  • Errori restituiti dal backend.
  • Dati mancanti o incompleti.
  • Liste vuote.
  • Liste molto lunghe.
  • Loading lento.
  • Operazioni ripetute rapidamente.
  • Doppio tap sui pulsanti di conferma.
  • Navigazione avanti/indietro durante un’operazione.

Eseguire manualmente tutti i principali percorsi che l’utente può fare, per esempio:

  • Login → Home → dettaglio → modifica → salvataggio.
  • Creazione di un nuovo elemento.
  • Modifica di un elemento esistente.
  • Eliminazione.
  • Ricerca.
  • Filtri e ordinamento.
  • Paginazione/infinite scrolling.
  • Upload/download, se presenti.
  • Checkout/pagamento, se presenti.

5. Connessione di rete e API

  • App con Wi-Fi stabile.
  • App con rete mobile.
  • App senza connessione.
  • Perdita della connessione durante una richiesta.
  • Ripristino della connessione.
  • Connessione molto lenta.
  • Timeout API.
  • Risposta API con dati incompleti o inattesi.
  • Verificare retry e messaggi di errore.
  • Controllare che uno stesso comando non venga inviato più volte accidentalmente.

6. Navigazione

  • Tutte le schermate principali sono raggiungibili.
  • Back button Android funziona correttamente.
  • Swipe-back iOS funziona dove previsto.
  • Bottom navigation mantiene correttamente lo stato.
  • Tab navigation mantiene lo stato.
  • Apertura di modal e bottom sheet.
  • Chiusura delle modal tramite gesture/back.
  • Universal Links iOS.
  • App Links Android.
  • Apertura di una notifica verso la schermata corretta.

7. Lifecycle

Testare l’app quando:

  • Passa in background.
  • Torna in foreground.
  • Rimane in background per diversi minuti.
  • Viene terminata dal sistema.
  • Viene terminata manualmente dall’utente.
  • Viene riaperta dopo essere stata terminata.
  • Lo schermo viene bloccato e successivamente sbloccato.
  • Arriva una telefonata o un’altra interruzione.
  • L’utente cambia applicazione durante un’operazione.

Verificare soprattutto che non vengano perse operazioni o dati inseriti.

8. UI e responsive layout

Testare almeno:

  • Smartphone piccolo.
  • Smartphone grande.
  • Tablet & Watch, se supportati.
  • Android con differenti densità dello schermo.
  • iPhone con notch/Dynamic Island.
  • Dispositivi con bottom gesture indicator.
  • Orientamento portrait.
  • Orientamento landscape, se supportato.

Controllare:

  • Overflow Flutter.
  • Testi tagliati.
  • Pulsanti fuori schermo.
  • SafeArea.
  • Tastiera che copre input o pulsanti.
  • Scroll delle schermate con molti contenuti.
  • Dialog su schermi piccoli.
  • Bottom sheet con tastiera aperta.

9. Accessibilità e impostazioni di sistema

  • Font di sistema normale.
  • Font di sistema molto grande.
  • Modalità chiara.
  • Modalità scura.
  • Contrasto sufficiente.
  • Elementi interattivi sufficientemente grandi.
  • Screen reader almeno sui flussi principali.
  • VoiceOver su iOS.
  • TalkBack su Android.
  • Label semantiche corrette sui controlli importanti.
  • Layout ancora utilizzabile con dimensione testo elevata.

10. Tastiera e form

  • Tastiera corretta per email.
  • Tastiera numerica per numeri.
  • Tastiera telefonica per numeri di telefono.
  • Next/Done funzionano correttamente.
  • Focus passa correttamente tra i campi.
  • Tastiera può essere chiusa.
  • Validazione viene mostrata correttamente.
  • Errori vengono rimossi quando il valore diventa valido.
  • Copy/paste funziona dove previsto.
  • Autofill funziona dove previsto.
  • Password manager funziona dove previsto.

11. Permessi

Provare ogni permesso almeno in questi stati:

  • Permesso concesso.
  • Permesso negato.
  • Permesso negato definitivamente.
  • Permesso revocato successivamente dalle impostazioni di sistema.

Verificare, se utilizzati:

  • Fotocamera.
  • Microfono.
  • Foto/galleria.
  • Localizzazione.
  • Bluetooth.
  • Contatti.
  • Calendario.
  • Notifiche.

L’app non deve bloccarsi se un permesso viene negato.

12. Push notification

  • Richiesta del permesso notifiche.
  • Token push registrato correttamente.
  • Ricezione con app in foreground.
  • Ricezione con app in background.
  • Ricezione con app terminata.
  • Tap sulla notifica.
  • Navigazione verso il contenuto corretto.
  • Payload incompleto/non riconosciuto.
  • Aggiornamento del push token.
  • Logout rimuove/disassocia correttamente il token, se necessario.

Separare i test APNs e FCM quando possibile.

13. Salvataggio locale

  • SharedPreferences.
  • Secure Storage.
  • Database locale.
  • Cache.
  • File salvati localmente.
  • Dati mantenuti dopo riavvio.
  • Dati mantenuti dopo aggiornamento app.
  • Dati eliminati correttamente al logout quando richiesto.
  • Dati sensibili non salvati in storage non sicuro.

14. Performance

  • Tempo di cold start accettabile.
  • Tempo di warm start accettabile.
  • Navigazione fluida.
  • Liste lunghe senza evidenti rallentamenti.
  • Immagini grandi senza bloccare l’interfaccia.
  • Scroll fluido.
  • Assenza di freeze durante chiamate API.
  • Assenza di operazioni pesanti sul main isolate.
  • Consumo RAM ragionevole.
  • Consumo CPU ragionevole.
  • Consumo batteria ragionevole.
  • Nessuna crescita anomala della memoria dopo uso prolungato.

Eseguire queste verifiche utilizzando una build Release/Profile e non solamente Debug perché i sistemi hanno una gestione diversa su in debug o release mode.

15. Error handling

  • Nessun errore mostra stack trace all’utente.
  • Errori API hanno messaggi comprensibili.
  • Errori non recuperabili hanno una schermata/stato coerente.
  • Pulsanti Retry funzionano.
  • Loading indicator viene sempre rimosso.
  • Non esistono schermate bloccate permanentemente in loading.
  • Flutter error non gestiti vengono registrati dal sistema di crash reporting.
  • Errori async non gestiti vengono registrati.
  • Errori del codice nativo Android/iOS vengono registrati.

16. Crash reporting e analytics

Se utilizzati strumenti come Firebase Crashlytics o Sentry:

  • Verificare che gli eventi arrivino dall’ambiente di produzione.
  • Generare un crash di test.
  • Controllare simbolicazione degli stack trace.
  • Verificare dSYM iOS.
  • Verificare mapping/deobfuscation Android.
  • Controllare versione/build associata al crash.
  • Verificare gli eventi analytics principali.
  • Controllare che analytics non raccolga dati personali non previsti.
  • Evitare eventi duplicati.

17. Android specifico

  • Test su almeno una versione Android relativamente vecchia ancora supportata.
  • Test sull’ultima versione Android supportata.
  • Test su dispositivo fisico.
  • Back button.
  • Gesture navigation.
  • Notification channels.
  • Runtime permissions.
  • App Links.
  • Condivisione verso l’app.
  • Condivisione dall’app.
  • Apertura tramite intent.
  • Installazione tramite bundle equivalente alla distribuzione Play Store.
  • Verificare applicationId.
  • Verificare signing Release.
  • Verificare minSdk, targetSdk e compileSdk.
  • Verificare icona launcher.
  • Verificare nome app.
  • Verificare splash screen.
  • Verificare adaptive icon.

18. iOS specifico

  • Test su almeno una versione iOS relativamente vecchia ancora supportata.
  • Test sull’ultima versione iOS supportata.
  • Test su iPhone fisico.
  • Gesture back.
  • Safe Area.
  • Dynamic Island/notch.
  • Push APNs.
  • Universal Links.
  • Sign in with Apple, se presente.
  • Condivisione.
  • Apertura tramite URL Scheme.
  • Verificare Bundle Identifier.
  • Verificare provisioning profile.
  • Verificare certificati.
  • Verificare icona.
  • Verificare splash screen.
  • Verificare stringhe di spiegazione dei permessi in Info.plist.
  • Testare una build distribuita tramite TestFlight.

19. Sicurezza

  • Nessuna password salvata in chiaro.
  • Nessun access token nei log.
  • Nessuna API key privata inserita impropriamente nel client.
  • HTTPS utilizzato per le comunicazioni sensibili.
  • Sessione invalidata correttamente al logout.
  • Dati appartenenti ad altri utenti non accessibili modificando ID lato client.
  • Endpoint protetti realmente lato server.
  • Input potenzialmente malevoli non causano comportamenti inattesi.
  • Dati sensibili non finiscono negli analytics.
  • Clipboard utilizzata con cautela per informazioni sensibili.
  • Screenshot/app switcher non espongono schermate sensibili, se questo è un requisito dell’app.

20. Store e distribuzione

Google Play

  • AAB Release generato correttamente.
  • Signing corretto.
  • Version Code incrementato.
  • Version Name corretta.
  • Target API compatibile con i requisiti Play.
  • Data Safety aggiornata.
  • Permessi dichiarati coerenti con l’utilizzo reale.
  • Screenshot aggiornati, se necessario.
  • Release notes corrette.
  • Test tramite Internal/Closed Testing.

App Store

  • Archive Release corretto.
  • Bundle ID corretto.
  • Build Number incrementato.
  • Marketing Version corretta.
  • Signing corretto.
  • Privacy Manifest/configurazioni privacy corretti.
  • Descrizioni dei permessi corrette.
  • App Privacy aggiornata.
  • Screenshot aggiornati, se necessario.
  • Release notes corrette.
  • Test tramite TestFlight.

21. Smoke test sulla build realmente candidata alla pubblicazione

La build verificata deve essere esattamente quella che verrà pubblicata.

  • Installare la Release Candidate Android dal canale di testing Play.
  • Installare la Release Candidate iOS da TestFlight.
  • Login.
  • Eseguire il flusso principale.
  • Eseguire almeno una scrittura verso il backend.
  • Verificare notifiche/deep link.
  • Chiudere e riaprire l’app.
  • Logout.
  • Controllare crash reporting e log server.
  • Confermare numero di versione e build visualizzati/installati.

Criterio minimo di go/no-go

Non pubblicare se esiste almeno uno di questi problemi:

  • Crash riproducibile in un flusso principale.
  • Perdita o corruzione dei dati.
  • Login/logout non affidabile.
  • Migrazione dalla versione precedente non funzionante.
  • Pagamento non affidabile.
  • Problema di sicurezza noto.
  • Funzionalità principale inutilizzabile.
  • Backend di produzione configurato in modo errato.
  • Signing/versioning errato.
  • Build candidata diversa da quella effettivamente testata.

Naturalmente questo è un elenco esteso e non tutti questi controlli sono sempre necessari, ma tanti sì (prossimamente scriverò un articolo dove riassumo i testi principali, soprattutto in caso di minor release).