Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt

Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt

Mein Name ist Dmitry, ich arbeite als Tester im Unternehmen MEL-Wissenschaft. Vor Kurzem habe ich mich mit einer relativ neuen Funktion von beschäftigt Firebase-Testlabor – nämlich mit instrumentellem Testen von iOS-Anwendungen mithilfe des nativen Test-Frameworks XCUITest.

Zuvor hatte ich Firebase Test Lab für Android bereits ausprobiert und alles gefiel mir sehr gut, also beschloss ich, zu versuchen, die iOS-Testinfrastruktur des Projekts auf die gleiche Grundlage zu stellen. Ich musste viel googeln und beim ersten Mal hat nicht alles geklappt, also habe ich beschlossen, einen Tutorial-Artikel für diejenigen zu schreiben, die immer noch Probleme haben.

Wenn Sie also UI-Tests für ein iOS-Projekt haben, können Sie diese bereits heute auf echten Geräten ausführen, freundlicherweise zur Verfügung gestellt von Good Corporation. Interessierte herzlich willkommen bei cat.

In der Geschichte habe ich beschlossen, auf einigen ersten Daten aufzubauen – einem privaten Repository auf GitHub und dem CircleCI-Build-System. Der Anwendungsname lautet AmazingApp, die Bundle-ID lautet com.company.amazingapp. Ich präsentiere diese Daten sofort, um spätere Verwirrung zu vermeiden.

Wenn Sie bestimmte Lösungen in Ihrem Projekt anders umgesetzt haben, teilen Sie Ihre Erfahrungen in den Kommentaren.

1. Die Tests selbst

Erstellen Sie einen neuen Projektzweig für UI-Tests:

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

Öffnen wir das Projekt in XCode und erstellen wir ein neues Target mit UI-Tests [XCode -> Datei -> Neu -> Target -> iOS Testing Bundle] und geben ihm den selbsterklärenden Namen AmazingAppUITests.

Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt

Gehen Sie zum Abschnitt „Build-Phasen“ des erstellten Ziels und prüfen Sie, ob Zielabhängigkeiten – AmazingApp, in Kompilierungsquellen – AmazingAppUITests.swift vorhanden sind.

Eine gute Vorgehensweise besteht darin, verschiedene Build-Optionen in separate Schemata zu unterteilen. Wir erstellen ein Schema für unsere UI-Tests [XCode -> Produkt -> Schema -> Neues Schema] und geben ihm den gleichen Namen: AmazingAppUITests.

Der Build des erstellten Schemas muss das Ziel der Hauptanwendung (AmazingApp) und die Target-UI-Tests (AmazingAppUITests) enthalten – siehe Screenshot

Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt

Als nächstes erstellen wir eine neue Build-Konfiguration für UI-Tests. Klicken Sie in XCode auf die Projektdatei und gehen Sie zum Abschnitt „Info“. Klicken Sie auf „+“ und erstellen Sie eine neue Konfiguration, zum Beispiel XCtest. Das werden wir in Zukunft brauchen, um beim Code Signing nicht mit dem Tamburin tanzen zu müssen.

Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt

In Ihrem Projekt gibt es mindestens drei Targets: die Hauptanwendung, Unit-Tests (schließlich gibt es sie, oder?) und die von uns erstellten Target-UI-Tests.

Gehen Sie zu Target AmazingApp, Registerkarte „Build-Einstellungen“, Abschnitt „Code Signing Identity“. Wählen Sie für die XCtest-Konfiguration iOS Developer aus. Wählen Sie im Abschnitt „Codesignaturstil“ die Option „Manuell“ aus. Wir haben noch kein Bereitstellungsprofil erstellt, werden aber später auf jeden Fall darauf zurückkommen.

Für Target AmazingAppUITests machen wir dasselbe, aber in der Spalte Product Bundle Identifier geben wir com.company.amazingappuitests ein.

2. Einrichten eines Projekts im Apple Developer Program

Gehen Sie zur Seite des Apple Developer Program, gehen Sie zum Abschnitt „Zertifikate, Identifikatoren und Profile“ und dann zur Spalte „App-IDs“ des Elements „Identifikatoren“. Erstellen Sie eine neue App-ID mit dem Namen AmazingAppUITests und der Bundle-ID com.company.amazingappuitests.

Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt

Jetzt haben wir die Möglichkeit, unsere Tests mit einem separaten Zertifikat zu signieren, aber ... Das Verfahren zum Zusammenstellen eines Builds zum Testen umfasst das Zusammenstellen der Anwendung selbst und des Testläufers. Dementsprechend stehen wir vor dem Problem, zwei Bundle-IDs mit einem Bereitstellungsprofil zu signieren. Glücklicherweise gibt es eine einfache und elegante Lösung – Wildcard App ID. Wir wiederholen den Vorgang zum Erstellen einer neuen App-ID, wählen jedoch anstelle der expliziten App-ID die Wildcard-App-ID aus, wie im Screenshot.

Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt

An diesem Punkt sind wir mit der Arbeit mit Developer.Apple.com fertig, aber wir werden das Browserfenster nicht minimieren. Lass uns gehen Fastlane-Dokumentationsseite und lesen Sie von Anfang bis Ende mehr über das Match-Dienstprogramm.

Ein aufmerksamer Leser bemerkte, dass wir zur Nutzung dieses Dienstprogramms ein privates Repository und ein Konto mit Zugriff sowohl auf das Apple Developer Program als auch auf Github benötigen. Wir erstellen (falls es so etwas plötzlich nicht mehr gibt) ein Konto des Formulars [E-Mail geschützt] , überlegen Sie sich ein sicheres Passwort, registrieren Sie es bei Developer.apple.com und ernennen Sie es zum Projektadministrator. Als Nächstes gewähren wir dem Konto Zugriff auf das Github-Repository Ihres Unternehmens und erstellen ein neues privates Repository mit einem Namen wie AmazingAppMatch.

3. Einrichten von Fastlane und dem Match-Dienstprogramm

Öffnen Sie ein Terminal, gehen Sie zum Ordner mit dem Projekt und initialisieren Sie Fastlane wie in angegeben offizielles Handbuch. Nach Eingabe des Befehls

$ fastlane init

Sie werden aufgefordert, die verfügbaren Nutzungskonfigurationen auszuwählen. Wählen Sie die vierte Option – manuelle Projekteinrichtung.

Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt

Das Projekt verfügt über ein neues Verzeichnis fastlane, das zwei Dateien enthält – Appfile und Fastfile. Kurz gesagt: Wir speichern Servicedaten in Appfile und schreiben Jobs in Fastfile, in der Fastlane-Terminologie Lanes genannt. Ich empfehle die Lektüre der offiziellen Dokumentation: Zeit, два.

Öffnen Sie die App-Datei in Ihrem bevorzugten Texteditor und bringen Sie sie in die folgende Form:

app_identifier "com.company.amazingapp"       # Bundle ID
apple_dev_portal_id "[email protected]"  # Созданный инфраструктурный аккаунт, имеющий право на редактирование iOS проекта в Apple Developer Program.
team_id "LSDY3IFJAY9" # Your Developer Portal Team ID

Wir kehren zum Terminal zurück und beginnen gemäß dem offiziellen Handbuch mit der Konfiguration des Spiels.

$ fastlane match init
$ fastlane match development

Geben Sie als Nächstes die angeforderten Daten ein – Repository, Konto, Passwort usw.

Wichtig: Wenn Sie das Match-Dienstprogramm zum ersten Mal starten, werden Sie aufgefordert, ein Passwort einzugeben, um das Repository zu entschlüsseln. Es ist sehr wichtig, dieses Passwort zu speichern, wir benötigen es beim Einrichten des CI-Servers!

Im Fastlane-Ordner ist eine neue Datei aufgetaucht – Matchfile. Öffnen Sie es in Ihrem bevorzugten Texteditor und zeigen Sie es wie folgt an:

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("[email protected]") # Your Infrastructure account Apple Developer Portal username

Wir füllen es genau so aus, wenn wir match in Zukunft zum Signieren von Builds für die Veröffentlichung in Crashlytics und/oder AppStore verwenden möchten, also zum Signieren der Bundle-ID Ihrer Anwendung.

Aber wie wir uns erinnern, haben wir eine spezielle Wildcard-ID erstellt, um den Test-Build zu signieren. Öffnen Sie daher Fastfile und geben Sie eine neue Spur ein:

lane :testing_build_for_firebase do

    match(
      type: "development",
      readonly: true,
      app_identifier: "com.company.*",
      git_branch: "uitests"  # создаем отдельный бранч для development сертификата для подписи тестовой сборки.
    )

end

Speichern und ins Terminal eingeben

fastlane testing_build_for_firebase

und wir sehen, wie Fastlane ein neues Zertifikat erstellt und im Repository abgelegt hat. Großartig!

Öffnen Sie XCode. Jetzt haben wir das erforderliche Bereitstellungsprofil der Form „Match Development com.company.*“, das im Abschnitt „Bereitstellungsprofil“ für die Ziele „AmazingApp“ und „AmazingAppUITests“ angegeben werden muss.

Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt

Es bleibt noch eine Spur für die Montagetests hinzuzufügen. Lass uns gehen Repository Ein Plugin-Projekt für Fastlane, das es einfacher macht, den Export ins Firebase Test Lab einzurichten und den Anweisungen zu folgen.

