Estratégias da Robolectric

O Robolectric é um framework de código aberto mantido pelo Google que permite executar testes em um ambiente simulado do Android em uma JVM, sem a sobrecarga e a instabilidade de um emulador. Ele oferece suporte a todas as versões do Android desde o Lollipop (nível 21 da API).

Muitos projetos grandes usam o Robolectric para aumentar a velocidade e a confiabilidade dos testes e reduzir as despesas associadas à execução de testes em dispositivos reais ou emuladores. Isso inclui a maioria dos apps do Google que dependem muito do Robolectric.

O Robolectric não é um substituto completo para um emulador porque não oferece suporte a todos os recursos e APIs. Por exemplo, o Robolectric não tem uma tela como um emulador, e algumas APIs têm suporte apenas parcial. No entanto, ele emula partes suficientes do Android para executar testes de unidade e a maioria dos testes de IU com confiabilidade.

Estratégias de teste

Há dois tipos de estratégias de teste que você pode seguir com o Robolectric: testes de unidade e testes de interface.

Testes de unidade

O Robolectric foi concebido como uma maneira de ativar "testes de unidade" em apps Android. Por exemplo, é possível simular o lançamento de uma atividade e testar a lógica dentro dela, chamando todos os métodos de ciclo de vida.

Também é possível usar as simulações do Robolectric (chamadas de sombras) como dependências para testes de unidade. Por exemplo, se a classe usa um pacote ou se você precisa simular uma conexão Bluetooth.

Em geral, se você implementar uma arquitetura testável, não será necessário usar o Robolectric para testes de unidade, já que o código precisa ser testável de forma isolada, sem dependências no framework do Android.

Como testar a interface

O Robolectric também pode executar testes de interface, como testes do Espresso ou do Compose. Você pode converter um teste instrumentado em Robolectric movendo-o para o conjunto de origem test e configurando as dependências do Robolectric.

android {
  testOptions {
    unitTests {
      isIncludeAndroidResources = true
    }
  }
}

dependencies {
  testImplementation("junit:junit:4.13.2")
  testImplementation("org.robolectric:robolectric:4.13")
}

Qualquer teste de interface presente no conjunto de origem test é executado com o Robolectric.

import androidx.test.espresso.Espresso.onView

@RunWith(AndroidJUnit4::class)
class AddContactActivityTest {
    @Test
    fun inputTextShouldBeRetainedAfterActivityRecreation() {
        // GIVEN
        val contactName = "Test User"
        val scenario = ActivityScenario.launchActivity<AddContactActivity>()

        // WHEN
        // Enter contact name
        onView(withId(R.id.contact_name_text))
            .perform(typeText(contactName))
        // Destroy and recreate Activity
        scenario.recreate()

        // THEN
        // Check contact name was preserved.
        onView(withId(R.id.contact_name_text))
            .check(matches(withText(contactName)))
     }
}

A maioria dos testes de interface não interage com o framework, e você pode executá-los no Robolectric. É possível executar testes de comportamento no Robolectric, porque a fidelidade necessária é mais do que suficiente. Por exemplo, quando um teste do Compose verifica se a interface mudou depois de clicar em um botão.

É possível executar outros testes de IU com o Robolectric, como testes de captura de tela. No entanto, a fidelidade é menor, já que diferentes dispositivos renderizam telas de maneira um pouco diferente.

Você precisa decidir se a implementação da Robolectric é boa o suficiente para cada caso de uso, mas aqui estão algumas recomendações:

  • Use o Robolectric para testes de comportamento isolados da interface para componentes, recursos ou testes de aplicativos. Em geral, esses testes verificam o gerenciamento de estado e o comportamento das interfaces e não interagem com dependências externas.
  • Use o Robolectric para fazer capturas de tela quando a precisão dos pixels não for essencial. Por exemplo, para testar como um componente reage a diferentes tamanhos de fonte ou temas.

Observação: o Robolectric pode fazer capturas de tela de forma nativa, mas você precisa de uma biblioteca de terceiros para realizar testes de captura de tela com ele.

Robolectric e testes de dispositivo

Em resumo, o Robolectric oferece fidelidade suficiente para executar a maioria dos testes de interface, mas alguns casos ainda exigem testes de dispositivo, por exemplo, aqueles relacionados à interface do sistema como de borda a borda ou picture-in-picture, ou quando se depende de recursos sem suporte, como WebView.