XCUITest је Apple-ов фрејмворк за UI тестирање iOS, iPadOS и macOS апликација, уграђен директно у XCTest и Xcode. Омогућава симулацију корисничких акција: кликове, унос текста, превлачење, скроловање и гестове — са приступом унутрашњем стању елемената интерфејса. Према Apple Developer Documentation, 2025, XCUIApplication је улазна тачка за све UI тестове и пружа приступ хијерархији елемената екрана.
Главне ствари
XCUITest је фрејмворк за UI тестирање који је Apple издао у Xcode 7 (2015. година). Заменио је UI Automation (UIA) и постао стандардни алат за аутоматизовано тестирање интерфејса на Apple платформама. XCUITest је потпуно интегрисан у XCTest — јединствени Apple тест фрејмворк.
За разлику од јединичних тестова који проверавају логику на нивоу класа и метода, XCUITest тестира кориснички интерфејс кроз симулацију акција. Тестови се покрећу у одвојеном процесу од апликације и комуницирају са њом путем Accessibility API-ја — то обезбеђује изолацију и поузданост.
XCUITest не захтева инсталацију сервера трећих страна (за разлику од Appium-а) нити додатних библиотека за интеракцију са уређајем. Све што је потребно је већ укључено у Xcode. Ово обезбеђује најбољу компатибилност са новим верзијама iOS-а и тренутни приступ новим гестовима и контролним елементима.
Архитектура XCUITest-а се заснива на две кључне класе: XCUIApplication — покренута тестирана апликација, и XCUIElement — елемент интерфејса. XCTest извршилац тестова управља животним циклусом тестова: setUp, тест методе, tearDown. XCUITest се покреће као засебан процес који контролише апликацију преко Accessibility моста.
Сваки UI елемент је представљен XCUIElement објектом који садржи методе за упит стања (exists, isHittable, label, value) и акције (tap, pressForDuration, swipeUp, typeText). Елементи су организовани у хијерархију кроз ланце упита: app.buttons[].staticTexts[].tables[]. Ово омогућава флексибилно проналажење било ког елемента на екрану.
XCUITest користи Accessibility атрибуте за идентификацију елемената: accessibilityIdentifier — програмски идентификатор, и accessibilityLabel — опис за VoiceOver. Препоручује се постављање accessibilityIdentifier у коду апликације — то чини тестове стабилним без обзира на локализацију и распоред.
XCUITest тестови се пишу у Swift-у користећи XCTest синтаксу. Свака тест класа наслеђује XCTestCase и садржи методе које почињу са test. У setUp методи се покреће апликација са жељеном конфигурацијом, а у tearDown се врши чишћење и завршетак сесије.
Типичан тест: пронађи елемент → изврши акцију → провери резултат. Претрага елемента се врши кроз дохватне упите XCUIElementQuery: app.buttons["loginButton"], app.textFields["email"]. Акције: .tap(), .typeText("text"), .swipeUp(). Провере: XCTAssertTrue(element.exists) или 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 подржава експлицитна чекања кроз XCTWaiter и NSPredicate предикате. На пример, чекање појављивања елемента у року од 5 секунди: XCTWaiter().wait(for: [expectation], timeout: 5). За разлику од Detox-а, XCUITest нема аутоматску синхронизацију са мрежним захтевима.
// Чекање појављивања елемента са тајмаутом
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 подржава тестирање сложених сценарија: мултитач гестови, push обавештења, Deep Links, SFSafariViewController и међуапликацијску интеракцију. Siri интенти се такође могу тестирати кроз XCUITest коришћењем Siri Remote симулације.
XCUITest подржава све популарне гестове: tap, doubleTap, pressForDuration, swipeUp/Down/Left/Right, pinch, rotate, twoFingerTap. За сложене сценарије користи се XCUIGesture са произвољним координатама и трајањем. Ово омогућава тестирање прилагођених гестова као што су цртање или drag-and-drop.
Од Xcode 12, XCUITest подржава пресретање мрежних захтева кроз XCTestExpectation и URLProtocol. Ово омогућава тестирање апликације у офлајн режиму или са измењеним одговорима сервера без измене кода апликације.
XCUITest се покреће у CI окружењима кроз xcodebuild са test флагом. За паралелно покретање на више симулатора користи се xcodebuild -testPlan са конфигурацијом паралелног извршавања у Xcode шеми. GitHub Actions, Bitrise и Jenkins имају уграђену подршку за XCUITest.
За CI је потребно подесити code signing, provisioning profiles и навести дестинацију (симулатор или уређај). iOS тестови на симулатору не захтевају сертификате. За стварне уређаје потребан је аутоматски потпис преко Xcode Cloud-а или Fastlane-а.
# Покретање XCUITest на симулатору путем 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 је уско повезан са Apple-овим Accessibility API-јем, јер се претрага елемената заснива на атрибутима приступачности. Accessibility тестирање — није само метод проналажења елемената, већ и провера приступачности апликације за особе са инвалидитетом. XCUITest може да провери accessibilityLabel, traits и hints.
VoiceOver — Apple-ов екрански читач за слепе кориснике. XCUITest омогућава проверу: accessibilityLabel — да ли је елемент описан разумљивим текстом, accessibilityTraits — да ли тип елемента одговара (дугме, наслов, слика), и accessibilityHint — да ли даје назнаку о резултату акције. Ове провере су обавезне за објављивање у App Store-у, а XCUITest их аутоматизује у оквиру регресионог покретања.
Од Xcode 15, XCUITest подржава уграђену проверу Accessibility кроз XCTAttachment са типом accessibilityAudit. Тест аутоматски пријављује елементе са недовољним контрастом, непотписане слике и нетачне traits. Ово замењује ручни Accessibility Inspector.
// Accessibility ревизија у XCUITest
func testAccessibilityAudit() {
let app = XCUIApplication()
app.launch()
let audit = XCTAttachment(accessibilityAudit: app)
add(audit)
// Провера одређеног елемента
let button = app.buttons["submitButton"]
XCTAssertTrue(button.label.count > 0)
XCTAssertTrue(button.isAccessibilityElement)
}
XCUITest подржава мерење перформанси UI-ја кроз XCTOSSignpostMetric и XCUIApplication.metrics. Може се измерити време покретања апликације (launch time), брзина навигације, време одговора на гестове. Перформанс тестови се покрећу са мерењем baseline и аутоматски падају при прекорачењу прага. Ово спречава регресије перформанси пре него што стигну до корисника у релизној верзији.
Baseline — референтно време извршења теста. Xcode памти baseline за сваки тест на одређеном моделу уређаја и верзији iOS-а. Ако ново покретање премаши baseline за одређени проценат (подразумевано 10%), тест се сматра палим. За ажурирање baseline-а користи се команда Edit Baseline у извештају тестова. Важно је прерачунати baseline при ажурирању верзије iOS-а или промени модела уређаја за CI фарму.
За праћење стабилности XCUITest тестова користе се флагови: continueAfterFailure (да ли наставити тест након првог пада) и Xcode тест планови са конфигурацијама понављања. Препоручује се подешавање аутоматског поновног покретања палих тестова (retry) — до 3 покушаја за флапајуће тестове повезане са тајминзима анимација или мрежним кашњењима.
XCUITest подржава тестирање push обавештења и Deep Links-ова кроз springboard и launchArguments. За push обавештења користи се XCUIApplication().launchArguments са параметром -UNUserNotificationCenter и слање кроз XCTest. Deep Links се тестирају кроз open URL са навођењем прилагођене шеме — XCUITest пресреће системски дијалог и проверава да ли се апликација отворила на исправном екрану. За тестирање сценарија одговора на обавештење користи се XCUIApplication().springboard који симулира клик на банер обавештења у центру обавештења iOS-а. Ови сценарији су критични за апликације са дубоким везама и push кампањама, где је потребно проверити исправност обраде спољних позива.
За детаљно профилисање перформанси, XCUITest се интегрише са Instruments-има. Током теста може се покренути профилисање Time Profiler, Core Animation или Leaks кроз XCTMetric. Резултати профилисања се чувају у извештају и доступни су за анализу у Xcode-у. Ово је посебно корисно при оптимизацији времена покретања апликације, навигације између екрана и перформанси анимација — типичних уских грла у iOS апликацијама.
Често постављана питања
XCTest — општи фрејмворк за све типове Apple тестова, укључујући јединичне тестове и перформанс тестове. XCUITest — надоградња на XCTest за UI тестирање, која додаје класе XCUIApplication, XCUIElement и XCUIElementQuery за интеракцију са интерфејсом.
Да, XCUITest подржава и Swift и Objective-C. Међутим, већина Apple примера и документације писана је у Swift-у. Objective-C пројекти могу користити XCUITest без додатног подешавања — фрејмворк је доступан преко @import XCTest.
XCUITest користи Apple-ов Accessibility API. Елементи се проналазе по accessibilityIdentifier, accessibilityLabel, типу (button, textField, staticText) или позицији у хијерархији. Што су Accessibility атрибути прецизније постављени у коду апликације, тестови су стабилнији.
Да, Xcode укључује уграђени рекордер UI тестова. При покретању теста у режиму снимања, Xcode бележи све интеракције са интерфејсом и генерише Swift код. Снимљени код се може дорадити: додати провере, издвојити у Page Objects и параметризовати.
За покретање на стварном уређају потребно је: повезати уређај са Mac-ом, додати га у Apple Developer Program, подесити provisioning profile, потписати апликацију развојним сертификатом и изабрати уређај као дестинацију у xcodebuild-у.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође