Dans la communauté des développeurs iOS, fastlane est un outil très populaire de nos jours. Interagir avec iTunes Connect nécessite une tâche très fastidieuse et le rend presque indolore en automatisant la majeure partie de celui-ci. Nous examinons le concept global de fastlane et apprenons à prendre des captures d'écran pour tous les appareils dans toutes les langues avec une seule commande..
"Le travail manuel et répétitif ne vaut pas mon temps." Chaque programmeur a pensé cela au moins une fois dans sa carrière. La plupart d'entre nous, cependant, ne veulent pas prendre le temps d'apprendre à s'automatiser correctement. Peut-être est-ce dû au fait que nous ne faisons que rarement ces tâches ou peut-être est-ce dû au fait que nous ne pensons pas avoir suffisamment de temps pour le faire maintenant.
Surtout si la tâche est la même à chaque fois, mais ne revient pas beaucoup, comme la sortie d'une nouvelle version ou la distribution d'une version à des bêta-testeurs. Néanmoins, il est certainement utile d’automatiser de telles tâches. Vous risquez peut-être d'oublier une étape et de devoir recommencer ou lorsque vous utilisez des versions bêta, il peut s'avérer fastidieux d'ajouter de nouveaux périphériques au portail de développeur et d'actualiser les profils de provisioning avant de distribuer une nouvelle version..
C'est là qu'intervient fastlane. Il automatise vos pipelines de distribution et minimise les interactions avec le portail des développeurs et iTunes Connect, dans le confort de la ligne de commande ou complètement automatisé sur votre serveur d'intégration continue..
fastlane n'est pas un simple outil. C'est un ensemble de, au moment de la rédaction de cet article, douze outils qui suivent la philosophie Unix "Do One Thing and Do It Well". Bien sûr, ils dépendent les uns des autres et interagissent les uns avec les autres.
fastlane lui-même est une enveloppe autour de ces outils, permettant aux développeurs de définir des flux de travail, également appelés ruelles. Chaque flux de travail nécessite différents outils à exécuter. Par exemple, si vous souhaitez distribuer une version préliminaire à vos testeurs, vous n'avez pas besoin de créer de captures d'écran pour l'App Store..
Avant de commencer à utiliser fastlane, vous devez vous assurer que le Xcode Outils de ligne de commande installée. Depuis la ligne de commande, exécutez xcode-select --install
les installer. S'il est déjà installé, vous verrez une erreur.
fastlane lui-même est un joyau de rubis. En fonction de votre système, vous devez soit exécuter bijou installer fastlane
ou sudo gem installer fastlane
. Ce dernier est nécessaire lorsque vous utilisez la version Ruby fournie par OS X.
Après avoir installé les conditions préalables, vous devez initialiser votre projet pour utiliser fastlane. Dans votre dossier de projet, exécutez fastlane init
à partir de la ligne de commande pour démarrer un assistant de configuration interactif. L'assistant vous demande votre adresse électronique et probablement votre mot de passe si ce n'est pas déjà dans le trousseau. L’assistant détecte également les attributs de votre application, tels que prénom et identifiant, et vérifie le portail de développeur et iTunes Connect s’il y est déjà présent. Si ce n'est pas le cas, il vous propose de le créer pour vous. Sans douleur.
Vous pouvez également configurer livrer dans la même étape. Cet outil vous permet de télécharger pour vous les métadonnées, les captures d'écran et les fichiers binaires vers iTunes Connect. Nous verrons cela dans un autre tutoriel.
Pendant le processus d’installation, un nouveau dossier, voie rapide, est créé dans le répertoire de votre projet. Il contient des données de configuration, le plus important étant un fichier nommé Fastfile
. Le fichier décrit les voies que Fastlane a. Voici le défaut magasin d'applications
voie.
desc "Déployer une nouvelle version sur l'App Store" Voie: appstore correspond (tapez: "appstore") snapshot gym deliver (force: true) frameit end
Ce flux de travail ou cette voie a les effets suivants:
Dans ce tutoriel particulier, nous examinons en détail la deuxième étape, instantané.
Pourquoi devriez-vous automatiser les captures d'écran? Ils sont faciles à faire dans un simulateur. Cela pourrait être vrai si vous n’avez qu’un seul périphérique ou une seule langue. Faisons le calcul. Si votre application est disponible sur iPhone et iPad, vous devez six tailles d'écran (4.7 ", 5.5", 4 ", 3.5", iPad et iPad Pro). Supposons également que votre application est disponible dans vingt langues et vous prenez cinq captures d'écran.
6 (appareils) × 20 (langues) x 5 (captures d'écran) = 600 captures d'écran
Maintenant, imaginez que vous deviez les prendre manuellement. C'est fou. Heureusement, il y a instantané. Il automatise les captures d’écran en utilisant le Outils d'automatisation fourni par Apple. Mieux encore, depuis Xcode 7, il n'est plus nécessaire d'utiliser JavaScript pour automatiser cela. Nous pouvons utiliser les tests Swift et UI pour cette tâche.
Quand vous installez fastlane, instantané est installé aussi bien. Cependant, il ne s’initialisera pas automatiquement instantané avec lors de la mise en place d'un nouveau projet. Vous devez courir instantané init
dans votre dossier de projet.
Cela crée deux fichiers dans le voie rapide dossier, Snapfile
et SnapshotHelper.swift
. Vous devez ajouter le fichier Swift à la cible de test de l'interface utilisateur de votre projet..
Après avoir ajouté ce fichier, vous devez également utiliser l'extrait de code. instantané fournit pour enregistrer des captures d'écran. Vous pouvez utiliser le fichier de test d'interface utilisateur généré par Xcode ou en créer un distinct, uniquement pour les captures d'écran..
dans le installer()
fonction, remplacer XCUIApplication (). Launch ()
avec le code suivant:
let app = XCUIApplication () setupSnapshot (app) app.launch ()
Pour plus de clarté, vous pouvez également renommer testExample ()
, mais assurez-vous de ne pas retirer le tester
préfixe du nom de la fonction.
Il est maintenant temps d'enregistrer les étapes à suivre pour générer chacune des captures d'écran. Vous pouvez également contrôler l'application par programme, mais il est beaucoup plus facile d'utiliser la fonctionnalité d'enregistrement de Xcode et de la modifier ultérieurement pour répondre à vos besoins..
Utilisez le bouton rouge d'enregistrement en bas pour commencer l'enregistrement.Lorsque vous enregistrez une interaction simple, vous vous retrouvez avec un code qui ressemble à ce qui suit:
func testScreenshots () let app = XCUIApplication () let masterNavigationBar = app.navigationBars ["Master"] admettons addButton = masterNavigationBar.buttons ["Ajouter"] addButton.tap () addButton.tap () addButton.tap () admet tablesQuery = app.tables tablesQuery .staticTexts ["2016-04-12 08:43:40 +0000"]. tap () app.navigationBars.matchingIdentifier ("Detail"). boutons ["Master"]. tap () masterNavigationBar.boutons ["Éditer" ] .tap () tablesQuery.buttons ["Suppression 2016-04-12 08:43:39 +0000"]. tap () tablesQuery.buttons ["Suppression"]. tap () masterNavigationBar.buttons ["Terminé"]. robinet()
L'exemple vient de la valeur par défaut Application maître-détail modèle fourni par Xcode. Tout de suite, vous pouvez voir le problème avec ce code. Il utilise des identifiants spécifiques pour interagir avec l'application. Si nous exécutions à nouveau le test d'interface utilisateur, cela échouerait car les horodatages sont différents..
Dans un premier temps, nous pouvons utiliser une fonction fournie par le framework UI Test, elementBoundByIndex (_ :)
. Cela nous permet d'accéder aux éléments, tels que les boutons et les cellules de la vue tableau, à l'aide d'un index. Cela conduit au code suivant:
func testScreenshots () let app = XCUIApplication () let masterNavigationBar = app.navigationBars ["Master"] admettons addButton = masterNavigationBar.buttons ["Ajouter"] addButton.tap () addButton.tap () addButton.tap () admet tablesQuery = app.tables tablesQuery .cells.elementBoundByIndex (0) .tap () app.navigationBars.matchingIdentifier ("Detail"). boutons ["Master"]. tap () masterNavigationBar.boutons ["Éditer"]. tap () tablesQuery.cells.elementBoundByIndex ( 0) .buttons.elementBoundByIndex (0) .tap () tablesQuery.buttons ["Supprimer"]. Tap () masterNavigationBar.buttons ["Terminé"]. Tap ()
Nous avons un autre problème lorsque nous essayons d'exécuter le code dans plusieurs langues. Il échoue depuis Maîtriser, Ajouter, etc. sont nommés différemment dans chaque langue. Nous pouvons aussi résoudre ce problème en utilisant le elementBoundByIndex (_ :)
méthode. Notez que le bouton droit de la barre de navigation contient en fait un index de 2, c'est-à-dire que c'est le troisième élément, car la barre de navigation a toujours un bouton caché.
func testScreenshots () let app = XCUIApplication () let masterNavigationBar = app.navigationBars.elementBoundByBndI (0) let addButton = masterNavigationBar. .cells.elementBoundByIndex (0) .tap () app.navigationBars.elementBoundByIndex (0) .buttons.elementBoundByIndex (0) .tob () masterNavigationBar.buttons.elementBoundByIndex (0). (0) cell.buttons.elementBoundByIndex (0) .tap () cell.buttons.elementBoundByIndex (1) .tap () masterNavigationBar.buttons.elementBoundByIndex (0) .tap ()
Il existe un autre raccourci qui facilite beaucoup l'accès des éléments personnalisés aux tests d'interface utilisateur. C'est une propriété, accessibilityIdentifier
, défini par le UIAccessibilityIdentification
protocole. Vous pouvez l'utiliser pour rechercher des éléments avec cet identifiant, par exemple, app.buttons.matchingIdentifier ("awesomeButton"). element
. L'identificateur d'accessibilité n'est pas visible pour l'utilisateur, même s'il a activé l'accessibilité, et il n'est pas localisé..
Après avoir configuré l’interface utilisateur pour qu’elle fonctionne avec les langues prises en charge par le projet, il est temps de configurer instantané prendre des screenshots. Ceci est fait avec le instantané(_:)
fonctionner dans votre test d'interface utilisateur. Vous devez également spécifier un nom de fichier. Personnellement, j'utilise un préfixe numéroté, tel que instantané ("1MasterView")
ou instantané ("2DetailView")
pour faciliter le comptage du nombre de captures d’écran que j’ai déjà prises et pour les trier automatiquement. Si vous avez besoin de temps supplémentaire avant de prendre une capture d'écran, utilisez la commande dormir(_:)
une fonction.
Enfin, vous devez dire instantané quels appareils et quelles langues il devrait utiliser. Ceci est spécifié dans le Snapfile
.
appareils (["iPhone 6", "iPhone 6 Plus", "iPhone 4s]]) langues ([" en-US "," de-DE "])
Dans cet exemple, j'utilise l'iPhone 6, l'iPhone 6 Plus et l'iPad comme périphérique, l'anglais et l'allemand comme langues..
Pour exécuter l'outil, vous exécutez instantané
à partir de la ligne de commande. Selon la taille de votre projet et le nombre d'appareils et de langues, la capture d'écran peut prendre un certain temps. En attendant, vous pouvez vous dégourdir les jambes, prendre une tasse de café ou tout simplement regarder sa magie.
Par défaut, les captures d'écran sont stockées dans fastlane / screenshots, chaque langue ayant son propre sous-dossier et son propre nom de fichier préfixé par le nom du périphérique. Après instantané est terminé, il génère également un fichier HTML pour prévisualiser facilement les captures d'écran générées.
Une fois la capture instantanée terminée, il génère également un fichier HTML pour prévisualiser facilement les captures d'écran générées..En utilisant instantané, vous pouvez réduire le temps et les efforts nécessaires à la création de captures d'écran pour votre application à une fraction de ce qu'il faut si vous effectuez cette tâche manuellement. Bien sûr, l’outil est beaucoup plus personnalisable car nous n’avons fait qu’effleurer la surface instantané peut faire. Pour plus d'informations, consultez la documentation sur GitHub. Vous pouvez également consulter mon cours vidéo sur fastlane si vous souhaitez en savoir plus sur cet outil incroyable..