Le attività fungono da contenitori per ogni interazione utente all'interno dell'app, è importante verificare il comportamento delle attività dell'app a livello di dispositivo eventi come i seguenti:
- Un'altra app, come l'app Telefono del dispositivo, interrompe l'attività dell'app.
- Il sistema distrugge e ricrea la tua attività.
- L'utente inserisce la tua attività in un nuovo ambiente di windowing, ad esempio Picture in picture (PIP) o multi-finestra.
In particolare, è importante garantire che la tua attività si comporti correttamente in in risposta agli eventi descritti in L'attività del ciclo di vita.
Questa guida descrive come valutare la capacità della tua app di conservare i dati integrità e una buona esperienza utente durante la transizione delle attività della tua app in diversi stati del loro ciclo di vita.
Guida lo stato di un'attività
Un aspetto chiave del test delle attività dell'app riguarda il posizionamento
attività in determinati stati. Per definire questo "dato" dei test, utilizza
di ActivityScenario
,
parte del
nella libreria di AndroidX Test. Con questo corso, puoi
posizionare la tua attività in stati che simulano eventi a livello di dispositivo.
ActivityScenario
è un'API multipiattaforma che puoi utilizzare per i test delle unità locali
e test di integrazione on-device. Su un dispositivo reale o virtuale,
ActivityScenario
offre la sicurezza dei thread, sincronizzando gli eventi tra
il thread di strumenti di test e il thread che esegue l'attività in fase di test.
L'API è particolarmente adatta per valutare come un'attività in si comporta quando viene eliminato o creato. Questa sezione illustra le e i casi d'uso associati a questa API.
Crea un'attività
Per creare l'attività da testare, aggiungi il codice visualizzato nello snippet seguente:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { } } }
Dopo aver creato l'attività, ActivityScenario
la trasferisce all'attività
Stato RESUMED
. Questo stato indica che l'attività è in esecuzione ed è
visibili agli utenti. In questo stato, puoi interagire con i dati della tua attività
Elementi View
che utilizzano i test dell'interfaccia utente di Espresso.
Google consiglia di chiamare close
nell'attività durante il test
vengono completate. In questo modo vengono ripulite le risorse associate e
la stabilità dei test. ActivityScenario
implementa Closeable
, così puoi
Applicare l'estensione use
o try-with-resources
nella programmazione Java
lingua, in modo che l'attività si chiuda automaticamente.
In alternativa, puoi utilizzare ActivityScenarioRule
per chiamare automaticamente
ActivityScenario.launch
prima di ogni test e ActivityScenario.close
durante lo smontaggio del test. L'esempio seguente mostra come definire una regola e ottenere un
di uno scenario:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>() @Test fun testEvent() { val scenario = activityScenarioRule.scenario } }
Porta l'attività in un nuovo stato
Per impostare uno stato diverso per l'attività, ad esempio CREATED
o STARTED
, chiama
moveToState()
. Questa azione simula una situazione in cui la tua attività viene
arrestato o in pausa, rispettivamente, perché è interrotto da un'altra app o da un
un'azione di sistema.
Nel seguente snippet di codice è riportato un esempio di utilizzo di moveToState()
:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.moveToState(State.CREATED) } } }
Determina lo stato dell'attività attuale
Per determinare lo stato corrente di un'attività da testare, ottieni il valore del
Campo state
all'interno dell'oggetto ActivityScenario
. È particolarmente utile
per controllare lo stato di un'attività sottoposta a test se l'attività reindirizza a
un'altra attività o termina automaticamente, come dimostrato nel seguente codice
snippet:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.onActivity { activity -> startActivity(Intent(activity, MyOtherActivity::class.java)) } val originalActivityState = scenario.state } } }
Ricrea l'attività
Quando un dispositivo sta per esaurire le risorse, il sistema potrebbe eliminare un'attività,
richiedere all'app di ricreare l'attività quando l'utente torna nell'app.
Per simulare queste condizioni, chiama recreate()
:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.recreate() } } }
La classe ActivityScenario
mantiene lo stato dell'istanza salvato dell'attività e
qualsiasi oggetto annotato utilizzando @NonConfigurationInstance
. Questi oggetti vengono caricati
alla nuova istanza dell'attività sottoposta a test.
Recupera i risultati delle attività
Per ottenere il codice risultato o i dati associati a un'attività terminata, ottieni il
del campo result
all'interno dell'oggetto ActivityScenario
, come mostrato in
il seguente snippet di codice:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testResult() { launchActivity<MyActivity>().use { onView(withId(R.id.finish_button)).perform(click()) // Activity under test is now finished. val resultCode = scenario.result.resultCode val resultData = scenario.result.resultData } } }
Attiva azioni nell'attività
Tutti i metodi in ActivityScenario
bloccano le chiamate, pertanto l'API richiede
di eseguirli nel thread della strumentazione.
Per attivare le azioni nell'attività in fase di test, usa i matcher della vista Espresso per interagire con gli elementi visualizzati:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { onView(withId(R.id.refresh)).perform(click()) } } }
Se è necessario chiamare un metodo sull'attività stessa, puoi farlo
in modo sicuro implementando ActivityAction
:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.onActivity { activity -> activity.handleSwipeToRefresh() } } } }