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 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.
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.
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.
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.
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.
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.
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.
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").
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)
}
}
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.
// 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)
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.
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.
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 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.
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.
# 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
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 — 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.
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.
// 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)
}
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 — 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.
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.
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.
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
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.
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.
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.
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.
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
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.
Lees ook