Integra Test Lab en tu sistema de CI/CD

1. Introducción

Última actualización: 7/4/2022

Cómo ejecutar pruebas para dispositivos móviles con sistemas de CI/CD

Ejecutar pruebas en dispositivos móviles puede ser difícil, ya que muchas apps se ejecutan en diferentes plataformas, dispositivos y versiones de API. Los desarrolladores de apps quieren probar tantas configuraciones como sea posible para detectar problemas antes que sus usuarios. Sin embargo, las limitaciones de costos y recursos limitan la cantidad de dispositivos de prueba y la cantidad de mantenimiento manual en el que los desarrolladores individuales pueden invertir. Cuando se escala verticalmente el proceso de desarrollo, en especial para sistemas de integración continua/desarrollo continuo (CI/CD), el proceso de prueba debe automatizarse y, al mismo tiempo, se minimiza el costo y el esfuerzo de mantenimiento.

Para ayudarte a comprender cómo funcionan tus apps en los dispositivos de tus usuarios, Firebase Test Lab aloja una variedad de dispositivos móviles físicos y virtuales en nuestros centros de datos. También proporcionamos Google Cloud CLI, una herramienta de línea de comandos independiente de la plataforma que organiza la ejecución de pruebas en los dispositivos de nuestros centros de datos. La CLI de gcloud facilita la integración de la solución de pruebas basada en la nube de Test Lab en los flujos de trabajo de CI/CD existentes.

Asistencia multiplataforma

Test Lab proporciona soluciones de prueba para apps de iOS y Android, y compatibilidad especial con juegos para dispositivos móviles como Unity. Las opciones de prueba abarcan los frameworks de prueba populares, como Android Espresso, UI Automator y XCTest de iOS. Con nuestro rastreador automatizado, Robo, Test Lab puede incluso ejecutar pruebas sin ningún código de prueba.

Sin requisitos de hardware

Test Lab aloja dispositivos físicos en los centros de datos de Google y dispositivos virtuales en Google Cloud. Lo único que debes hacer es enviar las pruebas a Test Lab y esperar los resultados.

Rápido y confiable

Ejecutar muchos casos de prueba simultáneos puede llevar mucho tiempo y bloquear los procesos de CI/CD. Con Test Lab, puedes fragmentar pruebas y ejecutarlas fácilmente en varios dispositivos en paralelo. También puede detectar la fragilidad, un problema común de las pruebas móviles.

Qué aprenderás

  • Cómo compilar artefactos de prueba
  • Cómo ejecutar una prueba para dispositivos móviles con gcloud CLI
  • Cómo configurar Jenkins CI
  • Cómo ejecutar pruebas para dispositivos móviles con Jenkins CI
  • Cómo configurar pruebas para escalar verticalmente con sistemas de CI

Este codelab se enfoca en la ejecución de pruebas. Los conceptos y los bloques de código no relevantes se pasan por alto y se proporcionan para que simplemente los copies y pegues.

Requisitos

Si prefieres compilar desde cero, necesitas Android Studio para ejecutar una prueba de Android o Xcode para ejecutar una prueba de iOS. O simplemente trae tú mismo y te proporcionaremos los artefactos.

2. Ejecuta una prueba con gcloud CLI

Cómo compilar un APK de app para Android y un APK de prueba

Para ejecutar una prueba con Test Lab, comienza por compilar un APK de app para Android y un APK de prueba, que contiene pruebas instrumentadas para ejecutarse en dispositivos de hardware o emuladores. Si ya tienes una base de código que funciona, puedes compilar tus propios APK o usar BasicSample para Espresso.

Para compilar APK con comandos de Gradle, debes instalar el SDK de Android. Si no tienes Android Studio instalado en tu equipo, instala Android Studio y el SDK de Android, y configura el entorno ANDROID_HOME con el directorio de tu SDK de Android. Por ejemplo, en tu archivo ~/.bash_profile, agrega la siguiente línea:

export ANDROID_HOME=~/Android/Sdk # For linux
export ANDROID_HOME=~/Library/Android/sdk  # For MacOS

Luego, ejecuta los siguientes comandos para clonar el código y compilar los APK:

git clone https://github.com/android/testing-samples.git
cd testing-samples/ui/espresso/BasicSample/
./gradlew assembleDebug  # for generating app apk
./gradlew assembleDebugAndroidTest # for generating testing apk

