In de iOS-ontwikkelaarsgemeenschap is fastlane tegenwoordig een erg populaire tool. Het kost een hele saaie taak, interactie met iTunes Connect, en maakt het bijna pijnloos door het meeste ervan te automatiseren. We bekijken het algemene concept van fastlane en leren hoe je screenshots voor alle apparaten in alle talen kunt maken met één enkele opdracht.
"Handmatig, repetitief werk is mijn tijd niet waard." Elke programmeur heeft dit minstens een keer in zijn carrière gedacht. De meesten van ons willen echter niet de tijd nemen om te leren hoe ze op de juiste manier kunnen automatiseren. Misschien komt het omdat we alleen die taken niet vaak uitvoeren of omdat we er nu niet aan denken om genoeg tijd te hebben om er mee om te gaan.
Vooral als de taak elke keer hetzelfde is, maar niet zo vaak opkomt, zoals de release van een nieuwe versie of de distributie van een build naar bètatesters. Toch is het zeker een goed idee om dergelijke taken te automatiseren. Misschien vergeet u een stap en moet u opnieuw beginnen of, als u met bètaversies te maken hebt, kan het erg vervelend zijn om nieuwe apparaten aan de ontwikkelaarportal toe te voegen en de provisioningprofielen te verversen voordat u een nieuwe build distribueert.
Hier komt fastlane binnen. Het automatiseert uw distributiepijplijnen en minimaliseert de interactie met de ontwikkelaarportal en iTunes Connect, vanuit het comfort van de opdrachtregel of volledig geautomatiseerd op uw continue integratieserver.
fastlane is niet slechts een enkele tool. Het is een verzameling van, op het moment van schrijven, twaalf gereedschappen die de Unix-filosofie "Do One Thing and Do It Well" volgen. Natuurlijk zijn ze afhankelijk van en communiceren ze met elkaar.
fastlane zelf is een verpakking om die tools, waardoor ontwikkelaars workflows kunnen definiëren, ook wel bekend als rijstroken. Voor elke workflow moeten verschillende tools worden uitgevoerd. Als u bijvoorbeeld een pre-release-build wilt verspreiden naar uw testers, hoeft u geen screenshots te maken voor de App Store.
Voordat u fastlane kunt gaan gebruiken, moet u ervoor zorgen dat u de Xcode hebt Commandoregel-tools geïnstalleerd. Voer vanaf de opdrachtregel uit xcode-select - installeren
om ze te installeren. Als het al is geïnstalleerd, ziet u een foutmelding.
fastlane zelf is een robijn edelsteen. Afhankelijk van uw systeem, moet u het uitvoeren gem installeert fastlane
of sudo gem installeert fastlane
. Dit laatste is nodig wanneer u de Ruby-versie van OS X gebruikt.
Na het installeren van de vereisten, moet u uw project initialiseren om fastlane te gebruiken. In de projectmap uitvoeren fastlane init
vanaf de opdrachtregel om een interactieve installatiewizard te starten. De wizard vraagt je om jouw e-mailadres en waarschijnlijk jouw wachtwoord als het nog niet in de sleutelhanger zit. De wizard detecteert ook de kenmerken van uw app, zoals naam en identifier, en controleert de ontwikkelaarportal en iTunes Connect als deze daar al aanwezig is. Als dat niet het geval is, biedt het aan om het voor u te maken. Pijnloos.
Je kunt ook instellen leveren in dezelfde stap. Met deze tool kun je metadata, screenshots en het binary naar iTunes Connect voor je uploaden. We zullen dit in een andere tutorial bekijken.
Tijdens het installatieproces, een nieuwe map, fastlane, wordt gemaakt in de map van uw project. Het bevat configuratiegegevens, waarvan de belangrijkste een bestand met de naam is Fastfile
. Het bestand beschrijft de rijstroken die fastlane heeft. Dit is de standaard app Winkel
rijbaan.
desc "Implementeer een nieuwe versie naar de App Store" lane: appstore do match (type: "appstore") snapshot gym lever (force: true) frameit end
Deze workflow of baan doet het volgende:
In deze specifieke tutorial bekijken we de tweede stap gedetailleerd, momentopname.
Waarom zou je screenshots automatiseren? Ze zijn eenvoudig te doen in een simulator. Dat kan waar zijn als je slechts één apparaat of één taal hebt. Laten we de wiskunde doen. Als je app beschikbaar is op iPhone en iPad, dan heb je zes schermformaten (4,7 ", 5,5", 4 ", 3,5", iPad en iPad Pro). Laten we er ook vanuit gaan dat je app beschikbaar is in twintig talen en je neemt vijf screenshots.
6 (apparaten) x 20 (talen) x 5 (screenshots) = 600 schermafbeeldingen
Stel je nu voor dat je die handmatig moet nemen. Dat is krankzinnig. Gelukkig is dat zo momentopname. Het automatiseert het maken van screenshots met behulp van de Automatiseringstools geleverd door Apple. Sterker nog, sinds Xcode 7 hoeven we JavaScript niet langer te gebruiken om dit te automatiseren. We kunnen Swift- en UI-tests gebruiken voor deze taak.
Wanneer u fastlane installeert, momentopname is ook geïnstalleerd. Het wordt echter niet automatisch geïnitialiseerd momentopname mee bij het opzetten van een nieuw project. Je moet rennen snapshot init
in je projectmap.
Dit creëert twee bestanden in de fastlane map, Snapfile
en SnapshotHelper.swift
. U moet het Swift-bestand toevoegen aan het UI-testdoel van uw project.
Nadat u dit bestand heeft toegevoegd, moet u ook het codefragment gebruiken momentopname biedt om screenshots op te slaan. U kunt het UI-testbestand dat is gegenereerd door Xcode gebruiken of een afzonderlijke maken, alleen voor schermafbeeldingen.
In de opstelling()
functie, vervangen XCUIApplication (). Start ()
met de volgende code:
let app = XCUIApplication () setupSnapshot (app) app.launch ()
Voor de duidelijkheid, je kunt ook hernoemen testExample ()
, maar zorg ervoor dat u de test
voorvoegsel van de functienaam.
Nu is het tijd om de stappen op te nemen die u neemt om elk van de schermafbeeldingen te genereren. Je zou de applicatie ook programmatisch kunnen besturen, maar het is veel gemakkelijker om de opnamefunctionaliteit van Xcode te gebruiken en later te bewerken om aan je behoeften te voldoen.
Gebruik de rode opnameknop onderaan om de opname te starten.Wanneer u een eenvoudige interactie opneemt, krijgt u een code die er ongeveer als volgt uitziet:
func testScreenshots () let app = XCUIApplication () laat masterNavigationBar = app.navigationBars ["Master"] laat addButton = masterNavigationBar.buttons ["Toevoegen"] addButton.tap () addButton.tap () laat tablesQuery = app.tables tablesQuery .staticTexts ["2016-04-12 08:43:40 +0000"]. Tik op () app.navigationBars.matchingIdentifier ("Detail"). Knoppen ["Master"]. Tik op () masterNavigationBar.knoppen ["Bewerken") ] .tap () tablesQuery.buttons ["Delete 2016-04-12 08:43:39 +0000"]. Tik op () tablesQuery.buttons ["Delete"]. Tik op () masterNavigationBar.buttons ["Done"]. tik()
Het voorbeeld komt van de standaard Master-detail toepassing sjabloon Xcode biedt. Meteen kunt u het probleem met deze code zien. Het gebruikt specifieke ID's om te communiceren met de app. Als we de UI-test opnieuw zouden uitvoeren, zou dit mislukken omdat de tijdstempels anders zijn.
In een eerste stap kunnen we een functie gebruiken die wordt geleverd door het UI-testraamwerk, elementBoundByIndex (_ :)
. Hierdoor hebben we toegang tot de elementen, zoals knoppen en tabelweergavecellen, met behulp van een index. Dit leidt tot de volgende code:
func testScreenshots () let app = XCUIApplication () laat masterNavigationBar = app.navigationBars ["Master"] laat addButton = masterNavigationBar.buttons ["Toevoegen"] addButton.tap () addButton.tap () laat tablesQuery = app.tables tablesQuery .cells.elementBoundByIndex (0) .tap () app.navigationBars.matchingIdentifier ("Detail") .knoppen ["Master"]. Tik op () masterNavigationBar.knoppen ["Bewerken"]. Tik op () tablesQuery.cells.elementBoundByIndex ( 0) .knoppen.elementBoundByIndex (0) .tap () tabellenQuery.buttons ["Verwijderen"]. Tik op () masterNavigationBar.knop ["Gereed"]. Tik op ()
Er is een ander probleem wanneer we de code in meerdere talen proberen uit te voeren. Het faalt sindsdien Meester, Toevoegen, etc. worden in elke taal anders genoemd. We kunnen dit probleem ook oplossen door de elementBoundByIndex (_ :)
methode. Merk op dat de rechter balkknop op de navigatiebalk eigenlijk een index heeft van 2, wat betekent dat dit het derde element is, omdat de navigatiebalk altijd een verborgen terugknop heeft.
func testScreenshots () let app = XCUIApplication () laat masterNavigationBar = app.navigationBars.elementBoundByIndex (0) laat addButton = masterNavigationBar.buttons.elementBoundByIndex (2) addButton.tap () addButton.tap () laat tablesQuery = app.tables tablesQuery .cells.elementBoundByIndex (0) .tap () app.navigationBars.elementBoundByIndex (0) .buttons.elementBoundByIndex (0) .tap () masterNavigationBar.buttons.elementBoundByIndex (0) .tap () laat cel = tablesQuery.cells.elementBoundByIndex (0) cell.buttons.elementBoundByIndex (0) .tap () cell.buttons.elementBoundByIndex (1) .tap () masterNavigationBar.buttons.elementBoundByIndex (0) .tap ()
Er is nog een snelkoppeling die het voor gebruikers eenvoudiger maakt om aangepaste elementen te gebruiken voor UI-tests. Het is een eigendom, accessibilityIdentifier
, gedefinieerd door de UIAccessibilityIdentification
protocol. U kunt het gebruiken om bijvoorbeeld te zoeken naar elementen met deze ID, app.buttons.matchingIdentifier ( "awesomeButton"). element
. De toegankelijkheids-ID is niet zichtbaar voor de gebruiker, zelfs niet als deze toegankelijkheid heeft ingeschakeld en niet is gelokaliseerd.
Nadat u de gebruikersinterface hebt ingesteld om met de door het project ondersteunde talen te werken, is het tijd om te configureren momentopname om wat screenshots te maken. Dit wordt gedaan met de momentopname(_:)
functie in uw UI-test. U moet ook een bestandsnaam opgeven. Ik gebruik persoonlijk een genummerd voorvoegsel, zoals snapshot ( "1MasterView")
of snapshot ( "2DetailView")
om het gemakkelijker te maken om te tellen hoeveel screenshots ik al heb gemaakt en om ze automatisch te sorteren. Als u extra tijd nodig heeft voordat u een screenshot maakt, gebruik dan de slaap(_:)
functie.
Eindelijk, je moet het vertellen momentopname welke apparaten en talen hij zou moeten gebruiken. Dit wordt gespecificeerd in de Snapfile
.
apparaten (["iPhone 6", "iPhone 6 Plus", "iPhone 4s"]) talen (["en-US", "de-DE"])
In dit voorbeeld gebruik ik iPhone 6, iPhone 6 Plus en de iPad als apparaten en Engels en Duits als talen.
Om het hulpprogramma uit te voeren, voert u het uit momentopname
vanaf de opdrachtregel. Afhankelijk van de grootte van je project en het aantal apparaten en talen, kan het behoorlijk wat tijd kosten om de screenshots te maken. In de tussentijd kun je je benen strekken, een kopje koffie pakken, of gewoon kijken hoe het zijn magie doet.
Standaard worden de schermafbeeldingen opgeslagen fastlane / screenshots, waarbij elke taal zijn eigen submap en bestandsnamen heeft, voorafgegaan door de naam van het apparaat. Na momentopname is voltooid, maar genereert ook een HTML-bestand om een voorbeeld van de gegenereerde schermafbeeldingen te bekijken.
Nadat de snapshot is voltooid, genereert deze ook een HTML-bestand om een voorbeeld van de gegenereerde screenshots te bekijken.Door het gebruiken van momentopname, u kunt de tijd en moeite die nodig is om schermafbeeldingen voor uw app te maken, verkorten tot een fractie van wat u moet doen als u deze taak handmatig uitvoert. Natuurlijk is de tool veel meer aanpasbaar, omdat we alleen het oppervlak van wat gekrast hebben momentopname kan doen. Raadpleeg de documentatie over GitHub voor meer informatie. Je kunt ook mijn videocursus over fastlane bekijken als je meer wilt weten over deze geweldige tool.