Ejecute pruebas instrumentales en el laboratorio de pruebas de Firebase. Parte 1: proyecto iOS

imagen

Mi nombre es Dmitry, trabajo como probador en MEL Science . Más recientemente, terminé lidiando con una característica relativamente nueva del Laboratorio de pruebas de Firebase , es decir, con pruebas instrumentales de aplicaciones iOS que usan el marco de prueba XCUITest nativo.

Antes de eso, ya había probado el Firebase Test Lab para Android y realmente me gustó todo, así que decidí tratar de poner la infraestructura de prueba del proyecto iOS en la misma pista. Tuve que buscar mucho en Google y no todo funcionó bien la primera vez, así que decidí escribir un artículo tutorial para aquellos que todavía tienen que hacerlo.

Entonces, si tiene pruebas de IU en un proyecto de iOS, hoy puede intentar ejecutarlas en dispositivos reales amablemente proporcionados por Good Corporation. Interesado - bienvenido a cat.

En la historia, decidí construir sobre algunos datos de origen: un repositorio privado en GitHub y el sistema de construcción CircleCI. El nombre de la aplicación es AmazingApp, bundleID es com.company.amazingapp. Cito estos datos de inmediato, para reducir la confusión posterior.

Si implementó diferentes soluciones en su proyecto de manera diferente, comparta su experiencia en los comentarios.

1. Las pruebas mismas


Cree una nueva rama de proyecto para pruebas de IU:

$ git checkout develop $ git pull $ git checkout -b “feature/add-ui-tests” 

Abra el proyecto en Xcode y cree un nuevo Target con las pruebas de IU [XCode -> File -> New -> Target -> iOS Testing Bundle], asígnele el nombre parlante AmazingAppUITests.

imagen

Vaya a la sección Fases de construcción del Target creado y verifique la presencia de Dependencias de Target - AmazingApp, en Compile Sources - AmazingAppUITests.swift.

Es una buena práctica aislar las diversas opciones de ensamblaje en esquemas separados. Creamos el esquema para nuestras pruebas de IU [XCode -> Producto -> Esquema -> Nuevo esquema] y le damos el mismo nombre: AmazingAppUITests.

Construir el esquema creado debe incluir el Target de la aplicación principal - AmazingApp y Target UI tests - AmazingAppUITests - mira la captura de pantalla

imagen

A continuación, cree una nueva configuración de compilación para las pruebas de IU. En Xcode, haga clic en el archivo del proyecto, vaya a la sección Información. Haga clic en "+" y cree una nueva configuración, por ejemplo XCtest. Lo necesitaremos en el futuro para evitar bailar con una pandereta cuando se trata de firmar el código.

imagen

Su proyecto tiene al menos tres Target: la aplicación principal, pruebas unitarias (porque lo son, ¿verdad?) Y las pruebas de Target UI que creamos.

Vaya a Target AmazingApp, pestaña Configuración de compilación, sección Identidad de firma de código. Para configurar XCtest, seleccione iOS Developer. En la sección Estilo de firma de código, seleccione Manual. Todavía no hemos generado el perfil de aprovisionamiento, pero un poco más tarde definitivamente volveremos a él.

Para Target AmazingAppUITests hacemos lo mismo, pero en la columna Identificador del paquete de productos ingresamos com.company.amazingappuitests.

2. Configurar un proyecto en el Programa de Desarrolladores de Apple


Vamos a la página del Programa para desarrolladores de Apple, a la sección Certificados, identificadores y perfiles y luego a la columna de ID de aplicaciones del elemento Identificadores. Cree una nueva ID de aplicación llamada AmazingAppUITests y bundleID com.company.amazingappuitests.

imagen

Ahora tenemos la oportunidad de firmar nuestras pruebas con un certificado por separado, pero ... El procedimiento de compilación para las pruebas implica construir la aplicación en sí y el corredor de prueba. En consecuencia, nos enfrentamos al problema de firmar dos ID de paquete con un perfil de aprovisionamiento. Afortunadamente, existe una solución simple y elegante: la identificación de la aplicación Wildcard. Repetimos el procedimiento para crear una nueva ID de aplicación, pero en lugar de la ID explícita de la aplicación, seleccione la ID de la aplicación comodín como en la captura de pantalla.

imagen

Hemos terminado de trabajar con developer.apple.com en este momento, pero no minimizaremos la ventana del navegador. Vamos al sitio con documentación sobre Fastlane y leemos sobre la utilidad Match de principio a fin.