Después de ejecutar los comandos de clonación y compilación, podrás encontrar el APK de la app y el APK de prueba en las siguientes ubicaciones:

app/build/outputs/apk/debug/app-debug.apk
app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

También puedes usar las siguientes opciones para obtener los APK de prueba y de la app:

  • Para compilar APKs en Android Studio, sigue las instrucciones que se indican en Cómo realizar pruebas en Android Studio.
  • Descarga la app de Notepad de muestra. Usa el archivo binario app-debug-unaligned.apk y el archivo de pruebas de instrumentación app-debug-test-unaligned.apk, que se encuentran en NotePad/app/build/outputs/apk/.

Si tienes un código fuente funcional para una app para iOS, puedes escribir una XCTest y compilar un archivo ZIP desde la app y las pruebas.

Usa la CLI de gcloud para ejecutar una prueba con Test Lab

En esta sección, crearás un proyecto de Firebase y configurarás tu entorno local del SDK de Google Cloud. Para obtener más información, consulta Comienza a realizar pruebas con gcloud CLI .

Configura la CLI de gcloud

  1. Descarga el SDK de Google Cloud, que incluye la herramienta gcloud CLI.
  2. Verifica que la instalación esté actualizada:
gcloud components update
  1. Accede a gcloud CLI con tu Cuenta de Google:
gcloud auth login
  1. Configura tu proyecto de Firebase en gcloud CLI, en el que PROJECT_ID es el ID de tu proyecto de Firebase. Puedes encontrar el ID del proyecto en la URL de Firebase console, que sigue esta convención de nombres: https://console.firebase.google.com/project/[PROJECT_ID]/...
gcloud config set project PROJECT_ID

Si no tienes un proyecto de Firebase, crea uno en Firebase console.

Cómo ejecutar una prueba con los APK compilados

En esta sección, ejecutarás una prueba de instrumentación en el dispositivo predeterminado de Test Lab, que es un Pixel 3 con nivel de API 28. Si quieres usar otro dispositivo, consulta los dispositivos disponibles.

Con la app y los APK de prueba que compilaste en el APK de prueba de "Compila una app para Android", ejecuta una prueba de instrumentación de Android con el siguiente comando:

gcloud firebase test android run \
  --type instrumentation \
  --app app/build/outputs/apk/debug/app-debug.apk \
  --test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

Analiza los resultados de la prueba

Puedes analizar los resultados de la prueba usando cualquiera de las siguientes opciones:

  • Resumen de gcloud: Cuando finaliza la prueba, la CLI de gcloud imprime un resumen básico de los resultados de la prueba.
  • gcloud exit code: Una vez que se completa la prueba, el comando se cierra con un 0 si la prueba se aprobó. Si la prueba falla, el comando se cierra con un código de salida distinto de cero.
  • Firebase console: gcloud CLI imprime un vínculo a Firebase console. El vínculo sigue la convención de nombres https://console.firebase.google.com/project/PROJECT_ID/testlab/.... Para obtener más información, consulta Cómo interpretar los resultados de una sola ejecución de prueba.
  • Archivo en formato XML de JUnit: gcloud CLI imprime lo siguiente:
