Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS

Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS

Je m'appelle Dmitry, je travaille comme testeur dans l'entreprise MEL Science. RĂ©cemment, j'ai terminĂ© d'explorer une fonctionnalitĂ© relativement rĂ©cente de Firebase Test Lab — Ă  savoir, le test d'applications iOS Ă  l'aide du framework de test natif XCUITest.

Avant cela, j'avais dĂ©jĂ  essayĂ© Firebase Test Lab pour Android et cela m'avait beaucoup plu, donc j'ai dĂ©cidĂ© d'essayer de mettre en place une infrastructure de test iOS sur les mĂȘmes bases. J'ai dĂ» beaucoup chercher sur Google et tout n'a pas fonctionnĂ© du premier coup, c'est pourquoi j'ai dĂ©cidĂ© d'Ă©crire un article-tutoriel pour ceux qui devront encore le faire.

Donc, si vous avez des tests UI sur un projet iOS, vous pourrez dÚs aujourd'hui essayer de les exécuter sur de vrais appareils, gracieusement fournis par la Corporation du Bien. Les intéressés, bienvenue sous le teaser.

Dans le rĂ©cit, j'ai dĂ©cidĂ© de partir de certaines donnĂ©es de base — un dĂ©pĂŽt privĂ© sur GitHub et le systĂšme de construction CircleCI. Le nom de l'application est AmazingApp, bundleID — com.company.amazingapp. Je donne ces donnĂ©es tout de suite, afin de rĂ©duire la confusion ultĂ©rieure.

Si vous avez mis en Ɠuvre certaines solutions diffĂ©remment dans votre projet, partagez votre expĂ©rience dans les commentaires.

1. Les tests eux-mĂȘmes

Créons une nouvelle branche de projet pour les tests UI :

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

Ouvrons le projet dans XCode et créons une nouvelle Cible (Target) avec des tests UI [XCode -> Fichier -> Nouveau -> Cible -> Bundle de test iOS], donnons-lui un nom évocateur : AmazingAppUITests.

Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS

Nous allons dans la section Phases de Construction de la Cible créée et vĂ©rifions la prĂ©sence des DĂ©pendances de Cible — AmazingApp, dans Sources de Compilation — AmazingAppUITests.swift.

Il est de bonne pratique de sĂ©parer diffĂ©rentes options de construction en SchĂ©mas distincts. CrĂ©ons un schĂ©ma pour nos tests UI [XCode -> Produit -> SchĂ©ma -> Nouveau SchĂ©ma] et donnons-lui le mĂȘme nom : AmazingAppUITests.

La construction du schĂ©ma créé doit inclure la Cible de l'application principale — AmazingApp et la Cible de tests UI — AmazingAppUITests — voir la capture d'Ă©cran

Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS

Ensuite, crĂ©ons une nouvelle configuration de construction pour les tests UI. Dans XCode, nous cliquons sur le fichier du projet, allons dans la section Info. Cliquons sur “+” et crĂ©ons une nouvelle configuration, par exemple XCtest. Cela nous sera nĂ©cessaire ultĂ©rieurement pour Ă©viter des complications lors de la signature des codes.

Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS

Dans votre projet, vous avez au moins trois Cibles : l'application principale, les tests unitaires (car ils existent, n'est-ce pas ?) et la Cible de tests UI que nous avons créée.

Accédez à Target AmazingApp, onglet Build Settings, section Code Signing Identity. Pour la configuration XCtest, choisissez iOS Developer. Dans la section Code Signing Style, sélectionnez Manual. Nous n'avons pas encore généré de profil de provisionnement, mais nous y reviendrons un peu plus tard.

Pour Target AmazingAppUITests, faisons la mĂȘme chose, mais dans le champ Product Bundle Identifier, saisissons com.company.amazingappuitests.

2. Configuration du projet dans le programme Apple Developer

Rendez-vous sur la page du programme Apple Developer, allez dans la section Certificates, Identifiers & Profiles, puis dans le champ App IDs du point Identifiers. Créez un nouvel App ID nommé AmazingAppUITests avec le bundleID com.company.amazingappuitests.

Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS

Nous avons maintenant la possibilitĂ© de signer nos tests avec un certificat distinct, mais
 La procĂ©dure de crĂ©ation d'un build pour les tests implique la crĂ©ation de l'application elle-mĂȘme et des builds du runner de tests. Par consĂ©quent, nous sommes confrontĂ©s au problĂšme de la signature de deux bundle ID avec un seul profil de provisionnement. Heureusement, il existe une solution simple et Ă©lĂ©gante : Wildcard App ID. RĂ©pĂ©tez la procĂ©dure de crĂ©ation d'un nouvel App ID, mais au lieu de Explicit App ID, choisissez Wildcard App ID comme sur la capture d'Ă©cran.

Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS

À ce stade, le travail avec developer.apple.com est terminĂ©, mais nous ne devons pas fermer la fenĂȘtre du navigateur. AccĂ©dez Ă  le site de documentation de Fastlane et lisez sur l'outil Match de A Ă  Z.

Le lecteur attentif aura remarqué que pour utiliser cet outil, nous aurons besoin d'un dépÎt privé et d'un compte ayant accÚs à la fois au programme Apple Developer et à Github. Créons (si ce n'est pas déjà fait) un compte de type InfrastructureAccount@your.company.domain, inventons un mot de passe puissant, inscrivons-le sur developer.apple.com et désignons-le comme administrateur du projet. Ensuite, accordez au compte l'accÚs au dépÎt github de votre entreprise et créez un nouveau dépÎt privé portant un nom comme AmazingAppMatch.

3. Configuration de Fastlane et de l'outil match

Ouvrez le terminal, accédez au dossier du projet et initialisez fastlane comme indiqué dans le manuel officiel. AprÚs avoir saisi la commande

$ fastlane init

vous serez invitĂ© Ă  sĂ©lectionner les configurations d'utilisation disponibles. Choisissez la quatriĂšme option — configuration manuelle du projet.

Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS

Un nouveau rĂ©pertoire fastlane est apparu dans le projet, contenant deux fichiers — Appfile et Fastfile. En quelques mots, dans Appfile, nous stockons des informations de service, et dans Fastfile, nous dĂ©crivons des jobs, appelĂ©s lanes dans la terminologie Fastlane. Je recommande la lecture de la documentation officielle : un, deux.

Ouvrez Appfile dans votre éditeur de texte préféré et mettez-le sous la forme suivante :

app_identifier "com.company.amazingapp"       # Identifiant du bundle
apple_dev_portal_id "infrastructureaccount@your.company.domain"  # Compte d'infrastructure créé, avec la permission de modifier le projet iOS dans le programme Apple Developer.
team_id "LSDY3IFJAY9" # Votre ID d'équipe sur le portail développeur

Retour à la terminal et, selon le manuel officiel, commençons à configurer match.

$ fastlane match init
$ fastlane match development

Ensuite, saisissons les informations demandées : dépÎt, compte, mot de passe, etc.

Important : Lors du premier lancement, l'outil match demandera le mot de passe pour déchiffrer le dépÎt. Il est trÚs important de conserver ce mot de passe, car il sera utile lors de la configuration du serveur CI !

Un nouveau fichier — Matchfile — a Ă©tĂ© créé dans le dossier fastlane. Ouvrons-le dans notre Ă©diteur de texte prĂ©fĂ©rĂ© et modifions-le comme suit :

git_url("https://github.com/YourCompany/AmazingAppMatch") # DépÎt privé créé pour stocker les certificats et profils.
type("development") # Le type par dĂ©faut, peut ĂȘtre : appstore, adhoc, enterprise ou development
app_identifier("com.company.amazingapp")
username("infrastructureaccount@your.company.domain") # Votre nom d'utilisateur pour le portail développeur Apple

Nous remplissons de cette maniÚre, si nous souhaitons par la suite utiliser match pour signer les builds à déployer sur Crashlytics et/ou AppStore, c'est-à-dire pour signer l'identifiant de bundle de votre application.

Mais, comme nous nous en souvenons, pour signer le build de test, nous avons créé un identifiant wildcard spécial. Donc, ouvrons Fastfile et ajoutons un nouveau lane :

lane :testing_build_for_firebase do

    match(
      type: "development",
      readonly: true,
      app_identifier: "com.company.*",
      git_branch: "uitests"  # Créons une branche séparée pour le certificat development pour signer le build de test.
    )

end

Enregistrer, entrer dans le terminal

fastlane testing_build_for_firebase

et nous voyons comment fastlane a créé un nouveau certificat et l'a placé dans le dépÎt. Super !

Ouvrons XCode. Maintenant, nous avons le profil de provisioning dont nous avons besoin, de type Match Development com.company.*, qui doit ĂȘtre spĂ©cifiĂ© dans la section Profil de provisioning pour les cibles AmazingApp et AmazingAppUITests.

Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS

Il nous reste à ajouter un lane pour la construction des tests. Allons dans dépÎt projet du plugin pour fastlane, facilitant la configuration de l'exportation vers Firebase Test Lab et suivons les instructions.

Copions-collons Ă  partir de l'exemple source, afin que notre lane testing_build_for_firebase ressemble finalement Ă  ceci :


 lane :testing_build_for_firebase do

    match(
      type: "development",
      readonly: true,
      app_identifier: "com.company.*",
      git_branch: "uitests"
    )

    scan(
      scheme: 'AmazingAppUITests',      # Schéma de test UI
      clean: true,                        # Recommandé : Cela garantirait que la build n'inclut pas de fichiers inutiles
      skip_detect_devices: true,          # Requis
      build_for_testing: true,            # Requis
      sdk: 'iphoneos',                    # Requis
      should_zip_build_products: true,     # Doit ĂȘtre vrai pour dĂ©finir le format correct pour Firebase Test Lab
    )

    firebase_test_lab_ios_xctest(
      gcp_project: 'AmazingAppUITests', # Nom de votre projet Google Cloud (nous reviendrons Ă  cette ligne plus tard)
      devices: [                          # Appareil(s) pour exécuter des tests
        {
          ios_model_id: 'iphonex',        # ID du modĂšle de l'appareil, voir la commande gcloud ci-dessus
          ios_version_id: '12.0',         # ID de la version iOS, voir la commande gcloud ci-dessus
          locale: 'en_US',                # Optionnel : par défaut à en_US si non défini
          orientation: 'portrait'         # Optionnel : par défaut à portrait si non défini
        }
      ]
    )

  end

Pour obtenir des informations complĂštes sur la configuration de fastlane dans CircleCI, je recommande la lecture de la documentation officielle. une fois, deux.

N'oublions pas d'ajouter une nouvelle tĂąche Ă  notre config.yml :

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     # met à jour les dépendances
     - run:
         name: install gcloud-sdk   # il est nécessaire d'installer gcloud sur la machine mac
         command: |
           ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"  /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  # lance la lane de construction et l'envoi dans firebase

4. Et notre environnement de test ? Configurons Firebase.

Passons maintenant à ce pour quoi cet article a été écrit.

Peut-ĂȘtre que votre application utilise Firebase sur un plan gratuit, peut-ĂȘtre ne l'utilise-t-elle pas du tout. Il n'y a absolument aucune diffĂ©rence fondamentale, car pour les besoins des tests, nous pouvons crĂ©er un projet distinct avec une annĂ©e d'utilisation gratuite (gĂ©nial, n'est-ce pas ?)