Un lector atento notó que para usar esta utilidad necesitaremos un repositorio privado y una cuenta que tenga acceso tanto al Programa de Desarrolladores de Apple como a Github. Creamos (si de repente esto no es) una cuenta con el formulario InfrastructureAccount@your.company.domain, presentamos una contraseña poderosa, la registramos en developer.apple.com y la nombramos como administrador del proyecto. A continuación, dé acceso a su cuenta al repositorio github de su empresa y cree un nuevo repositorio privado con un nombre como AmazingAppMatch.

3. Configuración de Fastlane y la utilidad Match


Abra la terminal, vaya a la carpeta del proyecto e inicialice fastlane como se indica en el manual oficial . Después de ingresar el comando

 $ fastlane init 

Se le pedirá que seleccione las configuraciones de uso disponibles. Seleccionamos el cuarto elemento: configuración manual del proyecto.

imagen

Un nuevo directorio fastlane ha aparecido en el proyecto, en el que hay dos archivos: Appfile y Fastfile. En pocas palabras: en Appfile almacenamos datos de servicio y en Fastfile escribimos trabajos, en la terminología de Fastlane llamados carriles. Recomiendo leer la documentación oficial: uno , dos .

Abra el Appfile en su editor de texto favorito y tráigalo al siguiente formulario:

 app_identifier "com.company.amazingapp" # Bundle ID apple_dev_portal_id "infrastructureaccount@your.company.domain" #   ,     iOS   Apple Developer Program. team_id "LSDY3IFJAY9" # Your Developer Portal Team ID 

Regresamos a la terminal y de acuerdo con el manual oficial comenzamos a configurar el partido.

 $ fastlane match init $ fastlane match development 

Luego, ingrese los datos solicitados: repositorio, cuenta, contraseña, etc.

Importante: la primera vez que inicie la utilidad de coincidencia, se le pedirá que ingrese una contraseña para descifrar el repositorio. Es muy importante mantener esta contraseña, en la etapa de configuración del servidor CI nos será útil.

Un nuevo archivo apareció en la carpeta fastlane - Matchfile. Abra en su editor de texto favorito y lleve al formulario:

 git_url("https://github.com/YourCompany/AmazingAppMatch") #       . type("development") # The default type, can be: appstore, adhoc, enterprise or development app_identifier("com.company.amazingapp") username("infrastructureaccount@your.company.domain") # Your Infrastructure account Apple Developer Portal username 

Lo rellenamos de esta manera si queremos usar match para firmar compilaciones para publicar en Crashlytics y / o AppStore, es decir, para firmar el ID del paquete de su aplicación.

