XCUITest: шта је то, принципи рада и UI тестирање iOS-а

Аутор: IT Sectr Објављено: 2026-04-09 Време читања: 8 мин

XCUITest је Apple-ов фрејмворк за UI тестирање iOS, iPadOS и macOS апликација, уграђен директно у XCTest и Xcode. Омогућава симулацију корисничких акција: кликове, унос текста, превлачење, скроловање и гестове — са приступом унутрашњем стању елемената интерфејса. Према Apple Developer Documentation, 2025, XCUIApplication је улазна тачка за све UI тестове и пружа приступ хијерархији елемената екрана.

Главне ствари

  • XCUITest — изворни Apple фрејмворк за UI тестирање, уграђен у Xcode
  • White-box приступ обезбеђује приступ Accessibility атрибутима и хијерархији елемената
  • Тестови се пишу у Swift или Objective-C уз интеграцију са XCTest
  • Снимање тестова доступно кроз уграђени рекордер у Xcode-у
  • Покретање се врши на iOS симулатору или стварном уређају без додатних сервера

Шта је XCUITest

XCUITest је фрејмворк за UI тестирање који је Apple издао у Xcode 7 (2015. година). Заменио је UI Automation (UIA) и постао стандардни алат за аутоматизовано тестирање интерфејса на Apple платформама. XCUITest је потпуно интегрисан у XCTest — јединствени Apple тест фрејмворк.

Разлика у односу на XCTest јединичне тестове

За разлику од јединичних тестова који проверавају логику на нивоу класа и метода, XCUITest тестира кориснички интерфејс кроз симулацију акција. Тестови се покрећу у одвојеном процесу од апликације и комуницирају са њом путем Accessibility API-ја — то обезбеђује изолацију и поузданост.

Предности изворног приступа

XCUITest не захтева инсталацију сервера трећих страна (за разлику од Appium-а) нити додатних библиотека за интеракцију са уређајем. Све што је потребно је већ укључено у Xcode. Ово обезбеђује најбољу компатибилност са новим верзијама iOS-а и тренутни приступ новим гестовима и контролним елементима.

Архитектура XCUITest и XCTest

Архитектура XCUITest-а се заснива на две кључне класе: XCUIApplication — покренута тестирана апликација, и XCUIElement — елемент интерфејса. XCTest извршилац тестова управља животним циклусом тестова: setUp, тест методе, tearDown. XCUITest се покреће као засебан процес који контролише апликацију преко Accessibility моста.

Хијерархија елемената

Сваки UI елемент је представљен XCUIElement објектом који садржи методе за упит стања (exists, isHittable, label, value) и акције (tap, pressForDuration, swipeUp, typeText). Елементи су организовани у хијерархију кроз ланце упита: app.buttons[].staticTexts[].tables[]. Ово омогућава флексибилно проналажење било ког елемента на екрану.

Accessibility и локатори

XCUITest користи Accessibility атрибуте за идентификацију елемената: accessibilityIdentifier — програмски идентификатор, и accessibilityLabel — опис за VoiceOver. Препоручује се постављање accessibilityIdentifier у коду апликације — то чини тестове стабилним без обзира на локализацију и распоред.

Писање UI тестова у XCUITest

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").

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

Чекања и синхронизација

XCUITest подржава експлицитна чекања кроз XCTWaiter и NSPredicate предикате. На пример, чекање појављивања елемента у року од 5 секунди: XCTWaiter().wait(for: [expectation], timeout: 5). За разлику од Detox-а, XCUITest нема аутоматску синхронизацију са мрежним захтевима.

swift
// Чекање појављивања елемента са тајмаутом
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

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/CD

XCUITest се покреће у CI окружењима кроз xcodebuild са test флагом. За паралелно покретање на више симулатора користи се xcodebuild -testPlan са конфигурацијом паралелног извршавања у Xcode шеми. GitHub Actions, Bitrise и Jenkins имају уграђену подршку за XCUITest.

Конфигурација за CI

За CI је потребно подесити code signing, provisioning profiles и навести дестинацију (симулатор или уређај). iOS тестови на симулатору не захтевају сертификате. За стварне уређаје потребан је аутоматски потпис преко Xcode Cloud-а или Fastlane-а.

bash
# Покретање 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

Тестирање Accessibility кроз XCUITest

XCUITest је уско повезан са Apple-овим Accessibility API-јем, јер се претрага елемената заснива на атрибутима приступачности. Accessibility тестирање — није само метод проналажења елемената, већ и провера приступачности апликације за особе са инвалидитетом. XCUITest може да провери accessibilityLabel, traits и hints.

Провера VoiceOver-а

VoiceOver — Apple-ов екрански читач за слепе кориснике. XCUITest омогућава проверу: accessibilityLabel — да ли је елемент описан разумљивим текстом, accessibilityTraits — да ли тип елемента одговара (дугме, наслов, слика), и accessibilityHint — да ли даје назнаку о резултату акције. Ове провере су обавезне за објављивање у App Store-у, а XCUITest их аутоматизује у оквиру регресионог покретања.

Аутоматска провера Accessibility

Од Xcode 15, XCUITest подржава уграђену проверу Accessibility кроз XCTAttachment са типом accessibilityAudit. Тест аутоматски пријављује елементе са недовољним контрастом, непотписане слике и нетачне traits. Ово замењује ручни Accessibility Inspector.

swift
// 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

XCUITest подржава мерење перформанси UI-ја кроз XCTOSSignpostMetric и XCUIApplication.metrics. Може се измерити време покретања апликације (launch time), брзина навигације, време одговора на гестове. Перформанс тестови се покрећу са мерењем baseline и аутоматски падају при прекорачењу прага. Ово спречава регресије перформанси пре него што стигну до корисника у релизној верзији.

Подешавање baseline-а

Baseline — референтно време извршења теста. Xcode памти baseline за сваки тест на одређеном моделу уређаја и верзији iOS-а. Ако ново покретање премаши baseline за одређени проценат (подразумевано 10%), тест се сматра палим. За ажурирање baseline-а користи се команда Edit Baseline у извештају тестова. Важно је прерачунати baseline при ажурирању верзије iOS-а или промени модела уређаја за CI фарму.

Праћење стабилности тестова

За праћење стабилности XCUITest тестова користе се флагови: continueAfterFailure (да ли наставити тест након првог пада) и Xcode тест планови са конфигурацијама понављања. Препоручује се подешавање аутоматског поновног покретања палих тестова (retry) — до 3 покушаја за флапајуће тестове повезане са тајминзима анимација или мрежним кашњењима.

Тестирање push обавештења и Deep Links-ова

XCUITest подржава тестирање push обавештења и Deep Links-ова кроз springboard и launchArguments. За push обавештења користи се XCUIApplication().launchArguments са параметром -UNUserNotificationCenter и слање кроз XCTest. Deep Links се тестирају кроз open URL са навођењем прилагођене шеме — XCUITest пресреће системски дијалог и проверава да ли се апликација отворила на исправном екрану. За тестирање сценарија одговора на обавештење користи се XCUIApplication().springboard који симулира клик на банер обавештења у центру обавештења iOS-а. Ови сценарији су критични за апликације са дубоким везама и push кампањама, где је потребно проверити исправност обраде спољних позива.

Интеграција са Instruments-има

За детаљно профилисање перформанси, XCUITest се интегрише са Instruments-има. Током теста може се покренути профилисање Time Profiler, Core Animation или Leaks кроз XCTMetric. Резултати профилисања се чувају у извештају и доступни су за анализу у Xcode-у. Ово је посебно корисно при оптимизацији времена покретања апликације, навигације између екрана и перформанси анимација — типичних уских грла у iOS апликацијама.

Често постављана питања

Која је разлика између XCUITest и XCTest?

XCTest — општи фрејмворк за све типове Apple тестова, укључујући јединичне тестове и перформанс тестове. XCUITest — надоградња на XCTest за UI тестирање, која додаје класе XCUIApplication, XCUIElement и XCUIElementQuery за интеракцију са интерфејсом.

Може ли се XCUITest користити са Objective-C?

Да, XCUITest подржава и Swift и Objective-C. Међутим, већина Apple примера и документације писана је у Swift-у. Objective-C пројекти могу користити XCUITest без додатног подешавања — фрејмворк је доступан преко @import XCTest.

Како XCUITest проналази елементе на екрану?

XCUITest користи Apple-ов Accessibility API. Елементи се проналазе по accessibilityIdentifier, accessibilityLabel, типу (button, textField, staticText) или позицији у хијерархији. Што су Accessibility атрибути прецизније постављени у коду апликације, тестови су стабилнији.

Да ли XCUITest подржава снимање тестова?

Да, Xcode укључује уграђени рекордер UI тестова. При покретању теста у режиму снимања, Xcode бележи све интеракције са интерфејсом и генерише Swift код. Снимљени код се може дорадити: додати провере, издвојити у Page Objects и параметризовати.

Како покренути XCUITest на стварном уређају?

За покретање на стварном уређају потребно је: повезати уређај са Mac-ом, додати га у Apple Developer Program, подесити provisioning profile, потписати апликацију развојним сертификатом и изабрати уређај као дестинацију у xcodebuild-у.

Закључак

  • XCUITest — изворни Apple фрејмворк за UI тестирање iOS, iPadOS и macOS апликација
  • Интеграција са Xcode обезбеђује снимање тестова, паралелно покретање и уграђене извештаје
  • XCUIApplication и XCUIElement — кључне класе за интеракцију са апликацијом
  • Accessibility атрибути се користе као поуздани локатори, стабилни при променама распореда
  • Чекања се реализују кроз XCTWaiter и NSPredicate — аутоматске синхронизације нема
  • CI/CD подржан кроз xcodebuild са паралелним покретањем на симулаторима
  • Напредни сценарији укључују мултитач, Siri Intents, пресретање мрежних захтева и Deep Links

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође