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 para dispositivos móviles puede ser difícil: muchas apps se ejecutan en diferentes plataformas, dispositivos y versiones de API. Los desarrolladores de apps quieren realizar pruebas en tantas configuraciones como sea posible para detectar problemas antes de que lo hagan los usuarios. Sin embargo, las limitaciones de costos y recursos limitan la cantidad de dispositivos de prueba y el mantenimiento manual que los desarrolladores individuales pueden invertir. Cuando el proceso de desarrollo se amplía, en especial para los sistemas de integración continua/entrega continua (CI/CD), el proceso de prueba debe automatizarse y, al mismo tiempo, minimizar el costo y el esfuerzo de mantenimiento.

Para ayudarte a comprender el rendimiento de tus apps en los dispositivos de los 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 coordina 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 pruebas para apps de iOS y Android, y asistencia especializada para juegos para dispositivos móviles, como Unity. Las opciones de prueba abarcan 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 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 tus pruebas a Test Lab y esperar los resultados.

Rápida y confiable

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

Qué aprenderás

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

Este codelab se enfoca en la ejecución de pruebas. Los conceptos y los bloques de código no relacionados con esos temas se abordan superficialmente y se proporcionan para que simplemente los copies y pegues.

Requisitos

Si prefieres crear todo desde cero, necesitas Android Studio para ejecutar una prueba de Android o Xcode para ejecutar una prueba de iOS. O solo ven y te proporcionaremos los artefactos.

2. Ejecuta una prueba con la CLI de gcloud

Compila un APK de app para Android y un APK de prueba

Para ejecutar una prueba con Test Lab, primero debes compilar un APK de la app para Android y un APK de prueba, que contenga pruebas instrumentadas para ejecutar en dispositivos de hardware o emuladores. Si ya tienes una base de código funcional, puedes compilar tus propios APKs o usar el BasicSample para Espresso.

Para compilar APKs con comandos de Gradle, debes instalar el SDK de Android. Si Android Studio no está instalado en tu máquina, instala Android Studio y el SDK de Android, y configura el entorno ANDROID_HOME con tu directorio del 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 APKs:

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, puedes 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

Como alternativa, puedes usar las siguientes opciones para obtener los APKs 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 ejemplo. 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 código fuente funcional para una app para iOS, puedes escribir un XCTest y compilar un archivo ZIP a partir de 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 de CLI de gcloud.
  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 nomenclatura: 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.

Ejecuta una prueba con los APKs 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 el nivel de API 28. Si quieres usar otro dispositivo, consulta los dispositivos disponibles.

Con la app y los APK de prueba que compilaste en Compila un APK de app para Android y un APK de prueba, 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 con 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.
  • Código de salida de gcloud: Después de que se completa la prueba, el comando sale con 0 si la prueba se superó. Si la prueba falla, el comando se cierra con un código de salida distinto de cero.
  • Firebase console: La CLI de gcloud imprime un vínculo a Firebase console. El vínculo sigue la convención de nomenclatura 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 XML de JUnit: La CLI de gcloud 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 los artefactos y los resultados de las pruebas. Para ubicar el archivo XML de JUnit que contiene los resultados de las pruebas, 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 las prácticas recomendadas avanzadas para ejecutar grandes conjuntos de pruebas y la documentación de otros sistemas de CI, como Bitrise y Circle CI. Puedes usar Flank como alternativa a la CLI de gcloud.

Habilita la CLI de gcloud para Jenkins

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

Agrega una cuenta de servicio de Google Cloud para Jenkins

Las cuentas de servicio son cuentas limitadas diseñadas para 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 la consola de Google Cloud.
  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, selecciona 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, luego haz clic en Agregar clave y Crear clave nueva.
  3. Selecciona JSON y, luego, haz clic en Crear.
  4. Cuando se te solicite que descargues el archivo, haz clic en Aceptar. Descarga el archivo y colócalo en un lugar seguro en tu computadora. Necesitarás este archivo más adelante cuando configures Jenkins.

Si deseas obtener más información para crear cuentas de servicio, consulta Crea una cuenta de servicio.

Habilita las APIs de Google Cloud requeridas

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

  1. Abre la Biblioteca de APIs de Google Developers Console.
  2. En la barra de búsqueda de la parte superior de Firebase console, ingresa el nombre de cada API requerida ( API de Cloud Testing y API de Cloud Tool Results). Aparecerá la página de descripción general 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. Ciertos 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 de archivos.

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

Verifica los complementos instalados

Jenkins admite diferentes sistemas de control de versiones. En este codelab, usarás Git para ejecutar la prueba anterior. Para obtener una mejor experiencia con la ejecución de la CLI de gcloud, 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 GCloud SDK, y, luego, instálalos (si aún no lo hiciste).

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

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

Para configurar los SDKs 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 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. Abre Panel > Administrar Jenkins > Configurar sistema para configurar las propiedades de todo el sistema para los SDKs de Android y Google Cloud.
  7. Selecciona la casilla de verificación Variables de entorno y haz clic en Agregar.
  8. En el campo Name, ingresa ANDROID_HOME. En el campo Value, 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 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 la herramienta.
  10. En el campo Home, 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 la cuenta de servicio de la CLI de gcloud a Jenkins para que Jenkins pueda autenticarse y ejecutar correctamente los comandos de la CLI de gcloud.

  1. En el panel de Jenkins, haz clic en Manage Jenkins y, luego, en Manage Credentials.
  2. En la sección Stores scoped to Jenkins, haz clic en el vínculo de dominio (global) y, luego, en Add Credentials.
  3. En el menú desplegable Kind, selecciona Google Service Account from private key.
  4. En el campo Nombre del proyecto, ingresa el nombre de tu proyecto de Firebase.
  5. Selecciona Clave JSON, haz clic en Explorar y navega a la ubicación en la que guardaste la clave de tu cuenta de servicio.
  6. Haz clic en Crear.

Ahora puedes configurar tu compilación automatizada de Jenkins para Test Lab.

4. Cómo ejecutar pruebas de Test Lab con Jenkins CI

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

Puedes configurar Jenkins para que ejecute compilaciones y pruebas automatizadas cada vez que se verifiquen actualizaciones para tu app. También puedes configurar Jenkins para que ejecute compilaciones periódicamente. Para obtener más información acerca de 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. Para abrir el panel de Jenkins, navega a http://localhost:8080.
  2. En el panel de Jenkins, haz clic en New Item.
  3. Ingresa un nombre para tu proyecto en el campo Nombre del elemento y haz clic en Proyecto de formato libre para crear un proyecto que use una sola configuración de compilación.
  4. Haz clic en Aceptar. 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 Administración del código fuente, selecciona Git.
  2. Ingresa https://github.com/android/testing-samples.git en el campo URL del repositorio.

Configura el entorno de compilación

La sección Build Environment 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 instalación que seleccionaste cuando agregaste la información de instalación de Google Cloud.
  2. En el menú desplegable Credenciales de Google, 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 Build, haz clic en Add build step y, luego, selecciona Execute 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

Cómo agregar un paso de compilación de la CLI de gcloud a Jenkins

Ahora estás listo para agregar un paso de compilación a Jenkins y poder ejecutar Test Lab con la línea de comandos de gcloud CLI.

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 terminar la configuración del proyecto, desplázate hasta la parte inferior de la página y guarda la configuración. Se te redireccionará a la página principal del proyecto nuevo.

Ejecuta pruebas con Jenkins

Ahora puedes compilar el proyecto de Jenkins y ejecutar una prueba como la que hiciste de forma manual con la CLI de gcloud.

Para ejecutar pruebas 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, ¡felicidades! Con un solo clic, acabas de configurar un proyecto y ejecutar una prueba en un dispositivo Pixel 2. Si se producen errores, consulta Solución de problemas.

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

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

Aumenta la cobertura en varias configuraciones de dispositivos

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

  • Un Google Pixel 2 virtual con el nivel de API 30 en orientación vertical y la configuración regional en inglés
  • Un Samsung Galaxy S20 físico con el nivel de API 29 en orientación horizontal y la configuración regional francesa
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 la CLI de gcloud

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 obtener más información sobre cómo 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 le permite completar todo el conjunto de pruebas más rápido. Para obtener más información, consulta Habilita el sharding.

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 tus 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

Habilita la detección de inestabilidad

Las pruebas para dispositivos móviles suelen ser inestables. A veces, las pruebas se aprueban y, otras veces, pueden fallar, incluso con la misma configuración. Puedes detectar si una prueba fallida era inestable con la marca –num-flaky-test-attempts de la CLI de gcloud. 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 los casos de prueba fallidos tres veces más después de la ejecución inicial fallida, 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 con éxito tu primera prueba de Test Lab con un sistema de CI.

Compilaste APKs de prueba y de la app, y ejecutaste una prueba de instrumentación con Test Lab usando la CLI de gcloud. 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