Acelerando las pruebas instrumentadas — Parte 1: AM Instrument

Optimizando el tiempo de tu pipeline en Android

Yamil Medina
Droid LATAM
4 min readSep 11, 2020

--

Cuando desarrollamos casi siempre estamos buscando la eficiencia o como mejorar. Por eso se me hace difícil pensar algo en otros términos que no sea velocidad, finalmente lo que siempre buscamos a la hora de hacer algo repetitivo es ser productivos, hacer más en menos tiempo. La idea principal de este artículo (hecho en dos secciones), es presentar algunas opciones que tenemos a la mano hoy en día para agilizar el desarrollo y ejecución de las pruebas instrumentadas en Android.

Ejemplo base

Vamos a tomar el siguiente proyecto base para ir ejemplificando.

Estructura base de ejemplo, para pruebas instrumentadas.

Normalmente para ejecutar las pruebas instrumentadas que vemos arriba haríamos algo como esto:

./gradlew app:connectedDebugAndroidTest

o bien, utilizando am instrument ¿Realmente bajamos a este nivel?

adb shell am instrument -w -r -e debug false dev.yamil.apps.debug.test/androidx.test.runner.AndroidJUnitRunner

Utilizando las opciones de filtro para AndroidJUnitRunner

La herramienta am instrument pasa las opciones de prueba a AndroidJUnitRunner en el formato de llave-valor, mediante la marca -e, con la siguiente sintaxis:

-e <key> <value>

Aplicando lo anterior a nuestro ejemplo, podríamos hacer algo como lo siguiente:

adb shell am instrument -w -r -e package dev.yamil.apps.mypackage 
-e debug false dev.yamil.apps.debug.test/androidx.test.runner.AndroidJUnitRunner

Veamos la “magia” detrás de este comando de am instrument.

-e package: Acá le decimos que corra sólo las pruebas de un paquete en específico, en nuestro caso dev.yamil.apps.mypackage

El resultado más en detalle será la ejecución de las pruebas de las clases InstrumentedTestA e InstrumentedTestB.

¡Genial! pero, ¿Cuáles otras opciones tenemos ?

Bueno, dentro de las opciones para filtrar podemos decirle que corra todos las pruebas con excepción de un paquete en particular, el comando es muy intuitivo, casi lenguaje natural.

adb shell am instrument -w -r -e notPackage dev.yamil.apps.mypackage 
-e debug false dev.yamil.apps.debug.test/androidx.test.runner.AndroidJUnitRunner

-e notPackage: Acá le decimos que corra todas las pruebas con excepción las que están bajo un paquete objetivo, en nuestro caso eliminaremos de la ejecución todo bajo dev.yamil.apps.mypackage

El resultado de la ejecución es que las todas las pruebas bajo los paquetes otherpackage y thirdpackage serán ejecutadas, en detalle InstrumentedTestC e InstrumentedTestD.

¿Cuál es la gracia entonces?

Podemos habilitar ejecuciones en paralelo de nuestras pruebas en un entorno de CI.

A continuación, les presento un caso real de una aplicación que trabajamos durante este año dónde se obtuvieron los siguientes resultados.

Pasamos de esto, sin paralelismo:

A esto otro, con pruebas en parelelo:

Observaciones y logros

Primero esto va a depender de qué entorno de CI estamos utilizando y sus configuraciones. Para nuestro caso, Jenkins + Ejecución en paralelo de pruebas instrumentadas, nos permitió bajar el tiempo ejecución de estas pruebas en CI de 20 minutos a 10 minutos, que si hacemos cuentas nos sorprenderemos del tiempo ahorrado día a día y semana a semana. Como se dice a menudo:

Una cadena es tan fuerte como su eslabón más débil.

en nuestro caso:

Las pruebas son tan rápidas como tu conjunto o paquete mas lento.

Haciendo unas cuentas rápidas del impacto generado en nuestro equipo a la semana:

  • Cada día se realizaban 10 ejecuciones del pipeline en promedio, dando un total de 20 minutos x 10 = 200 minutos de espera en este job (3 horas y 20 minutos aproximadamente).
  • Si lo extendemos a la semana (Lunes a Viernes, nadie quiere trabajar un fin de semana 😅) nos daría un total de: 16 horas y 40 minutos en “espera”.
  • Si el ahorro fue de un 50%, nos quedan 8 horas y 20 minutos de ahorro a la semana 🎊
  • Ese ahorro es equivalente a un día de trabajo de un persona (en una jornada de 8 horas diarias).

Si quieres conocer mas opciones que am instrument provee, te sugiero dar una mirada a la documentación oficial de android 👉 acá.

Serie

Esta es una serie de 2 partes:

Parte 1 — AM Instrument

Parte 2 — Flank (En proceso).

--

--

Yamil Medina
Droid LATAM

Software Engineer / Android Developer / JVM ❤ / Cycling enthusiast