iOS automationstestning med Xcode UI-ramverk

⚡ Smart sammanfattning

iOS-automatiseringstestning med Xcode registrerar och spelar upp användargränssnittsåtgärder mot en applikation som testas, enligt en testdriven cykel av design, test, implementation och test igen tills varje fall godkänns.

  • 🔘 TDD-cykel: Designa, testa, implementera och testa igen från de fyra faser som tillämpas vid testning av iOS-applikationer.
  • ☑️ Förkunskaper: En Mac som kör OS X med Xcode IDE, ett automatiseringsramverk och iOS SDK installerat.
  • Instrumentväg: Automation-instrumentet spelar in ett skript, visar det i skriptloggen och spelar upp det på begäran.
  • 🧪 OCUnit-rutt: Ett enhetstestpaket-mål, ett aktivt schema, en testgrupp och en testklass skriven i Objective-C.
  • ⚠️ Utfasning: UIAutomation-instrumentet avvecklades i Xcode 8 och borttagen; XCUITest är den stödda efterföljaren.
  • 🛠️ Modern motsvarighet: Ett UI Testing Bundle-mål plus XCUIApplication-frågor ersätter det inspelade Instruments-skriptet.

iOS-automatiseringstestning med Xcode UI Automation-ramverket som kör ett inspelat skript mot en app

iOS automationstestning med hjälp av Xcode

För att garantera kvaliteten på din iOS-applikation bör du följa den testdrivna utvecklingsprocessen som visas i bilden nedan.

Testdriven utvecklingscykel för iOS-automatiseringstestning som visar design-, test-, implementerings- och omtestfaser

Testdriven utveckling (TDD) är en testning modell som tillämpas på testning av iOS-applikationer, och den ingår i den bredare praxisen av mobil testningI den här modellen måste en testare följa de fyra faserna nedan:

  • Design: Ta reda på vad du vill testa och utforma dina testfall.
  • Test: Kör alla tester och se om några testfall misslyckas.
  • Genomföra: Revise din kod och åtgärda buggarna som orsakade att testet misslyckades.
  • Testa igen: Om ett test misslyckas, återgå till designen. Om alla testfall godkänns uppfyller koden hela det testade kravet.

Inställning Xcode Projekt för UI-testning

För att skapa ett iOS-testprogram behöver du en Mac. Din Mac måste redan ha följande installerat:

  • OS X — operativsystemet för en Mac.
  • Xcode IDE — utvecklingsverktyget för iOS.
  • Ett automatiserat testramverk — UI-automation, OCUnit och så vidare.
  • iOS SDK 4 eller högre.

⚠️ Versionsinformation: Förutsättningarna ovan beskriver verktygskedjan från den era då de två följande genomgångarna skrevs. På en aktuell Mac, Xcode Ramverken XCTest och XCUITest medföljer i lådan, och det separata UI Automation-instrumentet är inte längre en del av installationen. De ursprungliga stegen bevaras nedan eftersom de dokumenterar hur ramverket fungerade, och den moderna motsvarigheten beskrivs längre ner.

Hur man skapar iOS Automation med UI Automation Framework

De åtta stegen nedan spelar in ett skript med Automation-instrumentet och spelar upp det mot den applikation som testas.

Steg 1) Starta instrument

Öppna XCode -> Öppna utvecklarverktyget -> Instrument

Öppningsinstrument från Xcode Öppna menyn för utvecklarverktyg

Steg 2) Lägg till automationsinstrument

I fönstret Instrument väljer du instrumentet Automation.

Välja automationsinstrumentet i instrumentmallväljaren

För att skapa ett testskript spelar du antingen in en testscenario eller så programmerar du den manuellt.

Steg 3) Tryck på den röda knappen

Ett instrument startas — stoppa inspelningen omedelbart. Om du vill starta inspelningen trycker du på den röda knappen.

Röd inspelningsknapp i Instrumentverktygsfältet som används för att starta och stoppa en trace

Steg 4) Skapa ett nytt skript

I skriptfönstret klickar du på Lägg till > Skapa för att skapa ett nytt skript.

Menyn Lägg till och Skapa i fönstret Instrumentskript för ett nytt automatiseringsskript

Steg 5) Välj målet

