Cómo configurar Android Testing en tus proyectos de manera sencilla

| Última modificación: 30 de octubre de 2024 | Tiempo de Lectura: 4 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Para asegurarte de que tus aplicaciones tengan las funcionalidades bien integradas y estén listas para mejorarlas en el futuro, es sumamente importante que realices pruebas. Por eso, te enseñaremos a implementar y configurar el Android Testing en tus proyectos, de una manera sencilla y enfocándonos en la práctica.

¿Qué es Android Testing?

Gracias a las pruebas en Android puedes evaluar la funcionalidad de tu aplicación, asegurándote de que cada parte funcione correctamente de manera independiente y en conjunto. De hecho, existen varios tipos de pruebas, y cada una cumple un rol diferente.

Con los tests no solo detectas errores en el código, sino que también simplificas las futuras mejoras o refactorizaciones, ayudándote a optimizar el desarrollo y minimizando la deuda técnica.

Beneficios de realizar Android Testing

  • Detectas errores rápidamente, especialmente en desarrollos complejos.
  • Simplificas la detección de problemas cuando se agregan nuevas funcionalidades.
  • Mejoras la estabilidad del código y facilitas el proceso de refactorización.
  • Se crea un desarrollo más rápido y con menor deuda técnica.

Tipos de pruebas en Android Testing

Pirámide de Testing

En Android hay varios tipos de pruebas y una forma sencilla de clasificarlas es con la pirámide de testing. Esta pirámide muestra que la mayor parte de las pruebas suelen ser tests unitarios, seguidos de tests de integración y, finalmente, de tests de interfaz de usuario (UI Tests).

  1. Tests unitarios: Estos son la base de las pruebas y permiten verificar el funcionamiento aislado de cada componente o funcionalidad.
  2. Tests de integración: Una vez que los tests unitarios están funcionando, es hora de comprobar que los módulos funcionan bien entre ellos.
  3. UI Tests: Estas pruebas evalúan el funcionamiento de la interfaz gráfica, por ejemplo, verificando que, al pulsar un botón, se abra la pantalla correcta.

¿Cuántos tests se deben hacer?

Puedes distribuirlos así: 70% de tests unitarios, 20% de tests de integración y 10% de UI Tests. Aunque no olvides que esta proporción puede variar dependiendo del proyecto.

Preparando el proyecto Android para Testing

Cuando empieces a realizar tests en Android, tienes que añadir algunas librerías al archivo build.gradle. Estas son las más recomendadas:

testImplementation 'junit:junit:4.+'
testImplementation "io.mockk:mockk:1.12.2"

La primera librería, JUnit, es muy buena para los tests unitarios, mientras que Mockk es una herramienta para crear objetos simulados, conocidos como mocks, que facilitan el testing de funciones dependientes de otros módulos.

¿Qué es un mock?

Un mock es una versión simulada de una clase real. Supón que tienes una función que depende de otra clase para devolver un valor. Con un mock, puedes “falsificar” la respuesta de esa clase, de modo que la función principal siempre reciba el valor deseado para tus pruebas.

Configuración de los directorios de Testing en Android

Android organiza las pruebas en dos directorios principales: Test y AndroidTest.

  • Test: Es el que contiene las pruebas unitarias que no dependen del sistema Android, lo que permite una ejecución rápida.
  • AndroidTest: Almacena pruebas que requieren acceso al framework de Android, como los UI Tests, y necesitan ejecutarse en un emulador o dispositivo físico.

El archivo build.gradle asigna las librerías de testing según el directorio en el que se encuentren:

  • Las librerías que comienzan con testImplementation se usan en el directorio Test
  • Las que inician con androidTestImplementation están destinadas al directorio AndroidTest.

Realizando tests unitarios en los casos de uso

Cuando vayas a hacer los tests en proyectos Android, una buena práctica es agregar los tests a las clases de casos de uso.