Pero, como recordamos, para crear una compilación de prueba creamos una ID comodín especial. Por lo tanto, abra Fastfile e ingrese a un nuevo carril:

 lane :testing_build_for_firebase do match( type: "development", readonly: true, app_identifier: "com.company.*", git_branch: "uitests" #     development     . ) end 

Guardar, ingresar en la terminal

 fastlane testing_build_for_firebase 

y vea cómo fastlane creó un nuevo certificado y lo colocó en el repositorio. Genial

Abrir Xcode. Ahora tenemos el perfil de aprovisionamiento necesario de la compañía Match Development com.company. * Tipo, que debe especificarse en la sección de perfil de aprovisionamiento para los objetivos AmazingApp y AmazingAppUITests.

imagen

Queda por agregar carril para construir las pruebas. Vamos al repositorio del proyecto de complemento para fastlane, que facilita la configuración de exportación al Laboratorio de pruebas de Firebase y sigue las instrucciones.

Copie del ejemplo original para que nuestro carril testing_build_for_firebase finalmente se vea así:

 lane :testing_build_for_firebase do match( type: "development", readonly: true, app_identifier: "com.company.*", git_branch: "uitests" ) scan( scheme: 'AmazingAppUITests', # UI Test scheme clean: true, # Recommended: This would ensure the build would not include unnecessary files skip_detect_devices: true, # Required build_for_testing: true, # Required sdk: 'iphoneos', # Required should_zip_build_products: true, # Must be true to set the correct format for Firebase Test Lab ) firebase_test_lab_ios_xctest( gcp_project: 'AmazingAppUITests', # Your Google Cloud project name (    ) devices: [ # Device(s) to run tests on { ios_model_id: 'iphonex', # Device model ID, see gcloud command above ios_version_id: '12.0', # iOS version ID, see gcloud command above locale: 'en_US', # Optional: default to en_US if not set orientation: 'portrait' # Optional: default to portrait if not set } ] ) end 

Para obtener información completa sobre la configuración de fastlane en CircleCI, recomiendo leer la documentación oficial uno, dos .

No olvides agregar nuestro config.yml con una nueva tarea:

 build-for-firebase-test-lab: macos: xcode: "10.1.0" working_directory: ~/project shell: /bin/bash --login -o pipefail steps: - checkout - attach_workspace: at: ~/project - run: sudo bundle install #   - run: name: install gcloud-sdk #  mac    gcloud command: | ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null ; brew install caskroom/cask/brew-cask 2> /dev/null brew cask install google-cloud-sdk - run: name: build app for testing command: fastlane testing_build_for_firebase #  lane     firebase 

4. ¿Pero qué hay de nuestro banco de pruebas? Configurar Firebase


De hecho, procedemos a para qué fue escrito el artículo.

Tal vez su aplicación use Firebase en un plan de tarifas gratuito, tal vez no lo use en absoluto. No hay absolutamente ninguna diferencia fundamental, porque para las necesidades de prueba podemos crear un proyecto separado con un año de uso gratuito (genial, ¿verdad?)

Inicie sesión en nuestra cuenta de infraestructura (o cualquier otra, no hay diferencia) y vaya a la página de la consola de Firebase . Cree un nuevo proyecto llamado AmazingAppUITests.

Importante: en el paso anterior del Fastfile en el carril firebase_test_lab_ios_xctest, el parámetro gcp_project debe coincidir con el nombre del proyecto.

imagen

La configuración predeterminada está bastante bien con nosotros.

No cerramos la pestaña, bajo la misma cuenta que registramos en Gcloud ; esta es una medida necesaria , ya que la comunicación con Firebase se lleva a cabo utilizando la interfaz de la consola gcloud.

Google da $ 300 por año, lo que en el contexto de realizar pruebas automáticas es equivalente a un año de uso gratuito del servicio. Ingresamos los datos de pago, esperamos el cargo de prueba de $ 1 y obtenemos $ 300 en la cuenta. Después de un año, el proyecto se transferirá automáticamente a un plan tarifario gratuito, por lo que no debe preocuparse por una posible pérdida de dinero.

Volvamos a la pestaña con el proyecto Firebase y transfiéralo al plan tarifario Blaze: ahora tenemos algo que pagar en caso de que se exceda el límite.

En la interfaz de gcloud, seleccione nuestro proyecto Firebase, seleccione el elemento del menú principal "Catálogo" y agregue la API de prueba de Cloud y la API de resultados de Cloud Tools.

imagen

Luego vaya al elemento de menú "IAM y Administración" -> Cuentas de servicio -> Crear una cuenta de servicio. Le damos el derecho de editar el proyecto.

imagen

Crear una clave API en formato JSON

imagen

Necesitaremos el JSON descargado un poco más tarde, pero por ahora, consideraremos que la configuración de Test Lab ha finalizado.

5. Configurar CircleCI


Se está gestando una pregunta razonable: ¿qué hacer con las contraseñas? Guardar de manera confiable nuestras contraseñas y otros datos confidenciales nos ayudará al mecanismo de las variables de entorno de nuestra máquina de compilación. En la configuración del proyecto CircleCI, seleccione Variables de entorno

imagen
Y comience las siguientes variables:

  • clave: GOOGLE_APPLICATION_CREDENTIALS
    valor: archivo de clave de cuenta de servicio gcloud json
  • clave: MATCH_PASSWORD
    valor: contraseña para descifrar el repositorio de github con certificados
  • clave: FASTLANE_PASSWORD
    valor: Contraseña de la cuenta de infraestructura del portal de desarrolladores de Apple

Guardamos los cambios, creamos un RP y lo enviamos a revisión para el liderazgo de nuestro equipo.

Resumen


Como resultado de realizar estas simples manipulaciones, obtuvimos un soporte de trabajo bueno y estable con la capacidad de grabar video en la pantalla del dispositivo en el momento de la prueba. En un caso de prueba, especifiqué un modelo de dispositivo iPhone X, pero la granja ofrece una amplia selección de combinaciones de diferentes modelos y versiones de iOS.

La segunda parte estará dedicada a la configuración paso a paso de Firebase Test Lab para un proyecto de Android.

Source: https://habr.com/ru/post/451786/


All Articles