Führen Sie Instrumententests im Firebase-Testlabor durch. Teil 1: iOS-Projekt

Bild

Mein Name ist Dmitry, ich arbeite als Tester bei MEL Science . Zuletzt beschäftigte ich mich mit einer relativ neuen Funktion aus dem Firebase- Testlabor - nämlich dem instrumentellen Testen von iOS-Anwendungen mit dem nativen XCUITest-Testframework.

Zuvor hatte ich bereits das Firebase Test Lab für Android ausprobiert und mir hat wirklich alles gefallen. Deshalb habe ich beschlossen, die Testinfrastruktur des iOS-Projekts auf die gleiche Spur zu bringen. Ich musste viel googeln und nicht alles hat beim ersten Mal richtig funktioniert, also habe ich beschlossen, einen Tutorial-Artikel für diejenigen zu schreiben, die es noch müssen.

Wenn Sie also UI-Tests für ein iOS-Projekt haben, können Sie versuchen, diese heute auf realen Geräten zu starten, die freundlicherweise von Good Corporation bereitgestellt werden. Interessiert - willkommen bei Katze.

In der Geschichte habe ich beschlossen, auf einigen Quelldaten aufzubauen - einem privaten Repository auf GitHub und dem CircleCI-Build-System. Der Name der Anwendung lautet AmazingApp, bundleID lautet com.company.amazingapp. Ich zitiere diese Daten sofort, um die nachfolgende Verwirrung zu verringern.

Wenn Sie unterschiedliche Lösungen in Ihrem Projekt unterschiedlich implementiert haben, teilen Sie Ihre Erfahrungen in den Kommentaren mit.

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 Sie das Projekt in Xcode und erstellen Sie ein neues Ziel mit den UI-Tests [XCode -> Datei -> Neu -> Ziel -> iOS-Testpaket]. Geben Sie ihm den sprechenden Namen AmazingAppUITests.

Bild

Gehen Sie zum Abschnitt "Erstellungsphasen" des erstellten Ziels und überprüfen Sie, ob Zielabhängigkeiten - AmazingApp - in "Quellen kompilieren - AmazingAppUITests.swift" vorhanden sind.

Es wird empfohlen, die verschiedenen Montageoptionen in separate Schemata zu isolieren. Wir erstellen ein Schema für unsere UI-Tests [XCode -> Produkt -> Schema -> Neues Schema] und geben ihm den gleichen Namen: AmazingAppUITests.

Das erstellte Schema sollte das Ziel der Hauptanwendung enthalten - AmazingApp- und Target-UI-Tests - AmazingAppUITests - siehe Screenshot

Bild

Erstellen Sie als Nächstes 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. Wir werden dies in Zukunft brauchen, um zu vermeiden, dass beim Signieren von Codes mit einem Tamburin getanzt wird.

Bild

Ihr Projekt hat mindestens drei Ziele: die Hauptanwendung, Komponententests (weil sie es sind, richtig?) Und die von uns erstellten Ziel-UI-Tests.

Gehen Sie zu Target AmazingApp, Registerkarte Build Settings, Code Signing Identity. Um XCtest zu konfigurieren, wählen Sie iOS Developer. Wählen Sie im Abschnitt Code Signing Style die Option Manual aus. Wir haben das Provisioning-Profil noch nicht erstellt, werden aber etwas später definitiv 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


Wir gehen zur Seite "Apple Developer Program", gehen zum Abschnitt "Zertifikate, Kennungen und Profile" und dann zur Spalte "App-IDs" des Elements "Kennungen". Erstellen Sie eine neue App-ID mit dem Namen AmazingAppUITests und bundleID com.company.amazingappuitests.

Bild

Jetzt haben wir die Möglichkeit, unsere Tests mit einem separaten Zertifikat zu signieren, aber ... Das Erstellungsverfahren zum Testen umfasst das Erstellen der Anwendung selbst und das Erstellen 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 Platzhalter-App-ID wie im Screenshot aus.

Bild

