Hur automatisera skärmdumpar med fastlane

I IOS-utvecklargemenskapen är fastlane idag ett mycket populärt verktyg. Det tar en väldigt tråkig uppgift, som interagerar med iTunes Connect, och gör det nästan smärtfritt genom att automatisera det mesta. Vi tittar på det övergripande begreppet fastlane och lär dig hur du tar skärmdumpar för alla enheter på alla språk med ett enda kommando.

Varför fastlane

"Manuellt, repetitivt arbete är inte värt min tid". Varje programmerare har tänkt detta minst en gång i sin karriär. De flesta av oss vill dock inte ta sig tid att lära sig att automatisera korrekt. Kanske beror det på att vi bara gör dessa uppgifter sällan eller kanske det beror på att vi inte tror att vi har tillräckligt med tid att hantera det just nu.

Särskilt om uppgiften är densamma varje gång, men inte kommer upp så mycket, till exempel frisläppande av en ny version eller distributionen av en bygg till beta-testare. Ändå är det säkert en bra idé att automatisera sådana uppgifter. Du kan glömma ett steg och måste börja om eller när det gäller betaversioner kan det vara väldigt tråkigt att lägga till nya enheter på utvecklingsportalen och uppdatera provisioneringsprofilerna innan du distribuerar en ny byggnad.

Det här är där fastlane kommer in. Det automatiserar dina distributionsledningar och minimerar interaktionen med utvecklarportalen och iTunes Connect, från bekvämligheten av kommandoraden eller helt automatiserad på din kontinuerliga integrationsserver.

Svit av verktyg

fastlane är inte bara ett enda verktyg. Det är en samling av tolv verktyg som följer Unix-filosofin "Gör en sak och gör det bra". Självklart beror de på och interagerar med varandra.

fastlane sig själv är ett omslag runt dessa verktyg, vilket gör det möjligt för utvecklare att definiera arbetsflöden, även känd som lanes. Varje arbetsflöde kräver olika verktyg att köra. Om du till exempel vill distribuera ett pre-release-bygg till dina testare behöver du inte skapa skärmdumpar för App Store.

Installation

Innan du kan börja använda fastlane måste du se till att du har Xcode Kommandoradsverktyg installerad. Från kommandoraden, kör xcode-select - installera att installera dem. Om det redan är installerat ser du ett fel.

fastlane själv är en Ruby pärla. Beroende på ditt system måste du antingen springa gem install fastlane eller sudo gem installera fastlane. Det senare är nödvändigt när du använder Ruby-versionen som tillhandahålls av OS X.

Projektinställningar

Efter installationen av förutsättningarna måste du initiera ditt projekt för att använda fastlane. I din projektmapp, kör fastlane init från kommandoraden för att starta en interaktiv installationsguiden. Trollkarlen frågar dig för din e-postadress och förmodligen din Lösenord om det inte redan finns i nyckelringen. Guiden upptäcker även attributen för din app, till exempel namn och identifierare, och kontrollerar utvecklarportalen och iTunes Connect om den redan finns där. Om det inte är så erbjuder det att skapa det för dig. Smärtfri.

Du kan också ställa in leverera i samma steg. Med det här verktyget kan du ladda upp metadata, skärmdumpar och binärt till iTunes Connect för dig. Vi kommer att titta på detta i en annan handledning.

Under installationsprocessen, en ny mapp, omkörningsfilen, skapas i projektets katalog. Den innehåller konfigurationsdata, den viktigaste är en fil som heter Fastfile. Filen beskriver banorna fastlane har. Här är standardvärdet appstore körfält.

desc. "Distribuera en ny version till App Store" lane: appstore matcha (typ: "appstore") snapshot gym leverera (kraft: true) ramänden

Detta arbetsflöde eller körfält gör följande:

  • hämta alla signeringscertifikat och provisioning profiler (match)
  • skapa skärmdumpar för din app (snapshot)
  • bygg din app till appbutiken (Gym)
  • ladda upp skärmdumpar, metadata och arkivet till iTunes Connect (leverera)
  • skapa marknadsföringsbilder med enhetsramar från dina skärmdumpar (frameit)

