Espresso multiprocessus

À mesure que votre application se développe, vous pouvez trouver utile de placer certains de ses composants dans un processus autre que le processus principal de votre application. Pour tester les composants d'application dans ces processus non définis par défaut, vous pouvez utiliser la fonctionnalité Multiprocess Espresso. Cet outil, disponible sur Android 8.0 (niveau d'API 26) et versions ultérieures, vous permet de tester facilement les interactions de l'interface utilisateur de votre application qui franchissent les limites de processus de votre application tout en conservant les garanties de synchronisation d'Espresso.

Lorsque vous utilisez Multiprocess Espresso, gardez à l'esprit les points suivants concernant le versionnage et le champ d'application :

  • Votre application doit cibler Android 8.0 (niveau d'API 26) ou version ultérieure.
  • L'outil ne peut tester que les composants d'application que vous incluez dans les processus du package de votre application. Il ne peut pas tester les processus externes.

Utiliser l'outil

Pour tester un processus dans votre application à l'aide de Multiprocess Espresso, ajoutez une référence à l'artefact espresso-remote dans le fichier build.gradle de votre application :

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

Vous devez également ajouter les éléments suivants au fichier manifeste androidTest de votre application :

  • Élément <instrumentation> qui définit le processus.
  • Un élément <meta-data> indiquant que vous souhaitez utiliser Multiprocess Espresso.

L'extrait de code suivant montre comment ajouter ces éléments :

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>

L'extrait précédent indique au framework Android que vous souhaitez qu'il teste chaque processus du package de votre application. Si vous ne souhaitez tester qu'un sous-ensemble des processus de votre application, vous pouvez spécifier une liste séparée par des virgules dans l'élément targetProcesses :

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

Comprendre l'architecture de l'outil

Lorsque vous testez votre application et lancez son processus par défaut, vous pouvez effectuer une interaction d'UI, comme appuyer sur un bouton, qui démarre une activité dans un processus secondaire. Le système effectue ensuite les étapes suivantes pour activer les tests multiprocessus à l'aide d'Espresso :

  1. Le framework Android crée et démarre un nouveau processus pour suivre la structure de navigation de votre application. Chaque processus Instrumentation inclut une nouvelle instance de AndroidJUnitRunner. À ce stade, les deux processus d'instrumentation ne peuvent pas communiquer entre eux.
  2. Chaque instance AndroidJUnitRunner enregistre Espresso comme framework de test.
  3. Les deux instances de AndroidJUnitRunner effectuent un handshake pour établir une connexion entre elles. En même temps, chaque instance AndroidJUnitRunner connecte tous les clients enregistrés, comme Espresso, à leurs homologues respectifs dans d'autres processus afin que ces clients puissent former un canal de communication direct entre eux.
  4. Chaque instance AndroidJUnitRunner continue de rechercher les instances d'instrumentation et les clients du framework de test nouvellement ajoutés, et établit des canaux de communication supplémentaires si nécessaire.

La figure 1 illustre le résultat de ce processus :

Figure 1. Établir la communication entre plusieurs processus d'instrumentation à l'aide de Multiprocess Espresso

Ressources supplémentaires

Pour en savoir plus sur ce sujet, consultez les ressources suivantes.