Automatische iOS-Screenshots mit XCTestplan und Xcode 11

In der Raiffeisenbank gibt es mehrere mobile Anwendungen, die auf einer Vielzahl von Geräten und Betriebssystemen funktionieren sollten. Daher versuchen wir, die Routineprozesse beim Testen zu automatisieren. Dieser Artikel schien uns nützlich zu sein, und wir beschlossen, ihn zu übersetzen. Fotoquelle: unsplash.com Wenn Ihre Anwendung mehrsprachig, universell und für verschiedene Geräte konzipiert ist, können Sie viel Zeit damit verbringen, Screenshots für jede Konfiguration zu erstellen. Stellen Sie sich vor, Sie haben vier Sprachen, unterstützen iPad und iPhone und müssen jeweils 4 Bildschirme speichern - das sind 32 Screenshots. Der Prozess muss automatisiert werden, um nicht jedes Mal Zeit zu verschwenden, wenn die Schnittstellen aktualisiert werden.






Mit dem in Xcode 11 enthaltenen XCTestPlan-Tool können wir verschiedene Konfigurationen für Tests erstellen. Heutzutage werden Konfigurationen am häufigsten verwendet, um zu bestimmen, wie Tests ausgeführt werden, einschließlich der Wahl der Sprache für die Anwendung. In diesem Artikel erfahren Sie, wie Sie mit XCTestPlan Screenshots automatisieren.

Starten Sie XCTestplan


Richten Sie ein separates UITests-Ziel ein, um die Erstellung von Screenshots zu automatisieren. Dies ist besonders nützlich, wenn Sie nicht vorhaben, Ihre Haupttests mit diesen Konfigurationen auszuführen. Um ein neues Ziel zu erstellen, wählen Sie Datei -> Neu -> Ziel und erstellen Sie ein neues UI-Testpaket . Danach müssen Sie diesem Ziel einen neuen XCTestplan hinzufügen . Dazu können Sie entweder das Menü Produkt -> Testplan -> Neuer Testplan verwenden oder im Schema-Editor Konvertieren, um Testpläne zu verwenden . Wenn Sie dies über das Menü tun, müssen Sie sicherstellen, dass sich das neue Ziel auf der Registerkarte "Test" befindet.

Da wir nur die Spracheinstellungen konfigurieren möchten, können wir die freigegebenen Einstellungen unverändert lassen und einfach eine neue Konfiguration für jede von uns unterstützte Sprache hinzufügen. So sehen die Einstellungen für eine Anwendung aus, die Englisch, Deutsch und Französisch unterstützt:

Bild

Dies ist die notwendige Einrichtung und der Start von XCTestplan.

Screenshot-Automatisierung


Ihre UI-Tests, die Screenshots erstellen, unterscheiden sich praktisch nicht von Ihren üblichen Tests, außer dass sie Anhänge erstellen. Sie können auch XCTAssert-Prüfungen hinzufügen, damit die Tests fehlschlagen, wenn etwas schief geht.

Ein weiterer wichtiger Punkt: Möglicherweise müssen Sie auf Expectations warten, falls Ihre Benutzeroberfläche zum Zeitpunkt der Aufnahme des Screenshots noch nicht bereit ist ( Ein- / Ausblenden der Tastatur , Abschluss der Animation).

Unten finden Sie ein Beispiel mit allen Hilfsmethoden:

func testScreenshots() {
    let app = XCUIApplication()
    let searchButton = app.buttons["search"]
    searchButton.tap()
    
    let keyboard = app.keyboards.firstMatch
    waitForExistence(of: keyboard)
    app.typeText("Cupertino")
    add(takePromoShot(name: "Search"))
    
    let firstResult = app.cells.firstMatch
    firstResult.tap()
    waitForDisappearance(of: keyboard)
    add(takePromoShot(name: "Result"))
}

func waitForExistence(of element: XCUIElement) {
    let predicate = NSPredicate(format: "exists == TRUE")
    expectation(for: predicate, evaluatedWith: element, handler: nil)
    waitForExpectations(timeout: 5.0, handler: nil)
}

func waitForDisappearance(of element: XCUIElement) {
    let predicate = NSPredicate(format: "exists == FALSE")
    expectation(for: predicate, evaluatedWith: element, handler: nil)
    waitForExpectations(timeout: 5.0, handler: nil)
}

