Captures d'écran iOS automatiques à l'aide de XCTestplan et Xcode 11

Raiffeisenbank possède plusieurs applications mobiles qui devraient fonctionner sur une grande variété d'appareils et de systèmes d'exploitation, nous essayons donc d'automatiser les processus de routine lors des tests. Cet article nous a semblé utile et nous avons décidé de le traduire. foto source: unsplash.com Si votre application est multilingue, universelle et conçue pour différents appareils, vous pouvez passer beaucoup de temps à créer des captures d'écran pour chaque configuration. Imaginez que vous avez quatre langues, la prise en charge de l'iPad et de l'iPhone et que vous devez enregistrer 4 écrans chacun - ce sont 32 captures d'écran. Le processus doit être automatisé afin de ne pas perdre de temps à chaque mise à jour des interfaces.






L'outil XCTestPlan, apparu dans Xcode 11, nous permet de créer plusieurs configurations pour les tests. De nos jours, les configurations sont le plus souvent utilisées pour déterminer le déroulement des tests, y compris le choix de la langue pour l'application. Dans cet article, vous apprendrez à utiliser XCTestPlan pour automatiser les captures d'écran.

Lancer XCTestplan


Configurons une cible UITests distincte pour automatiser la création de captures d'écran, ce qui est particulièrement utile si vous ne prévoyez pas d'exécuter vos principaux tests avec ces configurations. Pour créer une nouvelle cible, sélectionnez Fichier -> Nouveau -> Cible et créez un nouvel ensemble de tests d'interface utilisateur . Après cela, vous devez ajouter un nouveau XCTestplan à cette cible. Pour ce faire, vous pouvez utiliser le menu Produit -> Plan de test -> Nouveau plan de test , ou dans l' éditeur de schéma, sélectionnez Convertir pour utiliser les plans de test . Si vous faites cela via le menu, vous devez vous assurer que la nouvelle cible est dans l'onglet `Test`.

Puisque nous voulons configurer uniquement les paramètres de langue, nous pouvons laisser les paramètres partagés inchangés et simplement ajouter une nouvelle configuration pour chaque langue que nous prenons en charge. Voici à quoi ressemblent les paramètres d'une application prenant en charge l'anglais, l'allemand et le français:

image

c'est toute la configuration et le lancement nécessaires de XCTestplan.

Capture d'écran Automation


Vos tests d'interface utilisateur créant des captures d'écran ne différeront pratiquement pas de vos tests habituels, sauf qu'ils créeront des pièces jointes. Vous pouvez également ajouter des vérifications XCTAssert afin que les tests échouent en cas de problème.

Un autre point important: vous devrez peut-être attendre ForExpectations au cas où votre interface utilisateur ne serait pas prête au moment de la capture d'écran ( afficher / masquer le clavier, terminer l'animation).

Voici un exemple avec toutes les méthodes d'assistance:

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
}

Faites attention à la dernière fonctionnalité. Il prend le nom de l'instantané, ajoute l'identifiant de langue, prend une capture d'écran et renvoie un XCTAttachment avec la valeur du paramètre .keepAlways . Ceci est important car par défaut, les captures d'écran prises lors des tests sont supprimées si les tests réussissent. Lifiteme est un paramètre important car il garantit que la capture d'écran est enregistrée une fois le test terminé. Pendant les tests d'interface utilisateur, des captures d'écran sont constamment prises. Ils sont très utiles lorsque vous devez déterminer pourquoi et quand le test a échoué; mais par défaut, les captures d'écran seront supprimées si les tests ont réussi. Ainsi, lorsque testScreenshots () réussit, vous n'aurez que les captures d'écran nécessaires.

Barre d'état habituelle


La plupart des développeurs préfèrent voir sur leurs captures d'écran une barre d'état avec le bon moment, un signal réseau complet et d'autres détails. Dans Xcode 11, cela est encore plus facile. Il existe un utilitaire xcrun simctl status_bar , qui vous permet de spécifier ces paramètres. Cela peut être ajouté en tant que phase de construction :

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

Après cette commande, la barre d'état aura la même apparence que dans les documents marketing d'Apple. Malheureusement, l'équipe ne fonctionnera pas sur un véritable appareil, uniquement dans un simulateur. Il convient également de noter que le simulateur que vous utilisez doit être en cours d'exécution avant de commencer les tests pour collecter des captures d'écran.

Collecte des captures d'écran résultantes


Nous pouvons maintenant exécuter nos tests d'interface utilisateur. Quand ils passeront, nous verrons les résultats dans Report Navigator dans Xcode. Il y aura également des tests contenant des procédures regroupées par configurations de langage. Les procédures qui ont des pièces jointes sont marquées avec un trombone. Les images elles-mêmes peuvent être ouvertes dans QuickLook .

image

La collecte séparée de toutes les images résultantes peut prendre beaucoup de temps, surtout si votre application prend en charge plusieurs langues. Malheureusement, ces pièces jointes n'apparaissent pas au format png ou jpg parmi les résultats du test (un autre changement dans Xcode 11). Mais vous pouvez analyser les résultats du test et trouver le JSON qui pointe vers les vraies pièces jointes et les recueille. Cela peut être fait à l'aide de l'utilitaire xcparse.. Il est installé à l'aide de Homebrew et lancé par la commande:

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

Des indicateurs supplémentaires regrouperont les fichiers par périphérique, système d'exploitation ou configuration. Les noms de nos fichiers contiennent un identifiant de langue, vous pouvez donc simplement les trier par nom.

Conclusion


L'approche décrite nous a déjà permis de gagner suffisamment de temps, en particulier dans les situations où il était nécessaire de prendre en charge l'appareil avec une nouvelle résolution ou l'interface a été considérablement mise à jour. Lors de la WWDC20, j'aimerais voir le choix des appareils dans le cadre de la configuration XCTestplan, mais pour l'instant, vous devez choisir manuellement ou utiliser un script qui recueille les captures d'écran nécessaires dans l'AppStore.

All Articles