
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.

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

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.

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.

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.

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.

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"
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")
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"
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.

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',
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
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.

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.

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.

Crear una clave API en formato JSON

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

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.