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.