Wir haben zu diesem Zeitpunkt die Arbeit mit developer.apple.com beendet, aber das Browserfenster wird nicht minimiert. Wir besuchen die Website mit der Dokumentation zu Fastlane und lesen das Match-Dienstprogramm von Anfang bis Ende.

Ein aufmerksamer Leser bemerkte, dass wir zur Verwendung dieses Dienstprogramms ein privates Repository und ein Konto benötigen, das Zugriff auf das Apple Developer Program und Github hat. Wir erstellen (falls dies plötzlich nicht mehr der Fall ist) ein Konto in der Form InfrastructureAccount@your.company.domain, erstellen ein leistungsstarkes Kennwort, registrieren es in developer.apple.com und ernennen es zum Projektadministrator. Geben Sie Ihrem Konto als Nächstes Zugriff auf das Github-Repository Ihres Unternehmens und erstellen Sie ein neues privates Repository mit einem Namen wie AmazingAppMatch.

3. Konfigurieren von Fastlane und des Match-Dienstprogramms


Öffnen Sie das Terminal, gehen Sie zum Projektordner und initialisieren Sie die Fastlane wie im offiziellen Handbuch angegeben . Nach Eingabe des Befehls

 $ fastlane init 

Sie werden aufgefordert, verfügbare Nutzungskonfigurationen auszuwählen. Wir wählen den vierten Punkt - manuelle Projekteinrichtung.

Bild

Im Projekt wurde ein neues Fastlane-Verzeichnis angezeigt, in dem sich zwei Dateien befinden - Appfile und Fastfile. Kurz gesagt: In der App-Datei speichern wir Servicedaten und in Fastfile schreiben wir Jobs in der Fastlane-Terminologie, die als Lanes bezeichnet wird. Ich empfehle die offizielle Dokumentation zu lesen: eins , zwei .

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

 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 

Wir kehren zum Terminal zurück und beginnen gemäß dem offiziellen Handbuch, die Übereinstimmung zu konfigurieren.

 $ 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 Kennwort einzugeben, um das Repository zu entschlüsseln. Es ist sehr wichtig, dieses Passwort beizubehalten. Bei der Einrichtung des CI-Servers ist es für uns hilfreich!

Eine neue Datei wurde im Fastlane-Ordner - Matchfile - angezeigt. Öffnen Sie in Ihrem bevorzugten Texteditor und bringen Sie zum Formular:

 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 

Wir füllen es auf diese Weise aus, wenn wir Match verwenden möchten, um Builds für die Veröffentlichung in Crashlytics und / oder AppStore zu signieren, d. H. Um die Bundle-ID Ihrer Anwendung zu signieren.

Wie wir uns erinnern, haben wir zum Erstellen eines Testbuilds eine spezielle Wildcard-ID erstellt. Ö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, in das Terminal eingeben

 fastlane testing_build_for_firebase 

und sehen Sie, wie fastlane ein neues Zertifikat erstellt und in das Repository gestellt hat. Großartig!

Öffnen Sie Xcode. Jetzt haben wir das erforderliche Bereitstellungsprofil des Unternehmens Match Development com.company. *, Das im Abschnitt Bereitstellungsprofil für die Ziele AmazingApp und AmazingAppUITests angegeben werden muss.

Bild

Es bleibt noch eine Spur hinzuzufügen, um die Tests zu erstellen. Wir gehen zum Repository des Plugin-Projekts für Fastlane, das die Konfiguration des Exports in das Firebase-Testlabor erleichtert und den Anweisungen folgt.

Kopieren Sie aus dem Originalbeispiel, damit unsere Lane testing_build_for_firebase schließlich 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 

Um vollständige Informationen zum Konfigurieren von Fastlane in CircleCI zu erhalten, empfehle ich, die offizielle Dokumentation eins, zwei zu lesen.

Vergessen Sie nicht, unsere config.yml mit einer neuen 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. Aber was ist mit unserem Prüfstand? Konfigurieren Sie Firebase.


Wir gehen tatsächlich zu dem über, wofür der Artikel geschrieben wurde.