I den här handledningen tar vi en detaljerad titt på det andra steget, snapshot.

Automatisera skärmdumpar med ögonblicksbild

Varför ska du automatisera skärmdumpar? De är lätta att göra i en simulator. Det kan vara sant om du bara har en enhet eller ett språk. Låt oss göra matte. Om din app är tillgänglig på iPhone och iPad har du det sex skärmstorlekar (4.7 ", 5.5", 4 ", 3.5", iPad och iPad Pro). Låt oss också anta att din app är tillgänglig i tjugo språk och du tar fem skärmbilder.

6 (enheter) × 20 (språk) x 5 (skärmdumpar) = 600 skärmdumpar

Tänk nu att du måste ta dem manuellt. Det är galen. Lyckligtvis finns det snapshot. Det automatiserar att ta skärmdumpar med hjälp av Automatiseringsverktyg tillhandahållen av Apple. Ännu bättre, eftersom Xcode 7, behöver vi inte längre använda JavaScript för att automatisera detta. Vi kan använda Swift och UI-tester för denna uppgift.

När du installerar fastlane, snapshot installeras också. Det startar dock inte automatiskt snapshot med det när du skapar ett nytt projekt. Du måste springa snapshot init i din projektmapp.

Detta skapar två filer i omkörningsfilen mapp, Snapfile och SnapshotHelper.swift. Du måste lägga till Swift-filen i ditt projekts UI-testmål.

Se till att du lägger till filen i UI-testens mål.

Efter att du har lagt till den här filen måste du också använda kodavsnittet snapshot ger för att spara skärmdumpar. Du kan använda UI-testfilen som genereras av Xcode eller skapa en separat enbart för skärmdumpar.

inrätta() funktion, ersätt XCUIApplication (). Starta () med följande kod:

låt app = XCUIApplication () setupSnapshot (app) app.launch ()

För tydligheten kan du också byta namn testExample (), men se till att du inte tar bort testa prefix av funktionsnamnet.

Nu är det dags att registrera de steg du tar för att generera var och en av skärmdumparna. Du kan också styra programmet programmatiskt, men det är mycket lättare att använda inspelningsfunktionen i Xcode och redigera den senare för att passa dina behov.

Använd den röda inspelningsknappen längst ner för att starta inspelningen.

När du spelar in en enkel interaktion slutar du med kod som ser något ut som följande:

func testScreenshots () let app = XCUIApplication () låt masterNavigationBar = app.navigationBars ["Master"] låt addButton = masterNavigationBar.buttons ["Add"] addButton.tap () addButton.tap () låt tablesQuery = app.tables tablesQuery .taticTexts ["2016-04-12 08:43:40 +0000"]. knacka () app.navigationBars.matchingIdentifier ("Detaljer"). knappar ["Master"]. knacka () masterNavigationBar.buttons ["Redigera" ] .tap () tablesQuery.buttons ["Ta bort 2016-04-12 08:43:39 +0000"]. knacka () tablesQuery.buttons ["Delete"]. knacka () masterNavigationBar.buttons ["Done"]. tryck ()

Exemplet kommer från standardvärdet Master-detaljapplikation mall Xcode tillhandahåller. Omedelbart kan du se problemet med den här koden. Den använder specifika identifierare för att interagera med appen. Om vi ​​skulle köra UI-testet igen skulle det misslyckas eftersom tidsstämplarna är olika.

I ett första steg kan vi använda en funktion som tillhandahålls av UI-testramen, elementBoundByIndex (_ :). Detta gör det möjligt för oss att komma åt elementen, till exempel knappar och tabellvynceller, med hjälp av ett index. Detta leder till följande kod:

func testScreenshots () let app = XCUIApplication () låt masterNavigationBar = app.navigationBars ["Master"] låt addButton = masterNavigationBar.buttons ["Add"] addButton.tap () addButton.tap () låt tablesQuery = app.tables tablesQuery .cells.elementBoundByIndex (0) .tap () app.navigationBars.matchingIdentifier ("Detalj"). knappar ["Master"]. knacka () masterNavigationBar.buttons ["Redigera"]. knacka () tabellerQuery.cells.elementBoundByIndex ()

