iOS-automatiseringstests met Xcode UI-framework

โšก Slimme samenvatting

iOS-automatiseringstesten met Xcode Het registreert en speelt gebruikersinterfaceacties af op een te testen applicatie, volgens een testgestuurde cyclus van ontwerpen, testen, implementeren en opnieuw testen totdat elk geval slaagt.

  • ๐Ÿ”˜ TDD-cyclus: Ontwerpen, testen, implementeren en opnieuw testen vormen de vier fasen die worden toegepast bij het testen van iOS-applicaties.
  • โ˜‘๏ธ Vereisten: Een Mac met OS X en de Xcode IDE, een automatiseringsframework en de iOS SDK zijn geรฏnstalleerd.
  • โœ… Instrumentenroute: Het Automation-instrument registreert een script, toont het in het scriptlogboek en speelt het op verzoek af.
  • ๐Ÿงช OCUnit-route: Een unit test bundle target, een active scheme, een test group en een test class geschreven in Objective-C.
  • โš ๏ธ Beรซindiging: Het UIAutomation-instrument is afgeschaft in Xcode Versie 8 is verwijderd; XCUITest is de ondersteunde opvolger.
  • ๏ธ Modern equivalent: Een UI Testing Bundle-doel plus XCUIApplication-query's vervangen het opgenomen Instruments-script.

iOS-automatiseringstesten met de Xcode UI Automation framework dat een opgenomen script uitvoert op een app.

iOS-automatiseringstests met behulp van Xcode

Om de kwaliteit van uw iOS-applicatie te garanderen, dient u het testgestuurde ontwikkelingsproces te volgen dat in de onderstaande afbeelding wordt weergegeven.

Testgestuurde ontwikkelingscyclus voor geautomatiseerd testen van iOS-apparaten, met de fasen ontwerp, testen, implementeren en hertesten.

Test Driven Development (TDD) is een het testen van model dat wordt toegepast op het testen van iOS-applicaties, en het past binnen de bredere praktijk van mobiel testenIn dit model moet een tester de onderstaande 4 fasen doorlopen:

  • Design: Bepaal wat je wilt testen en ontwerp je testgevallen.
  • Test: Voer alle tests uit en kijk of er testgevallen zijn die mislukken.
  • Implementeren: RevGebruik je code en verhelp de fouten die ervoor zorgden dat de test mislukte.
  • Test opnieuw: Als een test mislukt, ga dan terug naar het ontwerp. Als alle testgevallen slagen, voldoet de code aan alle geteste vereisten.

Opzetten Xcode Project voor UI-testen

Om een โ€‹โ€‹iOS-testprogramma te maken, heb je een Mac nodig. Op je Mac moet het volgende al geรฏnstalleerd zijn:

  • OS X โ€” het besturingssysteem voor een Mac.
  • Xcode IDE โ€” de ontwikkeltool voor iOS.
  • Een geautomatiseerd testframework โ€” UI Automation, OCUnit, enzovoort.
  • iOS SDK 4 of hoger.

โš ๏ธ Versie-opmerking: De bovenstaande voorwaarden beschrijven de toolchain van het tijdperk waarin de twee volgende handleidingen zijn geschreven. Op een moderne Mac, Xcode De XCTest- en XCUITest-frameworks worden standaard meegeleverd, en het aparte UI Automation-instrument maakt geen deel meer uit van de installatie. De oorspronkelijke stappen zijn hieronder bewaard gebleven omdat ze documenteren hoe het framework werkte, en de moderne equivalent wordt verderop beschreven.

Hoe iOS-automatisering te creรซren met behulp van UI Automation Framework

De acht onderstaande stappen registreren een script met het Automation-instrument en spelen dit af op de te testen applicatie.

Stap 1) Lanceer instrumenten

Open XCode -> Ontwikkelaarstools openen -> Instrument

Openingsinstrumenten van de Xcode Open het menu Ontwikkelaarstools

Stap 2) Voeg een automatiseringsinstrument toe

Selecteer in het venster Instrumenten het instrument Automatisering.

Het automatiseringsinstrument selecteren in de sjabloonkiezer voor instrumenten.

Om een โ€‹โ€‹testscript te maken, neem je ofwel een testscript op, ofwel een testscript. testscenario Of je programmeert het handmatig.

Stap 3) Druk op de rode knop

Een instrument wordt opgestart โ€” stop de opname onmiddellijk. Om de opname te starten, drukt u op de rode knop.

De rode opnameknop in de instrumentenwerkbalk wordt gebruikt om een โ€‹โ€‹opname te starten en te stoppen. trace

Stap 4) Maak een nieuw script

Klik in het venster Scripts op Toevoegen > Maken om een โ€‹โ€‹nieuw script te maken.

In het venster Instruments Scripts kunt u een nieuw automatiseringsscript toevoegen en maken via het menu 'Toevoegen en maken'.

Stap 5) Kies het doel

U bevindt zich nu in de Trace-venster. Gebruik de optie Kiezen Target Trek het menu naar beneden om naar de debugversie van je app te gaan.

Kies Target uittrekmenu in Instrumenten Trace venster dat verwijst naar de debug build

In dit geval ging het om het voorbeeld van Apple. EenvoudigDrillDown De app wordt gebruikt als de te testen applicatie. De gebruikersinterface (GUI) ervan wordt hieronder weergegeven.

De interface van de SimpleDrillDown-voorbeeldapplicatie wordt gebruikt als de te testen applicatie.

Stap 6) Begin met het opnemen van uw script

Neem uw script op door op de opnameknop bovenaan of onderaan de tool te drukken.

De opnameknop aan de rand van het Instruments-venster start de scriptopname.

Nu kunt u enkele UI-acties uitvoeren op de applicatie die u test, en uw script wordt opgenomen.

Stap 7) Bekijk je script

Om je script te zien, druk je op de Trace Log / Editor Log dropdown en schakel over naar de scriptlogweergave.

TracHet vervolgkeuzemenu 'Log' en 'Editor Log' wordt gebruikt om over te schakelen naar de scriptlogweergave.

U zult uw opgenomen script zien.

Het opgenomen UI Automation-script wordt weergegeven in de scriptlogweergave van Instruments.

Stap 8) Speel je script af

Druk op de afspeelknop. Het script wordt uitgevoerd en je kunt het stoppen zodra de logbestanden verschijnen.

Het opgenomen automatiseringsscript wordt afgespeeld met loguitvoer in het venster Instrumenten.

โš ๏ธ Historische noot: Het automatiseringsinstrument dat in deze acht stappen werd gebruikt, is verouderd in Xcode Vanaf versie 8 is het verwijderd, dus het is niet meer aanwezig in de huidige versie. Xcode installaties. De stappen zijn hier bewaard gebleven als een verslag van hoe het framework werkte; voor nieuw werk kunt u de XCUITest-handleiding verderop op deze pagina gebruiken.

Hoe iOS-automatisering te creรซren met behulp van het OCUnit-framework

De tweede route plaatst de tests binnenin de Xcode Het projecteert zichzelf eerder dan dat het zich binnen de instrumenten bevindt.

Stap 1) Beginnen Xcode IDE, Voeg een unit-testbundeldoel toe

Een Unit Test Bundle-doel toevoegen aan een bestaande Xcode project

Stap 2) Schrijf de naam van de nieuwe unit testbundel. zoals weergegeven in de bovenstaande afbeelding, klik dan op Voltooien.

Stap 3) Maak de unit-test het actieve doel

Het selecteren van de unit testbundel als actief doel in Xcode

Stap 4) Voeg een groep toe voor testklassen

Een projectgroep aanmaken voor de iOS-unit-testklassen.

Stap 5) Voeg een Unit-testklasse toe

Een nieuw unit test-klassebestand toevoegen binnen de testgroep in Xcode

Stap 6) Begin nu met de implementatie.

Lege unit testklasse in de Xcode Editor klaar voor de testimplementatie

OCUnit gebruikt de Objective-C-taal om het testprogramma te maken, dus de ontwikkelaar moet die taal beheersen. Xcode versies verzenden testen van een eenheid via XCTest, dat zowel Objective-C als ondersteunt. SwiftMaar de doel- en klassestructuur die in deze zes stappen wordt getoond, blijft ongewijzigd.

UIAutomation versus XCUITest: Wat is er veranderd?

Omdat beide hierboven gebruikte frameworks tot een eerdere generatie van de Apple-toolchain behoren, is het belangrijk om precies te vermelden wat ze heeft vervangen en waarom.

Aspect UI-automatisering (instrumenten) XCUITest
Status Verouderd in Xcode 8 en verwijderd uit latere releases Het door Apple ondersteunde framework voor UI-testen.
Waar de tests plaatsvinden Scripts binnen een Instruments trace-document Een UI Testing Bundle-doel binnen de Xcode project
Taal JavaScript Swift of Objectief-C
Testloper Het automatiseringsinstrument XCTest, dezelfde runner als voor unit tests
Continue integratie Onhandig โ€” gedreven door Instruments Wordt uitgevoerd vanaf de commandoregel, samen met unit tests.
Opnemen Opnameknop in de instrumentenwerkbalk Opnameknop in de Xcode editor, die uitzendt Swift

Het praktische gevolg hiervan is dat een XCUITest-suite gewone broncode van een project is. Deze wordt beoordeeld, van versiebeheer voorzien en uitgevoerd zoals de rest van de codebase, wat de belangrijkste reden is voor de vastgelegde resultaten.tracHet model is verdwenen.

Hoe schrijf je een iOS UI-test met XCUITest?

Het moderne equivalent van de acht Instruments-stappen is kort. De onderstaande structuur weerspiegelt hetzelfde idee van opnemen en vervolgens afspelen, maar de uitvoer is een bronbestand in plaats van een audiobestand. trace.

  1. Voeg het doel toe. In Xcode Kies Bestand > Nieuw > Target en kies de sjabloon UI Testing Bundle, of vink de optie aan om tests op te nemen bij het maken van een nieuw project.
  2. Open de gegenereerde testklasse. Xcode Maakt een XCTestCase-subklasse aan met lege setup- en testmethoden.
  3. Start de te testen app. Maak een XCUIApplication-instantie aan en roep de launch-methode erop aan. Hiermee start de app in een apart proces.
  4. Stel vragen en handel. Benader elementen via elementquery's โ€” knoppen, tabellen, statische teksten โ€” en roep tik-, typeText- of veegacties erop aan.
  5. Beweren. Gebruik XCTAssert om te controleren of het verwachte element na de actie bestaat.
  6. Rennen. Voer de test uit vanuit de Xcode test navigator, of vanaf de commandoregel, zodat dezelfde suite in continue integratie wordt uitgevoerd.

Een minimale test heeft deze vorm:

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))
    }
}

De recorder bestaat nog steeds: door de cursor in een testmethode te plaatsen en op de opnameknop in de editor te drukken, worden deze query's automatisch gegenereerd. Dit is een direct gevolg van stap 6 hierboven. De bredere principes van automatisering testen Onveranderd van toepassing blijven.

Voorbeeld van UI-automatisering Code

Dit artikel bevat enkele voorbeelden van broncode. Deze helpen je de handleiding sneller en beter te begrijpen.

Voorbeeld van UI-automatisering โ€” testscript voor de UI Automation-demo.

Veelgestelde vragen

Nee. Xcode en de iOS-simulators werken alleen op macOSEen Mac is dus vereist, lokaal of als gehoste buildmachine. Cloud-apparaatparken en gehoste CI-providers bestaan โ€‹โ€‹juist zodat teams zonder Mac-hardware de suite toch kunnen uitvoeren.

Machine learning-modellen suggereren vervangende elementquery's wanneer een scherm verandert, groeperen onbetrouwbare fouten op basis van de hoofdoorzaak en rangschikken welke mislukte uitvoeringen daadwerkelijke regressies zijn. Dit is belangrijk voor UI-suites, waar kleine lay-outwijzigingen anders veel selectors tegelijk onbruikbaar maken.

Het behandelt de repetitieve onderdelen goed: het genereren van testklassen, het opstellen van opstartargumenten, het wrappen van page-objecten en de standaardcode voor beweringen. Element-ID's moeten echter nog steeds overeenkomen met de daadwerkelijke applicatie, dus elke gegenereerde query moet worden geverifieerd aan de hand van de draaiende build voordat deze als betrouwbaar wordt beschouwd.

Appium stuurt iOS aan via de XCUITest-driver, die de oudere UIAutomation-driver heeft vervangen. Het voordeel is รฉรฉn platformonafhankelijke testtaal voor iOS en AndroidHet nadeel is dat er een extra laag tussen de test en Apple's eigen testrunner komt.

Een unit-test draait binnen het app-proces en roept je code direct aan. Een UI-test start de app als een apart proces en communiceert alleen via de interface. Daardoor is een UI-test trager, maar valideert wel wat de gebruiker daadwerkelijk ervaart.

Simulatoren zijn sneller en prima geschikt voor de meeste functionele processen in een pipeline. Echte apparaten zijn nodig voor camera's, biometrie, pushnotificaties, prestatiemetingen en alles wat met hardware-sensoren te maken heeft. Daarom gebruiken de meeste teams beide op verschillende momenten in de cyclus.

Elke test herstart de app en wacht op animaties. De stabiliteit verbetert wanneer je toegankelijkheids-ID's instelt in plaats van te matchen op labels, en wacht op het bestaan โ€‹โ€‹van een element in plaats van op een slee.ping, de status tussen tests resetten en ervoor zorgen dat elk geval zich op รฉรฉn specifiek traject richt.

Niet direct, omdat de talen en elementmodellen verschillen. De gebruikelijke aanpak is om de oude scripts te bewaren als documentatie van de beoogde testdekking en vervolgens elk scenario te herschrijven als een XCUITest-case, te beginnen met de trajecten die in productie het vaakst falen.

Vat dit bericht samen met: