Estrategias de Robolectric

Robolectric es un framework de código abierto mantenido por Google que te permite ejecutar pruebas en un entorno simulado de Android dentro de una JVM, sin la sobrecarga ni la inestabilidad de un emulador. Es compatible con todas las versiones de Android a partir de Lollipop (nivel de API 21).

Muchos proyectos grandes usan Robolectric para aumentar la velocidad y la confiabilidad de sus pruebas, y reducir los gastos asociados con la ejecución de pruebas en dispositivos reales o emuladores. Esto incluye la mayoría de las apps de Google que dependen en gran medida de Robolectric.

Robolectric no reemplaza por completo a un emulador, ya que no es compatible con todas las funciones ni APIs. Por ejemplo, Robolectric no tiene una pantalla como un emulador, y algunas APIs solo son compatibles de forma parcial. Sin embargo, emula suficientes partes de Android para ejecutar pruebas de unidades y la mayoría de las pruebas de IU de manera confiable.

Estrategias de prueba

Hay dos tipos de estrategias de prueba que puedes implementar con Robolectric: pruebas de unidades y pruebas de IU.

Pruebas de unidades

Robolectric se concibió como una forma de habilitar la "prueba de unidades" en las apps para Android. Por ejemplo, puedes simular el inicio de una actividad y probar la lógica en su interior llamando a todos los métodos del ciclo de vida.

También puedes usar las simulaciones de Robolectric (llamadas sombras) como dependencias para las pruebas de unidad. Por ejemplo, si tu clase usa un paquete o necesitas falsificar una conexión Bluetooth.

En general, si implementas una arquitectura que se pueda probar, no deberías necesitar usar Robolectric para las pruebas de unidades, ya que tu código debería poder probarse de forma aislada, sin dependencias en el framework de Android.

Pruebas de IU

Robolectric también puede ejecutar pruebas de IU, como pruebas de Espresso o Compose. Para convertir una prueba instrumentada en Robolectric, muévela al conjunto de orígenes test y configura las dependencias de Robolectric.

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

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

Cualquier prueba de IU presente en el conjunto de orígenes test se ejecuta con 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)))
     }
}

La mayoría de las pruebas de IU no interactúan con el framework y puedes ejecutarlas en Robolectric. Puedes ejecutar pruebas de comportamiento en Robolectric, ya que la fidelidad necesaria para ello es más que suficiente. Por ejemplo, cuando una prueba de Compose verifica que la IU cambió después de hacer clic en un botón.

Puedes ejecutar otras pruebas de IU con Robolectric, como las pruebas de capturas de pantalla. Sin embargo, la fidelidad es menor, ya que los diferentes dispositivos renderizan las pantallas de forma ligeramente diferente.

Debes decidir si la implementación de Robolectric es lo suficientemente buena para cada caso de uso, pero aquí tienes algunas recomendaciones:

  • Usa Robolectric para pruebas de comportamiento de IU aisladas en pruebas de componentes, funciones o aplicaciones. En general, estas pruebas verifican la administración del estado y el comportamiento de las IU, y no interactúan con dependencias externas.
  • Usa Robolectric para tomar capturas de pantalla cuando la precisión de píxeles no sea fundamental. Por ejemplo, para probar cómo reacciona un componente a diferentes tamaños de fuente o temas.

Nota: Robolectric puede tomar capturas de pantalla de forma nativa, pero necesitas una biblioteca de terceros para realizar pruebas de capturas de pantalla con ella.

Robolectric en comparación con las pruebas de dispositivos

En resumen, Robolectric proporciona suficiente fidelidad para ejecutar la mayoría de las pruebas de IU, pero algunos casos aún requerirán pruebas de dispositivos, por ejemplo, aquellas relacionadas con la IU del sistema, como de borde a borde o pantalla en pantalla, o cuando se dependen de funciones que no son compatibles, como WebView.