Möglicherweise verwendet Ihre Anwendung Firebase für einen kostenlosen Tarifplan, möglicherweise wird sie überhaupt nicht verwendet. Es gibt absolut keinen grundsätzlichen Unterschied, denn für Testzwecke können wir ein separates Projekt mit einem Jahr kostenloser Nutzung erstellen (cool, oder?)

Melden Sie sich bei unserem Infrastrukturkonto an (oder einem anderen, kein Unterschied) und rufen Sie die Firebase-Konsolenseite auf . Erstellen Sie ein neues Projekt namens AmazingAppUITests.

Wichtig: Im vorherigen Schritt im Fastfile in der Spur firebase_test_lab_ios_xctest muss der Parameter gcp_project mit dem Namen des Projekts übereinstimmen.

Bild

Die Standardeinstellungen sind bei uns ganz in Ordnung.

Wir schließen die Registerkarte nicht unter demselben Konto, das wir in Gcloud registrieren. Dies ist eine notwendige Maßnahme, da die Kommunikation mit Firebase über die gcloud-Konsolenschnittstelle erfolgt.

Google gibt 300 US-Dollar pro Jahr aus, was im Zusammenhang mit der Durchführung von Autotests einem Jahr der kostenlosen Nutzung des Dienstes entspricht. Wir geben die Zahlungsdaten ein, warten auf die Testgebühr von 1 USD und erhalten 300 USD auf das Konto. Nach einem Jahr wird das Projekt automatisch in einen kostenlosen Tarifplan übertragen, sodass Sie sich keine Sorgen über einen möglichen Geldverlust machen sollten.

Kehren wir mit dem Firebase-Projekt zur Registerkarte zurück und übertragen Sie sie in den Blaze-Tarifplan. Jetzt müssen wir etwas bezahlen, falls das Limit überschritten wird.

Wählen Sie in der gcloud-Oberfläche unser Firebase-Projekt aus, wählen Sie den Hauptmenüpunkt "Katalog" und fügen Sie die Cloud-Test-API und die Cloud-Tools-Ergebnis-API hinzu.

Bild

Gehen Sie dann zum Menüpunkt "IAM und Administration" -> Dienstkonten -> Dienstkonto erstellen. Wir geben das Recht, das Projekt zu bearbeiten.

Bild

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

Bild

Wir werden den heruntergeladenen JSON etwas später benötigen, aber vorerst werden wir das Test Lab-Setup als abgeschlossen betrachten.

5. Konfigurieren Sie CircleCI


Eine vernünftige Frage ist das Brauen - was tun mit Passwörtern? Das zuverlässige Speichern unserer Passwörter und anderer vertraulicher Daten hilft uns beim Mechanismus der Umgebungsvariablen unserer Build-Maschine. Wählen Sie in den Einstellungen des CircleCI-Projekts Umgebungsvariablen aus

Bild
Und starten Sie die folgenden Variablen:

  • Schlüssel: GOOGLE_APPLICATION_CREDENTIALS
    Wert: Schlüsseldatei des gcloud-Dienstkontos json
  • Schlüssel: MATCH_PASSWORD
    value: Passwort zum Entschlüsseln des Github-Repositorys mit Zertifikaten
  • Schlüssel: FASTLANE_PASSWORD
    Wert: Kennwort für das Apple Developer Portal-Infrastrukturkonto

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

Zusammenfassung


Als Ergebnis dieser einfachen Manipulationen haben wir einen guten, stabilen Arbeitsstand mit der Fähigkeit erhalten, zum Zeitpunkt des Tests Videos auf dem Bildschirm des Geräts aufzuzeichnen. In einem Testfall habe ich ein iPhone X-Gerätemodell angegeben, aber die Farm bietet eine große Auswahl an Kombinationen verschiedener Modelle und Versionen von iOS.

Der zweite Teil ist der schrittweisen Konfiguration des Firebase-Testlabors für ein Android-Projekt gewidmet.

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


All Articles