Multiprocess Espresso

À medida que o app cresce, pode ser útil colocar alguns componentes dele em outro processo que não o principal do app. Para testar os componentes do app nesses processos não padrão, use a funcionalidade Multiprocess Espresso. Essa ferramenta, disponível no Android 8.0 (API nível 26) e posterior, permite testar tranquilamente as interações da IU que ultrapassam os limites do processo do app, sem perder as garantias de sincronização do Espresso.

Ao usar o Multiprocess Espresso, lembre-se das seguintes considerações sobre controle de versões e escopo:

  • O app precisa segmentar o Android 8.0 (API nível 26) ou posterior.
  • A ferramenta só pode testar os componentes do app que você inclui nos processos dentro do pacote dele. Ela não pode testar processos externos.

Usar a ferramenta

Para testar um processo no app usando o Multiprocess Espresso, adicione uma referência ao artefato espresso-remote no arquivo build.gradle do app:

app/build.gradle

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

Também é necessário adicionar o seguinte ao manifesto androidTest do app:

  • Um elemento <instrumentation> que define o processo.
  • Um elemento <meta-data> que indica o uso do Multiprocess Espresso.

O snippet de código a seguir mostra como adicionar esses elementos:

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>
    

O snippet anterior indica para o framework do Android que você quer que ele teste todos os processos no pacote do app. Para testar apenas um subconjunto dos processos do app, especifique uma lista separada por vírgulas no elemento targetProcesses:

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

Compreender a arquitetura da ferramenta

Ao testar seu app e iniciar o processo padrão, você pode realizar uma interação da IU, como o pressionamento de um botão, que inicia uma atividade em um processo secundário. O sistema conclui as seguintes etapas para ativar o teste entre processos usando o Espresso:

  1. O framework do Android cria e inicia um novo processo para seguir a estrutura de navegação do app. Cada processo de Instrumentation inclui uma nova instância de AndroidJUnitRunner. Nesta fase, os dois processos de instrumentação não podem se comunicar entre si.
  2. Cada instância de AndroidJUnitRunner registra o Espresso como o framework de teste.
  3. As duas instâncias de AndroidJUnitRunner realizam um handshake para estabelecer uma conexão entre si. Ao mesmo tempo, cada instância de AndroidJUnitRunner conecta todos os clientes registrados, como o Espresso, com os respectivos correspondentes em outros processos. Assim, esses clientes podem formar um canal de comunicação direta entre si.
  4. Cada instância de AndroidJUnitRunner continua procurando instâncias de instrumentação recém-adicionadas e clientes do framework de teste, estabelecendo outros canais de comunicação, conforme necessário.

A Figura 1 ilustra o resultado desse processo:

Figure 1. Como estabelecer comunicação entre vários processos de instrumentação usando o Multiprocess Espresso.

Outros recursos

Para saber mais sobre esse assunto, consulte os recursos a seguir.