Questa pagina descrive i principi fondamentali dei test delle app Android, incluse le best practice principali e i relativi vantaggi.
Vantaggi dei test
I test sono parte integrante del processo di sviluppo dell'app. Eseguendo test costanti sulla tua app, puoi verificarne la correttezza, il comportamento funzionale e l'usabilità prima di rilasciarla pubblicamente.
Puoi testare la tua app manualmente navigando al suo interno. Potresti utilizzare dispositivi ed emulatori diversi, cambiare la lingua di sistema e provare a generare ogni errore dell'utente o a percorrere ogni flusso utente.
Tuttavia, i test manuali non sono scalabili e può essere facile trascurare le regressioni nel comportamento dell'app. I test automatici prevedono l'utilizzo di strumenti che eseguono i test per te, il che è più veloce, più ripetibile e in genere ti fornisce feedback più utili sulla tua app nelle prime fasi del processo di sviluppo.
Tipi di test in Android
Le applicazioni mobile sono complesse e devono funzionare bene in molti ambienti. Pertanto, esistono molti tipi di test.
Oggetto
Ad esempio, esistono diversi tipi di test a seconda dell'oggetto:
- Test funzionali: la mia app fa quello che dovrebbe fare?
- Test delle prestazioni: lo fa in modo rapido ed efficiente?
- Test di accessibilità: funziona bene con i servizi di accessibilità?
- Test di compatibilità: funziona bene su ogni dispositivo e livello API?
Ambito
I test variano anche a seconda delle dimensioni o del grado di isolamento:
- I test delle unità o test di piccole dimensioni verificano solo una parte molto piccola dell'app, ad esempio un metodo o una classe.
- I test end-to-end o test di grandi dimensioni verificano parti più grandi dell'app contemporaneamente, ad esempio un'intera schermata o un flusso utente.
- I test di medie dimensioni si trovano nel mezzo e controllano l'integrazione tra due o più unità.
Esistono molti modi per classificare i test. Tuttavia, la distinzione più importante per gli sviluppatori di app è la posizione in cui vengono eseguiti i test.
Test strumentali e test locali
Puoi eseguire i test su un dispositivo Android o su un altro computer:
- I test strumentali vengono eseguiti su un dispositivo Android, fisico o emulato. L'app viene creata e installata insieme a un'app di test che inserisce comandi e legge lo stato. I test strumentali sono in genere test dell'UI, che avviano un'app e poi interagiscono con essa.
- I test locali vengono eseguiti sulla macchina di sviluppo o su un server, quindi vengono chiamati anche test lato host. Di solito sono piccoli e veloci e isolano l'oggetto in fase di test dal resto dell'app.
Non tutti i test delle unità sono locali e non tutti i test end-to-end vengono eseguiti su un dispositivo. Ad esempio:
- Test locali di grandi dimensioni: puoi utilizzare un simulatore Android che viene eseguito localmente, ad esempio Robolectric.
- Test strumentali di piccole dimensioni: puoi verificare che il codice funzioni correttamente con una funzionalità del framework, ad esempio un database SQLite. Potresti eseguire questo test su più dispositivi per verificare l'integrazione con più versioni di SQLite.
Esempi
I seguenti snippet mostrano come interagire con l'UI in un test dell'UI strumentale che fa clic su un elemento e verifica che venga visualizzato un altro elemento.
Espresso
// When the Continue button is clicked
onView(withText("Continue"))
.perform(click())
// Then the Welcome screen is displayed
onView(withText("Welcome"))
.check(matches(isDisplayed()))
UI di Compose
// When the Continue button is clicked
composeTestRule.onNodeWithText("Continue").performClick()
// Then the Welcome screen is displayed
composeTestRule.onNodeWithText("Welcome").assertIsDisplayed()
Questo snippet mostra una parte di un test delle unità per un ViewModel (test locale lato host):
// Given an instance of MyViewModel
val viewModel = MyViewModel(myFakeDataRepository)
// When data is loaded
viewModel.loadData()
// Then it should be exposing data
assertTrue(viewModel.data != null)
Architettura testabile
Con un'architettura dell'app testabile, il codice segue una struttura che ti consente di testare facilmente diverse parti in isolamento. Le architetture testabili presentano altri vantaggi, come una migliore leggibilità, manutenibilità, scalabilità e riutilizzabilità.
Un'architettura non testabile produce quanto segue:
- Test più grandi, più lenti e più instabili. Le classi che non possono essere sottoposte a test delle unità potrebbero dover essere coperte da test di integrazione o test dell'UI più grandi.
- Meno opportunità per testare scenari diversi. I test più grandi sono più lenti, quindi testare tutti i possibili stati di un'app potrebbe non essere realistico.
Per saperne di più sulle linee guida per l'architettura, consulta la guida all'architettura delle app.
Approcci al disaccoppiamento
Se puoi estrarre una parte di una funzione, una classe o un modulo dal resto, il test è più semplice ed efficace. Questa pratica è nota come disaccoppiamento ed è il concetto più importante per l'architettura testabile.
Le tecniche di disaccoppiamento comuni includono le seguenti:
- Dividi un'app in livelli come Presentazione, Dominio e Dati. Puoi anche dividere un'app in moduli, uno per funzionalità.
- Evita di aggiungere logica alle entità con dipendenze di grandi dimensioni, come attività e fragment. Utilizza queste classi come punti di ingresso nel framework e sposta la logica di business e dell'UI altrove, ad esempio in un elemento componibile, un ViewModel o un livello di dominio.
- Evita le dipendenze dirette dal framework nelle classi contenenti logica di business. Ad esempio, non utilizzare i contesti Android in ViewModel.
- Semplifica la sostituzione delle dipendenze. Ad esempio, utilizza le interfacce anziché le implementazioni concrete. Utilizza l'iniezione delle dipendenze anche se non utilizzi un framework di iniezione delle dipendenze.
Passaggi successivi
Ora che sai perché dovresti eseguire i test e i due tipi principali di test, puoi leggere Cosa testare o scoprire di più sulle strategie di test
In alternativa, se vuoi creare il tuo primo test e imparare facendo, consulta i codelab sui test.