Man mano che l'app cresce, potresti trovare utile inserire alcuni componenti dell'app in un processo diverso da quello principale dell'app. Per testare i componenti dell'app in questi processi non predefiniti, puoi utilizzare la funzionalità di Multiprocess Espresso. Questo strumento, disponibile su Android 8.0 (livello API 26) e versioni successive, ti consente di testare senza interruzioni le interazioni con la UI della tua app che superano i confini dei processi dell'app, mantenendo al contempo le garanzie di sincronizzazione di Espresso.
Quando utilizzi Multiprocess Espresso, 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 della tua app utilizzando Multiprocess Espresso, aggiungi un riferimento all'elemento espresso-remote nel file build.gradle
dell'app:
app/build.gradle
Trendy
dependencies { ... androidTestImplementation 'androidx.test.espresso:espresso-remote:3.6.1' }
Kotlin
dependencies { ... androidTestImplementation('androidx.test.espresso:espresso-remote:3.6.1') }
Devi inoltre 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 deve testare ogni processo nel pacchetto dell'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 processo predefinito, potresti eseguire un'interazione con l'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 consentire i test tra processi utilizzando Espresso:
- Il framework Android crea e avvia una nuova procedura per seguire la struttura di navigazione della tua app. Ogni processo
Instrumentation
include una nuova istanza diAndroidJUnitRunner
. In questa fase, i due processi di strumentazione non possono comunicare tra loro. - Ogni istanza
AndroidJUnitRunner
registra Espresso come framework di test. - Le due istanze di
AndroidJUnitRunner
eseguono un handshake per stabilire una connessione tra loro. Allo stesso tempo, ogni istanzaAndroidJUnitRunner
connette tutti i client registrati, ad esempio Espresso, con le rispettive controparti in altri processi, in modo che questi client possano creare un canale di comunicazione diretto tra loro. - Ogni istanza
AndroidJUnitRunner
continua a cercare istanze di strumentazione appena aggiunte e a testare i client framework, stabilendo ulteriori canali di comunicazione in base alle esigenze.
La figura 1 illustra il risultato di questo processo:
![](https://developer.android.com/static/images/training/testing/multiprocess_espresso.png?authuser=6&hl=it)
Risorse aggiuntive
Per ulteriori informazioni su questo argomento, consulta le seguenti risorse.
- Video della sessione Test-Based Development on Android with the Android Testing Support Library da Google I/O 2017, con inizio alle ore 36:41.