XCUITest: wat is het, werkingsprincipes en UI-testen van iOS

Auteur: IT Sectr Gepubliceerd: 2026-04-09 Leestijd: 8 min

XCUITest is een Apple-framework voor UI-testen van iOS-, iPadOS- en macOS-apps, direct ingebouwd in XCTest en Xcode. Het maakt simulatie van gebruikersacties mogelijk: klikken, tekstinvoer, vegen, scrollen en gebaren — met toegang tot de interne status van interface-elementen. Volgens Apple Developer Documentation, 2025 is XCUIApplication het toegangspunt voor alle UI-tests en biedt het toegang tot de hiërarchie van schermelementen.

Belangrijkste punten

  • XCUITest — native Apple-framework voor UI-testen, ingebouwd in Xcode
  • White-box benadering biedt toegang tot Accessibility-attributen en elementhiërarchie
  • Tests worden geschreven in Swift of Objective-C in integratie met XCTest
  • Testopname beschikbaar via de ingebouwde recorder in Xcode
  • Uitvoering gebeurt op de iOS-simulator of een fysiek apparaat zonder extra servers

Wat is XCUITest

XCUITest is een UI-testframework dat door Apple is uitgebracht in Xcode 7 (2015). Het verving UI Automation (UIA) en werd de standaardtool voor geautomatiseerd testen van interfaces op Apple-platforms. XCUITest is volledig geïntegreerd in XCTest — het uniforme testframework van Apple.

Verschil met XCTest-unittests

In tegenstelling tot unittests die logica op klasse- en methodeniveau controleren, test XCUITest de gebruikersinterface door middel van actiesimulatie. Tests worden uitgevoerd in een apart proces van de app en communiceren ermee via de Accessibility API — dit zorgt voor isolatie en betrouwbaarheid.

Voordelen van de native benadering

XCUITest vereist geen installatie van externe servers (in tegenstelling tot Appium) of extra bibliotheken voor interactie met het apparaat. Alles wat nodig is, is al opgenomen in Xcode. Dit zorgt voor de beste compatibiliteit met nieuwe iOS-versies en directe toegang tot nieuwe gebaren en bedieningselementen.

Architectuur van XCUITest en XCTest

De architectuur van XCUITest is gebaseerd op twee kernklassen: XCUIApplication — de gestarte geteste app, en XCUIElement — het interface-element. De XCTest-testrunner beheert de levenscyclus van tests: setUp, testmethoden, tearDown. XCUITest wordt uitgevoerd als een apart proces dat de app aanstuurt via de Accessibility-brug.

Elementhiërarchie

Elk UI-element wordt vertegenwoordigd door een XCUIElement-object dat methoden bevat voor het opvragen van de status (exists, isHittable, label, value) en acties (tap, pressForDuration, swipeUp, typeText). Elementen worden georganiseerd in een hiërarchie via queryketens: app.buttons[].staticTexts[].tables[]. Dit maakt flexibel zoeken naar elk element op het scherm mogelijk.

Accessibility en locators

XCUITest gebruikt Accessibility-attributen voor identificatie van elementen: accessibilityIdentifier — programmatische identificatie, en accessibilityLabel — beschrijving voor VoiceOver. Het wordt aanbevolen om accessibilityIdentifier in de app-code in te stellen — dit maakt tests stabiel ongeacht lokalisatie en lay-out.

UI-tests schrijven in XCUITest

XCUITest-tests worden geschreven in Swift met XCTest-syntax. Elke testklasse erft van XCTestCase en bevat methoden die beginnen met test. In de setUp-methode wordt de app gestart met de gewenste configuratie, en in tearDown vindt opschoning en beëindiging van de sessie plaats.

Basis testscenario

Een typische test: vind element → voer actie uit → controleer resultaat. Het zoeken naar elementen gebeurt via onderliggende XCUIElementQuery-query's: app.buttons["loginButton"], app.textFields["email"]. Acties: .tap(), .typeText("text"), .swipeUp(). Controles: XCTAssertTrue(element.exists) of XCTAssertEqual(element.label, "expected").

swift
import XCTest

class LoginTests: XCTestCase {
    let app = XCUIApplication()

    override func setUp() {
        continueAfterFailure = false
        app.launch()
    }

    func testLoginWithValidCredentials() {
        let emailField = app.textFields["emailInput"]
        emailField.tap()
        emailField.typeText("user@test.com")

        let passwordField = app.secureTextFields["passwordInput"]
        passwordField.tap()
        passwordField.typeText("password123")

        app.buttons["loginButton"].tap()

        let homeLabel = app.staticTexts["homeTitle"]
        XCTAssertTrue(homeLabel.exists)
    }
}

Wachttijden en synchronisatie

XCUITest ondersteunt expliciete wachttijden via XCTWaiter en NSPredicate-predicaten. Bijvoorbeeld wachten op verschijnen van een element binnen 5 seconden: XCTWaiter().wait(for: [expectation], timeout: 5). In tegenstelling tot Detox heeft XCUITest geen automatische synchronisatie met netwerkverzoeken.

swift
// Wachten op verschijnen van element met timeout
let expectedElement = app.staticTexts["welcomeMessage"]
let existsPredicate = NSPredicate(format: "exists == true")
let expectation = XCTNSNotificationExpectation(object: expectedElement)
let result = XCTWaiter().wait(
    for: [expectation], timeout: 5
)
XCTAssertEqual(result, .completed)

Geavanceerde functies van XCUITest

XCUITest ondersteunt het testen van complexe scenario's: multi-touch gebaren, pushmeldingen, Deep Links, SFSafariViewController en interactie tussen apps. Siri-intenties kunnen ook worden getest via XCUITest met behulp van Siri Remote-simulatie.

Gebaren testen

XCUITest ondersteunt alle populaire gebaren: tap, doubleTap, pressForDuration, swipeUp/Down/Left/Right, pinch, rotate, twoFingerTap. Voor complexe scenario's wordt XCUIGesture gebruikt met willekeurige coördinaten en duur. Dit maakt het testen van aangepaste gebaren zoals tekenen of drag-and-drop mogelijk.

Netwerkverzoeken onderscheppen

Sinds Xcode 12 ondersteunt XCUITest onderschepping van netwerkverzoeken via XCTestExpectation en URLProtocol. Dit maakt het mogelijk om de app offline te testen of met vervangen serverantwoorden zonder de app-code te wijzigen.

XCUITest in CI/CD

XCUITest wordt in CI-omgevingen gestart via xcodebuild met de test-vlag. Voor parallelle uitvoering op meerdere simulators wordt xcodebuild -testPlan gebruikt met configuratie van parallelle uitvoering in het Xcode-schema. GitHub Actions, Bitrise en Jenkins hebben ingebouwde ondersteuning voor XCUITest.

Configuratie voor CI

Voor CI is configuratie van code signing, provisioning profiles en specificatie van de bestemming (simulator of apparaat) vereist. iOS-tests op de simulator hebben geen certificaten nodig. Voor fysieke apparaten is automatisch ondertekenen via Xcode Cloud of Fastlane nodig.

bash
# XCUITest starten op simulator via xcodebuild
xcodebuild test \
  -project MyApp.xcodeproj \
  -scheme MyApp \
  -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.5' \
  -resultBundlePath ./TestResults \
  -parallel-testing-enabled YES \
  -parallel-testing-worker-count 4

Accessibility testen via XCUITest

XCUITest is nauw verbonden met de Accessibility API van Apple, omdat het zoeken naar elementen is gebaseerd op toegankelijkheidsattributen. Toegankelijkheidstesten — is niet alleen een methode om elementen te vinden, maar ook om de toegankelijkheid van de app voor mensen met een beperking te controleren. XCUITest kan accessibilityLabel, traits en hints controleren.

VoiceOver-controle

VoiceOver — de schermlezer van Apple voor blinde gebruikers. XCUITest maakt controle mogelijk: accessibilityLabel — of het element is beschreven met begrijpelijke tekst, accessibilityTraits — of het elementtype overeenkomt (knop, koptekst, afbeelding), en accessibilityHint — of het een hint geeft over het resultaat van de actie. Deze controles zijn verplicht voor publicatie in de App Store en XCUITest automatiseert ze in het kader van de regressierun.

Automatische Accessibility-controle

Sinds Xcode 15 ondersteunt XCUITest ingebouwde Accessibility-controle via XCTAttachment met het type accessibilityAudit. De test rapporteert automatisch elementen met onvoldoende contrast, ongelabelde afbeeldingen en onjuiste traits. Dit vervangt de handmatige Accessibility Inspector.

swift
// Toegankelijkheidsaudit in XCUITest
func testAccessibilityAudit() {
    let app = XCUIApplication()
    app.launch()

    let audit = XCTAttachment(accessibilityAudit: app)
    add(audit)

    // Specifiek element controleren
    let button = app.buttons["submitButton"]
    XCTAssertTrue(button.label.count > 0)
    XCTAssertTrue(button.isAccessibilityElement)
}

Prestatietests in XCUITest

XCUITest ondersteunt het meten van UI-prestaties via XCTOSSignpostMetric en XCUIApplication.metrics. De opstarttijd van de app (launch time), navigatiesnelheid en responstijd op gebaren kunnen worden gemeten. Prestatietests worden uitgevoerd met baseline-meting en mislukken automatisch bij overschrijding van de drempel. Dit voorkomt prestatieregressies voordat ze gebruikers bereiken in de releaseversie.

Baseline configureren

Baseline — de referentietijd van de testuitvoering. Xcode onthoudt de baseline voor elke test op een specifiek apparaatmodel en iOS-versie. Als een nieuwe uitvoering de baseline met een ingesteld percentage (standaard 10%) overschrijdt, wordt de test als mislukt beschouwd. Voor het bijwerken van de baseline wordt de opdracht Edit Baseline in het testrapport gebruikt. Het is belangrijk om de baseline opnieuw te berekenen bij het bijwerken van de iOS-versie of het wijzigen van het apparaatmodel voor de CI-farm.

Monitoren van teststabiliteit

Voor het volgen van de stabiliteit van XCUITest-tests worden vlaggen gebruikt: continueAfterFailure (of de test moet doorgaan na de eerste mislukking) en Xcode-testplannen met herhalingsconfiguraties. Het wordt aanbevolen om automatisch opnieuw starten van mislukte tests (retry) te configureren — tot 3 pogingen voor flakkerende tests die verband houden met animatietiming of netwerkvertragingen.

Pushmeldingen en Deep Links testen

XCUITest ondersteunt het testen van pushmeldingen en Deep Links via springboard en launchArguments. Voor pushmeldingen wordt XCUIApplication().launchArguments gebruikt met de parameter -UNUserNotificationCenter en verzending via XCTest. Deep Links worden getest via open URL met een aangepast schema — XCUITest onderschept het systeemdialoogvenster en controleert of de app op het juiste scherm is geopend. Voor het testen van het antwoordscenario op een melding wordt XCUIApplication().springboard gebruikt, die een klik op de meldingsbanner in het iOS-meldingscentrum simuleert. Deze scenario's zijn kritiek voor apps met diepe links en pushcampagnes, waar de juiste verwerking van externe oproepen moet worden gecontroleerd.

Integratie met Instruments

Voor gedetailleerde prestatieprofilering integreert XCUITest met Instruments. Tijdens de test kan profilering van Time Profiler, Core Animation of Leaks worden gestart via XCTMetric. De profileringsresultaten worden opgeslagen in het rapport en zijn beschikbaar voor analyse in Xcode. Dit is vooral handig bij het optimaliseren van de opstarttijd van de app, navigatie tussen schermen en prestaties van animaties — typische knelpunten in iOS-apps.

Veelgestelde vragen

Wat is het verschil tussen XCUITest en XCTest?

XCTest is een algemeen framework voor alle soorten Apple-tests, waaronder unittesten en prestatietests. XCUITest is een laag bovenop XCTest voor UI-testen die de klassen XCUIApplication, XCUIElement en XCUIElementQuery toevoegt voor interactie met de interface.

Kan XCUITest worden gebruikt met Objective-C?

Ja, XCUITest ondersteunt zowel Swift als Objective-C. De meeste voorbeelden en documentatie van Apple zijn echter in Swift geschreven. Objective-C-projecten kunnen XCUITest zonder extra configuratie gebruiken — het framework is beschikbaar via @import XCTest.

Hoe vindt XCUITest elementen op het scherm?

XCUITest gebruikt de Accessibility API van Apple. Elementen worden gevonden op accessibilityIdentifier, accessibilityLabel, type (button, textField, staticText) of positie in de hiërarchie. Hoe nauwkeuriger de Accessibility-attributen in de app-code zijn ingesteld, hoe stabieler de tests zijn.

Ondersteunt XCUITest het opnemen van tests?

Ja, Xcode bevat een ingebouwde recorder voor UI-tests. Bij het starten van een test in de opnamemodus registreert Xcode alle interacties met de interface en genereert het Swift-code. De opgenomen code kan worden verbeterd: controles toevoegen, uitsplitsen in Page Objects en parametriseren.

Hoe voer ik XCUITest uit op een fysiek apparaat?

Voor uitvoering op een fysiek apparaat moet u: het apparaat aansluiten op de Mac, toevoegen aan het Apple Developer Program, een provisioning profile configureren, de app ondertekenen met een ontwikkelingscertificaat en het apparaat selecteren als bestemming in xcodebuild.

Samenvatting

  • XCUITest — native Apple-framework voor UI-testen van iOS-, iPadOS- en macOS-apps
  • Integratie met Xcode biedt testopname, parallelle uitvoering en ingebouwde rapporten
  • XCUIApplication en XCUIElement — kernklassen voor interactie met de app
  • Accessibility-attributen worden gebruikt als betrouwbare locators, stabiel bij lay-outwijzigingen
  • Wachttijden worden geïmplementeerd via XCTWaiter en NSPredicate — geen automatische synchronisatie
  • CI/CD ondersteund via xcodebuild met parallelle uitvoering op simulators
  • Geavanceerde scenario's omvatten multitouch, Siri Intents, netwerkverzoeken onderscheppen en Deep Links

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook