Integra Test Lab en tu sistema de CI/CD

1. Introducción

Última actualización: 7 de abril de 2022

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

Ejecutar pruebas en dispositivos móviles puede ser difícil: muchas apps se ejecutan en diferentes plataformas, dispositivos y versiones de API. Los desarrolladores de apps quieren probar tantos parámetros de configuración como sea posible para detectar problemas antes que sus usuarios, pero las restricciones de costos y recursos limitan la cantidad de dispositivos de prueba y el mantenimiento manual en el que los desarrolladores individuales pueden invertir. Cuando el proceso de desarrollo escala verticalmente, en especial para los sistemas de integración continua/desarrollo continuo (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 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 ofrece soluciones de prueba destinadas a apps para iOS y Android, así como asistencia especializada para juegos para dispositivos móviles, como Unity. Las opciones de prueba abarcan frameworks de prueba populares como Android Espresso, UI Automator e iOS XCTest. Con nuestro rastreador automatizado, Robo, Test Lab puede 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ápida y confiable

La ejecución de muchos casos de prueba simultáneos puede llevar mucho tiempo y bloquear los procesos de CI/CD. Con Test Lab, puedes fragmentar pruebas fácilmente y ejecutarlas en varios dispositivos en paralelo. También puedes detectar la fragilidad, un problema común de las pruebas en dispositivos 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 realizar compilaciones desde cero, necesitas Android Studio para ejecutar una prueba de Android o Xcode para ejecutar una prueba de iOS. También puedes traerte tú 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, primero debes compilar un APK de app para Android y un APK de prueba que contenga pruebas de instrumentación que se ejecuten en dispositivos de hardware o emuladores. Si ya tienes una base de código que funcione, puedes compilar tus propios APK o usar BasicSample para Espresso.

Para compilar APKs con comandos de Gradle, debes instalar el SDK de Android. Si no está instalado Android Studio en el equipo, instala Android Studio y el SDK de Android, y configura el entorno ANDROID_HOME con el directorio del SDK de Android. Por ejemplo, en el 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 los APKs de compilación:

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 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 que funciona 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 el 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 la 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 del proyecto. 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 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 nivel de API 28. Si quieres usar otro dispositivo, revisa los dispositivos disponibles.

Con la app y los APKs de prueba que compilaste, compila un APK de app para Android y el 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 usando cualquiera de las siguientes opciones:

  • Resumen de gcloud: Cuando finaliza la prueba, gcloud CLI imprime un resumen básico de los resultados.
  • gcloud Código de salida: Después de que se completa la prueba, el comando sale con 0 si esta se aprueba. Si la prueba falla, el comando se cierra con un código de salida que no es 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 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 resultados de prueba. Para encontrar el archivo en formato XML JUnit que contiene los resultados de la prueba, abre el vínculo y navega hasta 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 conjuntos 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 poder 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 destinadas a las 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, de lo contrario, 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 con 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 a un lugar seguro en tu 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 permite ejecutar pruebas en la infraestructura de Google. Habilitaste esta API cuando completaste la acción de ejecutar una prueba con gcloud CLI. La API de Cloud Tool Results te permite acceder de manera programática a los resultados de las pruebas.

  1. Abre la Biblioteca de API 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). Aparecerá 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. Ciertos detalles de este codelab son específicos para instalar y ejecutar Jenkins CI en Linux, incluido el uso de barras diagonales (/) en rutas de acceso a archivos.

Para descargar e instalar Jenkins en una computadora que 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 versión. En este codelab, usarás Git para ejecutar la prueba anterior. Para obtener una mejor experiencia con 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 de Git y SDK de gcloud y, luego, instálalos (si todavía no los instalaste).

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

Ahora, le indicarás 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, SDK-de-GCloud.
  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 Panel > Administrar Jenkins > Configurar sistema.
  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 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 de herramienta global.
  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 Jenkins pueda autenticarse 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 Stores scope to Jenkins, haz clic en el vínculo del dominio (global) y, luego, en Add Credentials.
  3. En el menú desplegable Tipo, 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 busca la ubicación en la que guardaste la clave de tu cuenta de servicio.
  6. Haz clic en Crear.

Ya estás listo para configurar la compilación automatizada de Jenkins para Test Lab.

4. Ejecuta pruebas de Test Lab con Jenkins CI

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

Puedes configurar Jenkins para que ejecute compilaciones automatizadas y pruebas cada vez que se registren actualizaciones a tu app. También puedes configurar Jenkins para que ejecute compilaciones de forma periódica. 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 única configuración de compilación.
  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 Administración del código fuente, 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 Build Environment te permite configurar las características de compilación. Para habilitar la autenticación de Google Cloud, sigue estos pasos:

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

Se agregaron pasos de compilación de Gradle para recompilar 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

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

Ya tienes todo listo para agregar un paso de compilación en 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 de Ejecutar la 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 hacia 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

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

Para ejecutar la prueba con Jenkins, sigue estos pasos:

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

Si no aparecen errores, felicitaciones. Acabas de configurar un proyecto y ejecutar una prueba en un dispositivo Pixel 2 con un clic. Si se producen errores, consulta Solución de problemas.

5. Prácticas recomendadas avanzadas para ejecutar paquetes de pruebas de gran tamaño

Cuando quieras ejecutar muchas pruebas simultáneas, sigue estas prácticas recomendadas para asegurarte de que las pruebas se ejecuten con rapidez y confiabilidad.

Aumenta la cobertura en varias configuraciones de dispositivos

Puedes agregar fácilmente varios dispositivos al paso de compilación de gcloud CLI. 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 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 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 origen, puedes especificarlos en un archivo de argumentos en formato YAML. Si quieres aprender a usar esta función, ejecuta gcloud topic arg-files.

Fragmenta 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 Cómo habilitar la fragmentación.

Para habilitar la fragmentación, usa el canal gcloud beta y agrega la marca –num-uniform-shards o la marca –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

Habilitar la detección de fragilidad

Las pruebas en dispositivos móviles pueden ser inestables. A veces, las pruebas se aprueban y otras pueden fallar, incluso con la misma configuración. Puedes detectar si una prueba con errores era inestable mediante 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 casos de prueba fallan por algún motivo.

Por ejemplo, para volver a ejecutar casos de prueba con errores tres veces más después de la ejecución inicial con errores, 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.

Creaste APK de apps y pruebas, 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 a tu sistema de CI/CD.

Próximos pasos

Consulta Cómo configurar CI con Firebase Emulator Suite

Lecturas adicionales

Documentos de referencia