Vi har ett annat problem när vi försöker köra koden på flera språk. Det misslyckas sedan Bemästra, Lägg till, etc. heter olika på varje språk. Vi kan också åtgärda detta problem genom att använda elementBoundByIndex (_ :) metod. Observera att den högra streckknappen på navigeringsfältet faktiskt har ett index på 2, vilket betyder att det är det tredje elementet, eftersom navigeringsfältet alltid har en dold bakåtknapp.

func testScreenshots () let app = XCUIApplication () låt masterNavigationBar = app.navigationBars.elementBoundByIndex (0) låt addButton = masterNavigationBar.buttons.elementBoundByIndex (2) addButton.tap () addButton.tap () låt tablesQuery = app.tables tablesQuery .cells.elementBoundByIndex (0) .tap () app.navigationBars.elementBoundByIndex (0) .buttons.elementBoundByIndex (0) .tap () masterNavigationBar.buttons.elementBoundByIndex (0) .tap () låt cellen = tablesQuery.cells.elementBoundByIndex (0) cell.buttons.elementBoundByIndex (0) .tap () cell.buttons.elementBoundByIndex (1) .tap () masterNavigationBar.buttons.elementBoundByIndex (0) .tap ()

Det finns en annan genväg som gör det mycket lättare för anpassade element som ska nås av användargränssnitt. Det är en egendom, accessibilityIdentifier, definierad av UIAccessibilityIdentification protokoll. Du kan använda den för att leta efter element med den här identifieraren, till exempel, app.buttons.matchingIdentifier ( "awesomeButton"). elementet. Tillgänglighetsidentifieraren är inte synlig för användaren, även när de har tillgänglighet aktiverad och den är inte lokaliserad.

När du har ställt in användargränssnittet för att arbeta med projektets språk som stöds, är det dags att konfigurera snapshot att ta några skärmdumpar. Detta görs med ögonblicksbild (_ :) funktion i ditt UI-test. Du måste också ange ett filnamn. Jag använder personligen ett numrerat prefix, till exempel ögonblicksbild ( "1MasterView") eller ögonblicksbild ( "2DetailView") för att göra det enklare att räkna ut hur många skärmdumpar jag redan har tagit och att automatiskt sortera dem. Om du behöver ytterligare tid innan du tar en skärmdump, använd sova(_:) fungera.

Slutligen måste du berätta snapshot vilka enheter och språk det ska använda. Detta anges i Snapfile.

enheter ("iPhone 6", "iPhone 6 Plus", "iPhone 4s"]) språk (["en-US", "de-DE"])

I det här exemplet använder jag iPhone 6, iPhone 6 Plus och iPad som enheter och engelska och tyska som språk.

För att köra verktyget utför du snapshot från kommandoraden. Beroende på projektets storlek och antalet enheter och språk kan det ta en stund att ta skärmdumparna. Under tiden kan du sträcka dina ben, ta en kopp kaffe, eller bara titta på det fungerar sin magi.

Som standard lagras skärmdumparna i Fastlane / skärm, med varje språk som har en egen undermapp och filnamn prefixade med enhetens namn. Efter snapshot är klar, det genererar också en HTML-fil för att enkelt förhandsgranska de genererade skärmdumparna.

När stillbilden är klar genererar den också en HTML-fil för att enkelt förhandsgranska de genererade skärmdumparna.

Slutsats

Genom att använda snapshot, du kan minska tiden och ansträngningarna för att skapa skärmdumpar för din app till en bråkdel av vad det tar om du utför den här uppgiften manuellt. Naturligtvis är verktyget mycket mer anpassningsbart eftersom vi bara repade ytan på vad snapshot kan göra. Mer information finns i dokumentationen på GitHub. Du kan också kolla in min videokurs om fastlane om du vill lära dig mer om detta fantastiska verktyg.