Du är nu i Tracfönstret. Använd Välj-knappen Target rullgardinsmenyn för att navigera till felsökningsversionen av din app.

Välja Target rullgardinsmeny i Instrumenten Tracfönstret som pekar på felsökningsbygget

I det här fallet Apples exempel SimpleDrillDown appen används som applikationen som testas. Den har det grafiska gränssnitt som visas nedan.

SimpleDrillDown-exempelgränssnitt som används som applikation under test

Steg 6) Börja spela in ditt skript

Spela in ditt skript genom att trycka på inspelningsknappen längst upp eller längst ned i verktyget.

Inspelningsknappen i kanten av Instruments-fönstret som startar skriptinspelning

Nu kan du utföra vissa UI-åtgärder på din applikation under testning, och ditt skript spelas in.

Steg 7) Se ditt manus

För att se ditt manus, tryck på Trace Logg / Redigerarlogg i rullgardinsmenyn och växla till skriptloggvyn.

Trace Logg och redigerarloggens listruta som används för att växla till skriptloggvyn

Du kommer att se ditt inspelade manus.

Inspelat UI-automationsskript visas i Instruments-skriptloggvyn

Steg 8) Spela ditt manus

Tryck på uppspelningsknappen. Skriptet körs och du kan stoppa det efter att loggarna visas.

Uppspelning av det inspelade automatiseringsskriptet med loggutdata i instrumentfönstret

⚠️ Historisk anmärkning: Automatiseringsinstrumentet som användes i dessa åtta steg föråldrades i Xcode 8 och senare borttagen, så den finns inte längre i nuvarande Xcode installationer. Stegen behålls här som en förteckning över hur ramverket fungerade; för nytt arbete, använd XCUITest-genomgången längre ner på den här sidan.

Hur man skapar iOS-automatisering med OCUnit-ramverket

Den andra vägen placerar testerna inuti Xcode projicera sig själv snarare än inuti Instrument.

Steg 1) Starta Xcode IDE, Lägg till enhetstestpaketmål

Lägga till ett enhetstestpaketmål till ett befintligt Xcode projektet

Steg 2) Skriv namnet på det nya enhetstestpaketet som visas i bilden ovan och klicka sedan på Slutför.

Steg 3) Gör enhetstest till aktivt mål

Välja enhetstestpaketet som aktivt mål i Xcode

Steg 4) Lägg till en grupp för testklasser

Skapa en projektgrupp för att hålla iOS-enhetstestklasser

Steg 5) Lägg till en enhetstestklass

Lägger till en ny enhetstestklassfil i testgruppen i Xcode

Steg 6) Börja nu din implementering

Tom enhetstestklass i Xcode editorn är redo för testimplementering

OCUnit använder språket Objective-C för att skapa testprogrammet, så utvecklaren måste kunna det språket. Xcode versioner levereras enhetstestning genom XCTest istället, vilket stöder både Objective-C och Swift, men mål-och-klassstrukturen som visas i dessa sex steg är oförändrad.

UIAutomation vs XCUITest: Vad som förändrades

Eftersom båda ramverken som används ovan tillhör en tidigare generation av Apples verktygskedja är det värt att vara exakt om vad som ersatte dem och varför.

Aspect UI-automation (instrument) XCUIT Test
Status Föråldrad i Xcode 8 och borttagen från senare utgåvor Apples stödda ramverk för UI-testning
Var tester finns Skript inuti ett instrument trace-dokument Ett UI-testpaketmål inuti Xcode projektet
Språk JavaScript Swift eller Objective-C
Testlöpare Automationsinstrumentet XCTest, samma löpare som enhetstester
Kontinuerlig integration Obekväm — driven genom instrument Körs från kommandoraden tillsammans med enhetstester
Inspelning Inspelningsknappen i instrumentfältet Inspelningsknappen i Xcode redaktör, som avger Swift

Den praktiska konsekvensen är att en XCUITest-svit är vanlig projektkällkod. Den granskas, versioneras och exekveras precis som resten av kodbasen, vilket är den främsta anledningen till att den inspelade-tracmodellen försvann.

Hur man skriver ett iOS UI-test med XCUITest

Den moderna motsvarigheten till de åtta instrumentstegen är kort. Strukturen nedan speglar samma idé med inspelning och sedan uppspelning, men utdata är en källfil snarare än en trace.

  1. Lägg till målet. In Xcode välj Arkiv > Nytt > Target och välj mallen UI Testing Bundle, eller markera alternativet för att inkludera tester när du skapar ett nytt projekt.
  2. Öppna den genererade testklassen. Xcode skapar en XCTestCase-underklass med tomma installations- och testmetoder.
  3. Starta appen som testas. Skapa en XCUIApplication-instans och anropa launch på den, vilket startar appen i en separat process.
  4. Fråga och agera. Nå element via elementfrågorna – knappar, tabeller, statiska texter – och anropa tryck, skriv text eller svep på dem.
  5. Hävda. Använd XCTAssert för att verifiera att det förväntade elementet finns efter åtgärden.
  6. Springa. Kör testet från Xcode testnavigatorn, eller från kommandoraden så att samma sviten körs i kontinuerlig integration.

Ett minimalt test följer denna form:

import XCTest

final class AppUITests: XCTestCase {

    func testTappingFirstRowShowsDetail() {
        let app = XCUIApplication()
        app.launch()

        // act on the first row of the list
        app.tables.cells.element(boundBy: 0).tap()

        // verify that the next screen appeared
        XCTAssertTrue(app.staticTexts.firstMatch.waitForExistence(timeout: 5))
    }
}

Inspelningsfunktionen finns fortfarande kvar: om man placerar markören i en testmetod och trycker på inspelningsknappen i redigeraren genereras dessa frågor automatiskt, vilket är en direkt följd av steg 6 ovan. De bredare principerna för automatiseringstestning gälla oförändrad.

Exempel på UI-automatisering Code

Den här artikeln innehåller några exempel på källkod. De hjälper dig att förstå handledningen tydligare och snabbare.

Exempel på UI-automatisering — testskript för demon av UI Automation.

Vanliga frågor

Nej. Xcode och iOS-simulatorerna körs bara på macOS, så en Mac krävs antingen lokalt eller som en värdbaserad byggmaskin. Molnbaserade enhetsfarmar och värdbaserade CI-leverantörer finns just så att team utan Mac-hårdvara fortfarande kan köra sviten.

Maskininlärningsmodeller föreslår ersättningsfrågor för element när en skärm ändras, klustrar instabila fel efter rotorsak och rangordning av vilka misslyckade körningar är genuina regressioner. Detta är viktigt för UI-sviter, där små layoutändringar annars skulle förstöra många selektorer samtidigt.

Den hanterar de repetitiva delarna bra – testklass-scaffolding, startargument, page-object wrappers och assertion boilerplate. Elementidentifierare måste fortfarande matcha den verkliga appen, så varje genererad fråga behöver verifieras mot den körande builden innan den är betrodd.

Appium driver iOS genom sin XCUITest-drivrutin, som ersatte den äldre UIAutomation-drivrutinen. Fördelen är ett plattformsoberoende testspråk för iOS och Android; avvägningen är ett extra lager mellan testet och Apples egen runner.

Ett enhetstest körs inuti appprocessen och anropar din kod direkt. Ett UI-test startar appen som en separat process och interagerar endast via gränssnittet, så det är långsammare men validerar vad användaren faktiskt upplever.

Simulatorer är snabbare och fungerar bra för de flesta funktionella flöden i en pipeline. Riktiga enheter behövs för kamera, biometri, push-notiser, prestanda och allt som rör hårdvarusensorer, så de flesta team kör båda vid olika tidpunkter i cykeln.

Varje test startar om appen och väntar på animationer. Stabiliteten förbättras när du anger tillgänglighetsidentifierare istället för matchning på etiketter, väntar på att elementet existerar istället för att sova.ping, återställ tillstånd mellan tester och håll varje fall fokuserat på en resa.

Inte direkt, eftersom språken och elementmodellerna skiljer sig åt. Den vanliga vägen är att behålla de gamla skripten som dokumentation av avsedd täckning, och sedan skriva om varje scenario som ett XCUITest-fall, med början i de resor som misslyckas oftast i produktion.

Sammanfatta detta inlägg med: