Espresso multiprocesso

Man mano che la tua app cresce, potrebbe essere utile posizionare alcuni dei componenti dell'app in una procedura diversa da quella principale dell'app. Per testare i componenti dell'app in questi processi non predefiniti, puoi utilizzare la funzionalità Multiprocess Espresso. Questo strumento, disponibile su Android 8.0 (livello API 26) e versioni successive, ti consente testare senza problemi le interazioni dell'interfaccia utente che si intersecano tra i vari processi confini pur mantenendo le garanzie di sincronizzazione di Espresso.

Quando utilizzi Multiprocess Espresso, mantieni il controllo delle versioni e l'ambito seguenti considerazioni in merito:

  • 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 pacchetto dell'app. Non può testare processi esterni.

Utilizzare lo strumento

Per testare un processo all'interno della tua app utilizzando Multiprocess Espresso, aggiungi un riferimento all'elemento espresso-remote nel file build.gradle dell'app:

app/build.gradle

Alla moda

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 file manifest androidTest dell'app:

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

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 a ogni processo nel pacchetto dell'app. Se vuoi testare solo un sottoinsieme dei tuoi processi dell'app, puoi specificare un elenco separato da virgole all'interno targetProcesses elemento:

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

Comprendere l'architettura dello strumento

Quando testi la tua app e avvii il processo predefinito, potresti eseguire una UI un'interazione, ad esempio la pressione di un pulsante, che avvia un'attività in un e il processo di sviluppo. Il sistema completa quindi i seguenti passaggi per abilitare il cross-process usando Espresso:

  1. Il framework Android crea e avvia una nuova procedura per seguire le struttura di navigazione. Ogni processo Instrumentation include una nuova istanza AndroidJUnitRunner In questa fase, i due processi di strumentazione non possono comunicare tra loro e l'altro.
  2. Ciascuna AndroidJUnitRunner dell'istanza registra Espresso come framework di test.
  3. Le due istanze AndroidJUnitRunner eseguire un handshake per stabilire una connessione tra loro. Uguale volta, ogni AndroidJUnitRunner connette tutti i clienti registrati, come Espresso, ai rispettivi in altri processi, in modo che questi clienti possano canale di comunicazione tra di loro.
  4. Ogni AndroidJUnitRunner continua a cercare istanze di strumentazione e test del framework di riferimento, stabilendo ulteriori canali di comunicazione in base alle necessità.

La Figura 1 illustra il risultato di questo processo:

Figura 1. Instaurare una comunicazione tra più di strumentazione con Multiprocess Espresso
.

Risorse aggiuntive

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