Espresso multiprocesso

Man mano che la tua app cresce, potrebbe essere utile inserire alcuni dei suoi componenti in un processo diverso da quello principale. Per testare i componenti dell'app in questi processi non predefiniti, puoi utilizzare la funzionalità di Espresso multiprocesso. Questo strumento, disponibile su Android 8.0 (livello API 26) e versioni successive, ti consente di testare senza problemi le interazioni dell'interfaccia utente della tua app che superano i limiti del processo dell'app mantenendo le garanzie di sincronizzazione di Espresso.

Quando utilizzi Espresso multiprocesso, tieni presente le seguenti considerazioni relative al controllo delle versioni e all'ambito:

  • La tua app deve avere come target Android 8.0 (livello API 26) o versioni successive.
  • Lo strumento può testare solo i componenti dell'app che includi nei processi all'interno del pacchetto dell'app. Non può testare processi esterni.

Utilizzare lo strumento

Per testare un processo all'interno dell'app utilizzando Espresso multiprocesso, aggiungi un riferimento all'artefatto espresso-remote nel file build.gradle dell'app:

app/build.gradle

Groovy

dependencies {
    ...
    androidTestImplementation 'androidx.test.espresso:espresso-remote:3.6.1'
}

Kotlin

dependencies {
    ...
    androidTestImplementation('androidx.test.espresso:espresso-remote:3.6.1')
}

Devi anche aggiungere quanto segue al manifest androidTest della tua app:

  • Un elemento <instrumentation> che definisce il processo.
  • Un elemento <meta-data> che indica che vuoi utilizzare Espresso multiprocesso.

Il seguente snippet di codice mostra come aggiungere questi elementi:

src/androidTest/AndroidManifest.xml

<manifest ... package="androidx.test.mytestapp.tests">
  <uses-sdk android:targetSdkVersion="27" android:minSdkVersion="14" />
  <instrumentation
    android:name="androidx.test.runner.AndroidJUnitRunner"
    android:targetPackage="androidx.test.mytestapp"
    android:targetProcesses="*">
    <meta-data
      android:name="remoteMethod"
      android:value="androidx.test.espresso.remote.EspressoRemote#remoteInit" />
  </instrumentation>
</manifest>

Lo snippet precedente indica al framework Android che vuoi testare ogni processo nel pacchetto della tua app. Se vuoi testare solo un sottoinsieme dei processi della tua app, puoi specificare un elenco separato da virgole all'interno dell'elemento targetProcesses:

<instrumentation
    ...
    android:targetProcesses=
            "androidx.test.mytestapp:myFirstAppProcessToTest,
             androidx.test.mytestapp:mySecondAppProcessToTest" ... />

Comprendere l'architettura dello strumento

Quando testi la tua app e avvii il relativo processo predefinito, potresti eseguire un'interazione dell'interfaccia utente, ad esempio la pressione di un pulsante, che avvia un'attività in un processo secondario. Il sistema completa quindi i seguenti passaggi per attivare i test tra processi utilizzando Espresso:

  1. Android Framework crea e avvia un nuovo processo per seguire la struttura di navigazione dell'app. Ogni processo Instrumentation include una nuova istanza di AndroidJUnitRunner. In questa fase, i due processi di strumentazione non possono comunicare tra loro.
  2. Ogni istanza AndroidJUnitRunner registra Espresso come framework di test.
  3. Le due istanze di AndroidJUnitRunner eseguono un handshake per stabilire una connessione tra loro. Allo stesso tempo, ogni istanza di AndroidJUnitRunner connette tutti i client registrati come Espresso con le rispettive controparti in altri processi, in modo che questi client possano formare un canale di comunicazione diretto tra loro.
  4. Ogni istanza di AndroidJUnitRunner continua a cercare istanze di strumentazione e client del framework di test appena aggiunti, stabilendo canali di comunicazione aggiuntivi in base alle necessità.

La figura 1 illustra il risultato di questo processo:

Figura 1. Stabilire la comunicazione tra più processi di strumentazione utilizzando Espresso multiprocesso

Risorse aggiuntive

Per ulteriori informazioni su questo argomento, consulta le seguenti risorse.