Por ejemplo, si tienes una clase GetQuotesUseCase, el archivo de testing se llamará GetQuotesUseCaseTest.

Para crear este archivo de prueba, navega hasta la clase que deseas testear y usa la opción Navigate > Test en el menú superior.

Configuración de los tests

Al crear una clase de test, configúrala para inicializar algunos valores antes de ejecutar cada prueba. Puedes usar las anotaciones @Before y @After para realizar configuraciones previas y limpiezas posteriores, respectivamente.

@Before
fun onBefore() {
MockKAnnotations.init(this)
}

Creando mocks y tests básicos

Una vez configurada la clase de pruebas, crea los mocks de los objetos que tu función necesita para funcionar. Así controlas las respuestas en cada prueba y compruebas diferentes escenarios sin depender de la implementación real de esas clases.

@RelaxedMockK
private lateinit var quoteRepository: QuoteRepository

Como ves, este mock simula un repositorio en el que puedes configurar diferentes respuestas para testear la lógica de tu función.

Creando un test sencillo paso a paso

  1. Given: Define qué respuesta debe devolver el mock.
  2. When: Llama a la función que deseas testear.
  3. Then: Verifica que el comportamiento sea el esperado.

🔴 ¿Quieres entrar de lleno al Desarrollo Mobile? 🔴

Descubre el Desarrollo de Apps Móviles Full Stack Bootcamp de KeepCoding. La formación más completa del mercado y con empleabilidad garantizada

👉 Prueba gratis el Bootcamp en Desarrollo de Apps Móviles por una semana

Por ejemplo, aquí tienes un test que verifica si una función devuelve datos de la base cuando la API no responde:

@Test
fun `when the api doesnt return anything then get values from database`() = runBlocking {
// Given
coEvery { quoteRepository.getAllQuotesFromApi() } returns emptyList()
// When
getQuotesUseCase()
// Then
coVerify(exactly = 1) { quoteRepository.getAllQuotesFromDatabase() }
}

Creando tests para ViewModel

Ten en cuenta que los ViewModel son un nivel más avanzado de testing y usan LiveData. Para configurarlos, necesitas añadir nuevas dependencias en build.gradle:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0'
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.0"
testImplementation "androidx.arch.core:core-testing:2.1.0"

Con estas librerías podrás testear LiveData y corrutinas.

Configuración de reglas y dispatchers para tests con ViewModel

En los tests de ViewModel tienes que añadir una regla InstantTaskExecutorRule para facilitar la evaluación de LiveData. Además, para las corrutinas, puedes configurar un dispatcher personalizado que agilice las pruebas.

@get:Rule
var rule: InstantTaskExecutorRule = InstantTaskExecutorRule()

Ejemplo de tests en ViewModel

Este es un ejemplo de test en ViewModel que verifica que el primer valor de LiveData sea el esperado al crearse:

@Test
fun `when viewmodel is created at the first time, get all quotes and set the first value`() = runTest {
// Given
val quotes = listOf(Quote("Hola", "Aris"), Quote("Bienvenido", "Aris"))
coEvery { getQuotesUseCase() } returns quotes
// When
quoteViewModel.onCreate()
// Then
assert(quoteViewModel.quoteModel.value == quotes.first())
}

El Bootcamp de Desarrollo de Apps Móviles iOS & Android de KeepCoding es tu oportunidad para convertirte en un experto en el sector IT. No solo aprenderás a implementar Android Testing de manera profesional, sino que también descubrirás cómo crear aplicaciones potentes y escalables. Con el alto crecimiento del sector tecnológico, formarte en KeepCoding te abrirá las puertas a empleos estables y bien remunerados. ¡Empieza hoy a cambiar tu vida con KeepCoding!

Jose Luis Bustos
Jose Luis Bustos

Lead Software Architect & Coordinador del Bootcamp en Desarrollo de Apps Móviles iOS & Android.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Desarrollo de apps móviles ios & Android

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado