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 seu 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. É possível
converter um teste instrumentado para o 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 é possível executá-los no Robolectric. Você pode 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.
Você pode executar outros testes de interface 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 do Robolectric é boa o suficiente para cada caso de uso, mas veja 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 exigirão testes do dispositivo, como aqueles relacionados à interface do sistema,
como de ponta a ponta ou picture-in-picture, ou ao depender de recursos
sem suporte, como WebView
.