Raw results will be stored in your Cloud Storage bucket at [https://console.developers.google.com/storage/browser/test-lab-xxxxx/xxxxx/]

test-lab-xxxxx/xxxxx es el bucket de Cloud Storage que almacena artefactos de prueba y resultados. Para ubicar el archivo XML de JUnit que contiene los resultados de la prueba, abre el vínculo y navega a blueline-28-en-portrait/test_result_1.xml.

3. Configuración con Jenkins CI

En esta sección, usarás Jenkins CI, un sistema de CI popular, para ejecutar pruebas con Test Lab. Si quieres usar un sistema de CI diferente, consulta Prácticas recomendadas avanzadas para ejecutar paquetes de pruebas grandes y la documentación para otros sistemas de CI, como Bitrise y Circle CI. Puedes usar Flank como alternativa a gcloud CLI.

Habilita gcloud CLI para Jenkins

Antes de que puedas usar Test Lab con Jenkins, debes habilitar las APIs necesarias y configurar una cuenta de servicio que Jenkins pueda usar para autenticar con la CLI de gcloud.

Agrega una cuenta de servicio de Google Cloud para Jenkins

Las cuentas de servicio son cuentas limitadas destinadas a integraciones de servicios. Estas cuentas ofrecen un control detallado para servicios específicos y no están sujetas a verificaciones de spam ni solicitudes de captcha, que podrían bloquear tus compilaciones de CI.

Para crear una cuenta de servicio, sigue estos pasos:

  1. Abre la página Cuentas de servicio en Google Cloud Console.
  2. Haz clic en Crear cuenta de servicio, agrega un Nombre y una Descripción y, luego, haz clic en Crear y continuar.
  3. En el menú desplegable Selecciona un rol, elige Básico y, luego, Editor.
  4. Haz clic en Continuar y, luego, en Listo.

A continuación, crearás y descargarás una clave de autenticación que Jenkins puede usar para autenticarse como la cuenta de servicio que creaste.

Para crear y descargar la clave de la cuenta de servicio, sigue estos pasos:

  1. En la página Cuentas de servicio de la consola de Google Cloud, haz clic en el correo electrónico asociado a la cuenta que creaste.
  2. Selecciona Claves y, luego, haz clic en Agregar clave y Crear clave nueva.
  3. Selecciona JSON y, luego, haz clic en Crear.
  4. Cuando se te pida que descargues el archivo, haz clic en Aceptar. Descarga el archivo en un lugar seguro de la computadora. Necesitarás este archivo más adelante cuando configures Jenkins.

Para obtener más información sobre cómo crear cuentas de servicio, consulta Crea una cuenta de servicio.

Habilita las APIs de Google Cloud obligatorias

La API de Cloud Testing te permite ejecutar pruebas en la infraestructura de Google. Habilitaste esta API cuando completaste la ejecución de una prueba con gcloud CLI. La API de Cloud Tool Results te permite acceder a los resultados de las pruebas de manera programática.

  1. Abre la Biblioteca de APIs de Google Developers Console.
  2. En la barra de búsqueda ubicada en la parte superior de Firebase console, ingresa el nombre de cada API requerida ( API de Cloud Testing y API de Cloud Tool Results). Aparece la página de resumen de la API solicitada.
  3. Haz clic en Habilitar API en la página de descripción general de cada API.

Instala y configura Jenkins

Puedes instalar y configurar Jenkins CI en Linux, macOS, Windows y muchos otros entornos. Algunos detalles de este codelab son específicos para la instalación y ejecución de Jenkins CI en Linux, incluido el uso de barras diagonales (/) en las rutas de acceso a archivos.

Si quieres descargar e instalar Jenkins en una computadora que ejecute Linux o Windows, sigue las instrucciones para instalar Jenkins. Después de instalar Jenkins, sigue las mismas instrucciones de instalación de Jenkins para completar la configuración y acceder al panel de control de Jenkins mediante http://localhost:8080.

Verifica los complementos instalados

Jenkins admite diferentes sistemas de control de versión. En este codelab, usarás Git para ejecutar la prueba anterior. Para obtener una mejor experiencia en la ejecución de gcloud CLI, debes instalar el complemento del SDK de gcloud.

  1. En el panel de Jenkins, haz clic en Manage Jenkins y, luego, en Manage Plugins.
  2. Busca los complementos Git y SDK de Cloud y, luego, instálalos (si aún no están instalados).

Configura la ubicación de tus SDK de Google Cloud y Android

Ahora le indicas a Jenkins dónde encontrar el SDK de Google Cloud y el SDK de Android.

Si deseas configurar los SDK de Google Cloud y Android para Jenkins, sigue estos pasos:

  1. En el panel de Jenkins, haz clic en Manage Jenkins y, luego, en Global Tool Configuration.
  2. En la sección SDK de Google Cloud, haz clic en Agregar el SDK de Google Cloud.
  3. En el campo Nombre, ingresa un nombre para la instancia del SDK de Google Cloud que sea fácil de recordar, por ejemplo, gcloud-SDK.
  4. Ingresa el directorio principal del SDK de Google Cloud, por ejemplo, /opt/google-cloud-sdk.
  5. Haz clic en Guardar.
  6. Configura las propiedades de todo el sistema para los SDK de Android y Google Cloud; para ello, abre Dashboard > Manage Jenkins > Configure System.
  7. Selecciona la casilla de verificación Variables de entorno y haz clic en Agregar.
  8. En el campo Nombre, ingresa ANDROID_HOME. En el campo Valor, ingresa la ubicación de tu SDK de Android, por ejemplo, /opt/Android/Sdk.
  9. Haz clic en la casilla de verificación Ubicaciones de las herramientas y, luego, en Agregar. En el menú desplegable Nombre, selecciona el nombre de la instancia del SDK de Google Cloud que agregaste en Configuración global de herramientas.
  10. En el campo Página principal, ingresa la ubicación de tu SDK de Google Cloud, por ejemplo, /opt/google-cloud-sdk.
  11. Haz clic en Guardar.

Agrega las credenciales de tu cuenta de servicio a Jenkins

Ahora, agregarás las credenciales de tu cuenta de servicio de gcloud CLI a Jenkins para que pueda autenticar y ejecutar correctamente los comandos de gcloud CLI.

  1. En el panel de Jenkins, haz clic en Manage Jenkins y, luego, en Manage Credentials.
  2. En la sección Almacenes del alcance de Jenkins, haz clic en el vínculo de dominio (global) y, luego, en Agregar credenciales.
  3. En el menú desplegable Tipo, selecciona Cuenta de servicio de Google desde una clave privada.
  4. En el campo Nombre del proyecto, ingresa el nombre del proyecto de Firebase.
  5. Selecciona Clave JSON, luego haz clic en Explorar y busca la ubicación en la que guardaste la clave de tu cuenta de servicio.
  6. Haz clic en Crear.

Ya está todo listo para configurar tu compilación automatizada de Jenkins para Test Lab.

4. Ejecuta pruebas de Test Lab con Jenkins CI

Ahora que ya configuraste Jenkins, juntemos todo y ejecutemos la misma prueba con Jenkins.

Puedes configurar Jenkins para que ejecute compilaciones automatizadas y pruebas cada vez que se registren actualizaciones de tu app. También puedes configurar Jenkins para que ejecute compilaciones periódicamente. Para obtener más información sobre la configuración de compilaciones en Jenkins, consulta Cómo configurar compilaciones automáticas.

Crea y configura tu proyecto de Jenkins

Crea un proyecto para ejecutar pruebas de integración continua de tu app con Test Lab.

Cómo crear un proyecto en Jenkins

  1. Navega a http://localhost:8080 para abrir el panel de Jenkins.
  2. En el panel de Jenkins, haz clic en New Item.
  3. Escribe un nombre para tu proyecto en el campo Item name y haz clic en Freestyle project para crear un proyecto que use una configuración de compilación única.
  4. Haz clic en OK. Para completar la configuración del proyecto, completa las secciones restantes en secuencia.

Configura la administración del código fuente

  1. En la pestaña Source Code Management, selecciona Git.
  2. Ingresa https://github.com/android/testing-samples.git en el campo URL del repositorio.

Cómo configurar el entorno de compilación

La sección Entorno de compilación te permite configurar las características de la compilación. Para habilitar la autenticación de Google Cloud, sigue estos pasos:

  1. En la pestaña Build Environment, selecciona la casilla de verificación GCloud SDK authentication y elige el nombre de la instalación que elegiste cuando agregaste la información de la instalación de Google Cloud.
  2. En el menú desplegable Google Credentials, selecciona las credenciales de la cuenta de servicio que configuraste.

Cómo agregar pasos de compilación en Gradle para volver a compilar paquetes APK

  1. Desplázate hacia abajo hasta la sección Compilación, haz clic en Agregar paso de compilación y, luego, selecciona Ejecutar shell.
  2. Agrega un paso de compilación para ejecutar los siguientes comandos en el directorio principal de tu aplicación:
cd ui/espresso/BasicSample/
./gradlew assembleDebug  # for generating app apk
./gradlew assembleDebugAndroidTest # for generating testing apk

Agrega un paso de compilación de gcloud CLI a Jenkins

Ahora puedes agregar un paso de compilación a Jenkins y ejecutar Test Lab con la línea de comandos de la CLI de gcloud.

Para agregar el paso de compilación de la CLI de gcloud, agrega un nuevo paso de compilación Ejecutar shell y, luego, ingresa el siguiente comando:

gcloud config set project PROJECT_ID
gcloud firebase test android run \
--app ${WORKSPACE}/ui/espresso/BasicSample/app/build/outputs/apk/debug/app-debug.apk
--test ${WORKSPACE}/ui/espresso/BasicSample/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

Después de finalizar la configuración del proyecto, desplázate hasta el final de la página y guarda la configuración. Se te redireccionará a la página principal del proyecto nuevo.

Ejecuta pruebas con Jenkins

Ya tienes todo listo para compilar el proyecto de Jenkins y ejecutar una prueba como la prueba manual que ejecutaste con gcloud CLI.

Para ejecutar una prueba con Jenkins, sigue estos pasos:

  1. Para activar la compilación de forma manual, haz clic en Compilar ahora.
  2. Para verificar el progreso y los resultados, haz clic en la compilación nueva > Console Output.

Si no ves errores, ¡felicitaciones! Solo configuraste un proyecto y ejecutaste una prueba en un dispositivo Pixel 2 con un solo clic. Si encuentras errores, consulta Solución de problemas.

5. Prácticas recomendadas avanzadas para ejecutar grandes paquetes de pruebas

Si quieres ejecutar muchas pruebas simultáneas, sigue estas prácticas recomendadas para asegurarte de que las pruebas se ejecuten de forma rápida y confiable.

Cómo aumentar la cobertura en varias configuraciones de dispositivos

Puedes agregar fácilmente varios dispositivos al paso de compilación de gcloud CLI. Además, puedes comprobar y elegir dispositivos, versiones, configuraciones regionales y orientaciones disponibles. Por ejemplo, el siguiente comando ejecuta pruebas en dos dispositivos:

  • Un Google Pixel 2 virtual con nivel de API 30 en orientación vertical y configuración regional en inglés
  • Un Samsung Galaxy S20 físico con nivel de API 29 en orientación horizontal y la configuración regional en francés
gcloud firebase test android run \
  --type instrumentation \
  --app app-debug.apk \
  --test app-debug-test.apk \
  --device model=Pixel2,version=30,locale=en,orientation=portrait  \
  --device model=x1q,version=29,locale=fr,orientation=landscape

Usa un archivo de configuración YAML de gcloud CLI

Si prefieres administrar tus argumentos en un solo lugar o con tu sistema de control de código fuente, puedes especificarlos en un archivo de argumentos en formato YAML. Para aprender a usar esta función, ejecuta gcloud topic arg-files.

Fragmenta las pruebas para ejecutarlas en paralelo

Con la fragmentación de pruebas, se divide un conjunto de pruebas en subgrupos (fragmentos) que se ejecutan por separado de forma aislada. Test Lab ejecuta automáticamente cada fragmento en paralelo con varios dispositivos, lo que permite que Test Lab complete todo el conjunto de pruebas más rápido. Para obtener más información, consulta Habilita la fragmentación.

Para habilitar la fragmentación, usa el canal gcloud beta y agrega la marca –num-uniform-shards o –test-targets-for-shard al paso de compilación de la CLI de gcloud. Por ejemplo, para fragmentar las pruebas en cinco ejecuciones y ejecutarlas en paralelo, ejecuta los siguientes comandos:

gcloud beta firebase test android run \
  --type instrumentation \
  --app app-debug.apk \
  --test app-debug-test.apk \
  --num-uniform-shards 5

Habilitar la detección de fragilidad

A menudo, las pruebas en dispositivos móviles pueden ser inestables. A veces, las pruebas son exitosas y otras veces pueden fallar, incluso con la misma configuración. Para detectar si una prueba fallida era inestable, puedes usar la marca de la CLI de gcloud –num-flaky-test-attempts. Esta marca especifica la cantidad de veces que se debe reintentar una ejecución de prueba si uno o más de los casos de prueba fallan por cualquier motivo.

Por ejemplo, para volver a ejecutar casos de prueba con errores tres veces más después de la ejecución con errores inicial, especifica lo siguiente:

gcloud beta firebase test android run \
  --type instrumentation \
  --app app-debug.apk \
  --test app-debug-test.apk \
  --num-flaky-test-attempts 3

6. ¡Felicitaciones!

¡Felicitaciones! Ejecutaste correctamente tu primera prueba de Test Lab con un sistema de CI.

Creaste apps y APK de prueba, y ejecutaste una prueba de instrumentación con Test Lab a través de gcloud CLI. También configurarás un proyecto de Jenkins para automatizar la misma prueba.

Ahora conoces los pasos clave para integrar Test Lab en tu sistema de CI/CD.

Próximos pasos

Consulta Cómo configurar la CI con Firebase Emulator Suite.

Lecturas adicionales

Documentos de referencia