Strategie Robolectric

Robolectric è un framework open source gestito da Google che consente di eseguire test in un ambiente Android simulato all'interno di una JVM, senza l'overhead e l'instabilità di un emulatore. Supporta tutte le versioni di Android da Lollipop (livello API 21).

Molti progetti di grandi dimensioni utilizzano Robolectric per aumentare la velocità e l'affidabilità dei test e ridurre le spese associate all'esecuzione di test su dispositivi reali o emulatori. Sono incluse la maggior parte delle app Google che si basano molto su Robolectric.

Robolectric non sostituisce completamente un emulatore perché non supporta tutte le funzionalità e le API. Ad esempio, Robolectric non ha uno schermo come un emulatore e alcune API sono supportate solo parzialmente. Tuttavia, emula parti sufficienti di Android per eseguire in modo affidabile i test delle unità e la maggior parte dei test dell'interfaccia utente.

Strategie di test

Con Robolectric puoi adottare due tipi di strategie di test: test di unità e test dell'interfaccia utente.

Test delle unità

Robolectric è stato concepito come un modo per abilitare i "test di unità" nelle app per Android. Ad esempio, puoi simulare il lancio di un'attività e testarne la logica chiamando tutti i metodi del ciclo di vita.

Puoi anche utilizzare i falsi di Robolectric (chiamati ombre) come dipendenze per i test di unità. Ad esempio, se il corso utilizza un bundle o devi simulare una connessione Bluetooth.

In generale, se implementi un'architettura testabile, non dovresti dover utilizzare Robolectric per i test di unità, in quanto il codice deve essere testabile in isolamento, senza dipendenze dal framework Android.

Test dell'interfaccia utente

Robolectric può anche eseguire test dell'interfaccia utente, come i test Espresso o Compose. Puoi convertire un test strumentato in Robolectric spostandolo nell'insieme di origini test e configurando le dipendenze Robolectric.

android {
  testOptions {
    unitTests {
      isIncludeAndroidResources = true
    }
  }
}

dependencies {
  testImplementation("junit:junit:4.13.2")
  testImplementation("org.robolectric:robolectric:4.13")
}

Qualsiasi test dell'interfaccia utente presente nel set di origine test viene eseguito con Robolectric.

import androidx.test.espresso.Espresso.onView

@RunWith(AndroidJUnit4::class)
class AddContactActivityTest {
    @Test
    fun inputTextShouldBeRetainedAfterActivityRecreation() {
        // GIVEN
        val contactName = "Test User"
        val scenario = ActivityScenario.launchActivity<AddContactActivity>()

        // WHEN
        // Enter contact name
        onView(withId(R.id.contact_name_text))
            .perform(typeText(contactName))
        // Destroy and recreate Activity
        scenario.recreate()

        // THEN
        // Check contact name was preserved.
        onView(withId(R.id.contact_name_text))
            .check(matches(withText(contactName)))
     }
}

La maggior parte dei test dell'interfaccia utente non interagisce con il framework e puoi eseguirli su Robolectric. Puoi eseguire test di comportamento su Robolectric perché la fedeltà necessaria è più che sufficiente. Ad esempio, quando un test di composizione verifica che l'UI sia cambiata dopo aver fatto clic su un pulsante.

Puoi eseguire altri test dell'interfaccia utente con Robolectric, ad esempio i test degli screenshot. Tuttavia, la fedeltà è inferiore perché i diversi dispositivi visualizzano le schermate in modo leggermente diverso.

Devi decidere se l'implementazione di Robolectric è sufficiente per ogni caso d'uso, ma ecco alcuni consigli:

  • Utilizza Robolectric per test del comportamento dell'interfaccia utente isolati per test di componenti, funzionalità o applicazioni. In genere, questi test controllano la gestione dello stato e il comportamento delle UI e non interagiscono con le dipendenze esterne.
  • Utilizza Robolectric per acquisire screenshot quando la precisione dei pixel non è fondamentale. Ad esempio, per testare come un componente reagisce a dimensioni dei caratteri o temi diversi.

Nota: Robolectric può acquisire screenshot in modo nativo, ma hai bisogno di una libreria di terze parti per eseguire test di screenshot.

Test Robolectric e test del dispositivo

In sintesi, Robolectric offre una fedeltà sufficiente per eseguire la maggior parte dei test dell'interfaccia utente, ma in alcuni casi saranno comunque necessari test del dispositivo, ad esempio quelli relativi all'interfaccia utente di sistema come il formato edge-to-edge o il Picture in Picture oppure quando si fanno affidamento su funzionalità non supportate, come WebView.