Connectons-nous à notre compte d'infrastructure (ou tout autre, peu importe), et allons à la page de la console Firebase.Créons un nouveau projet avec le nom AmazingAppUITests.

Important : À l'Ă©tape prĂ©cĂ©dente, dans Fastfile, dans la lane firebase_test_lab_ios_xctest, le paramĂštre gcp_project doit correspondre au nom du projet.

Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS

Les paramÚtres par défaut nous conviennent parfaitement.

Ne fermez pas l'onglet, sous le mĂȘme compte, inscrivez-vous Ă  Gcloud. C'est une mesure nĂ©cessaire, car la communication avec Firebase se fait via l'interface de la console gcloud.

Google offre 300 $ pour une année, ce qui, dans le cadre des tests automatisés, équivaut à une année d'utilisation gratuite du service. Nous saisissons les informations de paiement, attendons la transaction test de 1 $ et recevons 300 $ sur notre compte. AprÚs un an, le projet sera automatiquement transféré sur un plan tarifaire gratuit, donc il n'est pas nécessaire de s'inquiéter d'une éventuelle perte d'argent.

Retournez Ă  l'onglet du projet Firebase et changez pour le plan tarifaire Blaze — maintenant nous avons de quoi payer en cas de dĂ©passement du quota.

Dans l'interface gcloud, sélectionnez notre projet Firebase, allez dans le menu principal « Catalogue » et ajoutez l'API Cloud Testing et l'API Cloud Tools Result.

Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS

Ensuite, allez dans le menu « IAM et administration » -> Comptes de service -> Créer un compte de service. Accordez les droits d'édition du projet.

Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS

Créez une clé API au format JSON.

Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS

Le JSON téléchargé nous sera utile un peu plus tard, pour l'instant, considérons que la configuration de Test Lab est terminée.

5. Configuration de CircleCI

Une question lĂ©gitime se pose — que faire des mots de passe ? Pour sauvegarder en toute sĂ©curitĂ© nos mots de passe et autres donnĂ©es sensibles, nous utiliserons le mĂ©canisme des variables d'environnement de notre machine de build. Dans les paramĂštres du projet CircleCI, sĂ©lectionnez Variables d'environnement.

Lancement des tests d'outils dans Firebase Test Lab. Partie 1 : projet iOS
Et créez les variables suivantes :

  • key: GOOGLE_APPLICATION_CREDENTIALS
    value: contenu du fichier JSON de clé du compte de service gcloud
  • key: MATCH_PASSWORD
    value: mot de passe pour déchiffrer le dépÎt github avec les certificats
  • key: FASTLANE_PASSWORD
    value: mot de passe du compte d'infrastructure Apple Developer Portal

Enregistrez les modifications, créez un PR et envoyez-le pour révision à votre team lead.

Résultats

Grùce à ces manipulations simples, nous avons obtenu un bon stand fonctionnant de maniÚre stable avec la possibilité d'enregistrer une vidéo de l'écran de l'appareil lors des tests. Dans l'exemple de test, j'ai indiqué le modÚle d'appareil iPhone X, mais la ferme propose un large choix de combinaisons de différents modÚles et versions d'iOS.

La deuxiÚme partie sera consacrée à une configuration étape par étape de Firebase Test Lab pour un projet Android.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster