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
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).
- Tests unitarios: Estos son la base de las pruebas y permiten verificar el funcionamiento aislado de cada componente o funcionalidad.
- 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.
- 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
- Given: Define qué respuesta debe devolver el mock.
- When: Llama a la función que deseas testear.
- 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 semanaPor 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!