func takePromoShot(name: String) -> XCTAttachment {
    let lang = Locale.preferredLanguages[0]
    let screenshot = XCUIScreen.main.screenshot()
    let attachment = XCTAttachment(screenshot: screenshot)
    attachment.lifetime = .keepAlways
    attachment.name = "\(lang)-\(name)"
    return attachment
}

Achten Sie auf die neueste Funktion. Es nimmt den Namen des Snapshots an, fügt die Sprachkennung hinzu, macht einen Screenshot und gibt ein XCTAttachment mit dem Wert des Parameters .keepAlways zurück . Dies ist wichtig, da Screenshots, die während der Tests erstellt wurden, standardmäßig gelöscht werden, wenn die Tests erfolgreich sind. Lifiteme ist ein wichtiger Parameter, da es sicherstellt, dass der Screenshot nach Abschluss des Tests gespeichert wird. Während der UI-Tests werden ständig Screenshots gemacht. Sie sind sehr nützlich, wenn Sie feststellen müssen, warum und wann der Test gefallen ist. Standardmäßig werden die Screenshots jedoch gelöscht, wenn die Tests erfolgreich waren. Wenn testScreenshots () erfolgreich ist, haben Sie nur die erforderlichen Screenshots.

Gewohnheitsstatusleiste


Die meisten Entwickler bevorzugen es, auf ihren Screenshots eine Statusleiste mit der richtigen Zeit, ein vollständiges Netzwerksignal und andere Details anzuzeigen. In Xcode 11 wird dies noch einfacher. Es gibt ein Dienstprogramm xcrun simctl status_bar , mit dem Sie diese Einstellungen festlegen können. Dies kann als Erstellungsphase hinzugefügt werden :

xcrun simctl status_bar booted override --time 9:41 --operatorName ' ' --cellularMode active --cellularBar 4 --wifiBars 3 --batteryState charged

Nach diesem Befehl sieht die Statusleiste genauso aus wie in den Marketingmaterialien von Apple. Leider wird das Team nicht auf einem realen Gerät arbeiten, sondern nur in einem Simulator. Es sollte auch beachtet werden, dass der von Ihnen verwendete Simulator ausgeführt werden muss, bevor Sie die Tests starten, um Screenshots zu sammeln.

Sammeln der resultierenden Screenshots


Jetzt können wir unsere UI-Tests ausführen. Wenn sie bestanden haben, werden die Ergebnisse im Berichtsnavigator in Xcode angezeigt. Es wird auch Tests geben, die Verfahren enthalten, die nach Sprachkonfigurationen gruppiert sind. Verfahren mit Anhängen sind mit einer Büroklammer gekennzeichnet. Bilder selbst können in QuickLook geöffnet werden .

Bild

Das separate Sammeln aller resultierenden Bilder kann sehr zeitaufwändig sein, insbesondere wenn Ihre Anwendung viele Sprachen unterstützt. Leider werden diese Anhänge in den Testergebnissen nicht als PNG oder JPG angezeigt (eine weitere Änderung in Xcode 11). Sie können jedoch die Testergebnisse analysieren und den JSON finden, der auf die tatsächlichen Anhänge verweist, und diese sammeln. Dies kann mit dem Dienstprogramm xcparse erfolgen.. Es wird mit Homebrew installiert und mit dem folgenden Befehl gestartet:

xcparse screenshots /path/to/Test.xcresult /path/to/outputDirectory

Zusätzliche Flags gruppieren Dateien nach Gerät, Betriebssystem oder Konfiguration. Die Namen unserer Dateien enthalten eine Sprachkennung, sodass Sie sie einfach nach Namen sortieren können.

Fazit


Der beschriebene Ansatz hat es uns bereits ermöglicht, genügend Zeit zu sparen, insbesondere in Situationen, in denen das Gerät mit einer neuen Auflösung unterstützt werden musste oder die Schnittstelle erheblich aktualisiert wurde. Bei WWDC20 möchte ich die Auswahl der Geräte als Teil der XCTestplan-Konfiguration sehen, aber im Moment müssen Sie manuell auswählen oder ein Skript verwenden, das die erforderlichen Screenshots im AppStore sammelt.

All Articles