Testare le attività dell'app

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()
            }
        }
    }
}