Lassen Sie uns das ursprüngliche Beispiel kopieren und einfügen, sodass unsere Spur „testing_build_for_firebase“ am Ende so aussieht:


 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

Für umfassende Informationen zum Einrichten von Fastlane in CircleCI empfehle ich die Lektüre der offiziellen Dokumentation mal, два.

Vergessen Sie nicht, unserer config.yml eine neue Aufgabe hinzuzufügen:

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. Wie sieht es mit unserem Prüfstand aus? Firebase einrichten.

Kommen wir zu dem, wofür der Artikel geschrieben wurde.

Möglicherweise nutzt Ihre App Firebase im Rahmen eines kostenlosen Tarifs oder auch überhaupt nicht. Es gibt absolut keinen grundlegenden Unterschied, denn für Testzwecke können wir ein separates Projekt mit einem Jahr kostenloser Nutzung erstellen (cool, oder?)

Wir melden uns bei unserem Infrastrukturkonto an (oder einem anderen, egal) und gehen zu Firebase-Konsolenseite. Erstellen Sie ein neues Projekt mit dem Namen AmazingAppUITests.

Wichtig: Im vorherigen Schritt im Fastfile in der Spur firebase_test_lab_ios_xctest sollte der Parameter gcp_project mit dem Projektnamen übereinstimmen.

Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt

Die Standardeinstellungen gefallen uns ganz gut.

Schließen Sie die Registerkarte nicht, sondern registrieren Sie sich unter demselben Konto in Gcloud - Dies ist eine notwendige Maßnahme, da die Kommunikation mit Firebase über die gcloud-Konsolenschnittstelle erfolgt.

Google spendet 300 US-Dollar für ein Jahr, was im Rahmen der Durchführung von Autotests einem Jahr kostenloser Nutzung des Dienstes entspricht. Wir geben Ihre Zahlungsinformationen ein, warten auf die Testabbuchung von 1 $ und erhalten 300 $ auf Ihr Konto. Nach einem Jahr wird das Projekt automatisch in einen kostenlosen Tarifplan überführt, sodass Sie sich keine Sorgen über mögliche Geldverluste machen müssen.

Kehren wir zum Tab mit dem Firebase-Projekt zurück und übertragen es auf den Blaze-Tarif – jetzt haben wir etwas zu zahlen, wenn das Limit überschritten wird.

Wählen Sie in der gcloud-Oberfläche unser Firebase-Projekt aus, wählen Sie den Hauptmenüpunkt „Verzeichnis“ und fügen Sie die Cloud Testing API und die Cloud Tools Result API hinzu.

Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt

Gehen Sie dann zum Menüpunkt „IAM und Verwaltung“ -> Dienstkonten -> Dienstkonto erstellen. Wir gewähren Rechte zur Bearbeitung des Projekts.

Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt

Erstellen Sie einen API-Schlüssel im JSON-Format

Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt

Wir werden das heruntergeladene JSON etwas später benötigen, aber vorerst gehen wir davon aus, dass die Einrichtung des Testlabors abgeschlossen ist.

5. CircleCI einrichten

Es stellt sich die berechtigte Frage: Was tun mit Passwörtern? Der Umgebungsvariablenmechanismus unserer Build-Maschine hilft uns dabei, unsere Passwörter und andere sensible Daten sicher zu speichern. Wählen Sie in den CircleCI-Projekteinstellungen Umgebungsvariablen aus

Wir führen instrumentelle Tests im Firebase Test Lab durch. Teil 1: iOS-Projekt
Und richten Sie die folgenden Variablen ein:

  • Schlüssel: GOOGLE_APPLICATION_CREDENTIALS
    Wert: Inhalt der JSON-Datei des gcloud-Dienstkontoschlüssels
  • Schlüssel: MATCH_PASSWORD
    Wert: Passwort zum Entschlüsseln des Github-Repositorys mit Zertifikaten
  • Schlüssel: FASTLANE_PASSWORD
    Wert: Passwort für das Apple Developer Portal-Infrastrukturkonto

Wir speichern die Änderungen, erstellen eine PR und senden sie zur Überprüfung an unseren Teamleiter.

Ergebnisse

Als Ergebnis dieser einfachen Handgriffe erhielten wir zum Testzeitpunkt einen guten, stabilen Arbeitsständer mit der Möglichkeit, Videos auf dem Gerätebildschirm aufzunehmen. Im Testbeispiel habe ich das Gerätemodell iPhone X angegeben, die Farm bietet jedoch eine reichhaltige Auswahl aus einer Kombination verschiedener Modelle und iOS-Versionen.

Der zweite Teil ist der schrittweisen Einrichtung des Firebase Test Lab für ein Android-Projekt gewidmet.

Source: habr.com

Kommentar hinzufügen