XCUITest: ano ito, mga prinsipyo ng paggana at UI testing ng iOS

May-akda: IT Sectr Nai-publish: 2026-04-09 Oras ng pagbabasa: 8 min

Ang XCUITest ay isang framework ng Apple para sa UI testing ng iOS, iPadOS at macOS apps, na direktang naka-embed sa XCTest at Xcode. Pinapayagan nito ang simulation ng mga aksyon ng user: pag-click, pag-input ng text, pag-swipe, pag-scroll at mga galaw — na may access sa panloob na estado ng mga elemento ng interface. Ayon sa Apple Developer Documentation, 2025, ang XCUIApplication ay entry point para sa lahat ng UI tests at nagbibigay ng access sa hierarchy ng mga elemento sa screen.

Mga pangunahing punto

  • XCUITest — native na framework ng Apple para sa UI testing, naka-embed sa Xcode
  • White-box approach ay nagbibigay ng access sa Accessibility attributes at hierarchy ng elemento
  • Mga test ay isinusulat sa Swift o Objective-C na may integrasyon sa XCTest
  • Pag-record ng test available sa pamamagitan ng built-in recorder sa Xcode
  • Pagpapatakbo ay ginagawa sa iOS simulator o totoong device nang walang karagdagang server

Ano ang XCUITest

XCUITest ay isang UI testing framework na inilabas ng Apple sa Xcode 7 (2015). Pinalitan nito ang UI Automation (UIA) at naging karaniwang tool para sa automated na pagsubok ng interface sa mga platform ng Apple. Ang XCUITest ay ganap na isinama sa XCTest — ang pinag-isang testing framework ng Apple.

Pagkakaiba sa XCTest unit tests

Hindi tulad ng unit tests na sumusuri ng logic sa antas ng klase at metodo, sinusuri ng XCUITest ang user interface sa pamamagitan ng simulation ng mga aksyon. Ang mga test ay tumatakbo sa hiwalay na proseso mula sa app at nakikipag-ugnayan dito sa pamamagitan ng Accessibility API — tinitiyak nito ang isolation at reliability.

Mga bentahe ng native approach

Ang XCUITest ay hindi nangangailangan ng pag-install ng third-party servers (hindi tulad ng Appium) o karagdagang library para sa pakikipag-ugnayan sa device. Lahat ng kailangan ay kasama na sa Xcode. Tinitiyak nito ang pinakamahusay na compatibility sa mga bagong bersyon ng iOS at agarang access sa mga bagong galaw at control element.

Arkitektura ng XCUITest at XCTest

Ang arkitektura ng XCUITest ay nakabatay sa dalawang pangunahing klase: XCUIApplication — ang pinapatakbong app na sinusuri, at XCUIElement — elemento ng interface. Ang XCTest test runner ay namamahala sa lifecycle ng mga test: setUp, test methods, tearDown. Ang XCUITest ay tumatakbo bilang hiwalay na proseso na kumokontrol sa app sa pamamagitan ng Accessibility bridge.

Hierarchy ng elemento

Bawat UI element ay kinakatawan ng XCUIElement object na naglalaman ng mga metodo para sa pag-query ng estado (exists, isHittable, label, value) at mga aksyon (tap, pressForDuration, swipeUp, typeText). Ang mga elemento ay nakaayos sa hierarchy sa pamamagitan ng query chains: app.buttons[].staticTexts[].tables[]. Nagbibigay-daan ito sa flexible na paghahanap ng anumang elemento sa screen.

Accessibility at mga lokator

Ginagamit ng XCUITest ang Accessibility attributes para sa pagkilala ng elemento: accessibilityIdentifier — programmatic identifier, at accessibilityLabel — deskripsyon para sa VoiceOver. Inirerekomenda na itakda ang accessibilityIdentifier sa code ng app — ginagawa nitong stable ang mga test anuman ang lokalisasyon at layout.

Pagsusulat ng UI tests sa XCUITest

Ang XCUITest tests ay isinusulat sa Swift gamit ang XCTest syntax. Bawat test class ay nagmana mula sa XCTestCase at naglalaman ng mga metodo na nagsisimula sa test. Sa setUp method, pinapatakbo ang app na may nais na configuration, at sa tearDown ginagawa ang paglilinis at pagtatapos ng session.

Pangunahing test scenario

Karaniwang test: hanapin ang elemento → gawin ang aksyon → suriin ang resulta. Ang paghahanap ng elemento ay ginagawa sa pamamagitan ng child queries ng XCUIElementQuery: app.buttons["loginButton"], app.textFields["email"]. Mga aksyon: .tap(), .typeText("text"), .swipeUp(). Mga pagsusuri: XCTAssertTrue(element.exists) o 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)
    }
}

Pag-antay at synchronization

Sinusuportahan ng XCUITest ang explicit waits sa pamamagitan ng XCTWaiter at NSPredicate predicates. Halimbawa, paghihintay sa paglitaw ng elemento sa loob ng 5 segundo: XCTWaiter().wait(for: [expectation], timeout: 5). Hindi tulad ng Detox, ang XCUITest ay walang automatic synchronization sa network requests.

swift
// Paghihintay sa paglitaw ng elemento na may 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)

Mga advanced na kakayahan ng XCUITest

Sinusuportahan ng XCUITest ang pag-test ng mga komplikadong scenario: multi-touch gestures, push notification, Deep Links, SFSafariViewController at inter-app interaction. Ang Siri intents ay maaari ring masuri sa pamamagitan ng XCUITest gamit ang Siri Remote simulation.

Pag-test ng mga galaw

Sinusuportahan ng XCUITest ang lahat ng sikat na galaw: tap, doubleTap, pressForDuration, swipeUp/Down/Left/Right, pinch, rotate, twoFingerTap. Para sa mga komplikadong scenario, ginagamit ang XCUIGesture na may arbitrary coordinates at tagal. Pinapayagan nito ang pag-test ng custom gestures tulad ng pag-drawing o drag-and-drop.

Pag-intercept ng network requests

Mula Xcode 12, sinusuportahan ng XCUITest ang pag-intercept ng network requests sa pamamagitan ng XCTestExpectation at URLProtocol. Pinapayagan nito ang pag-test ng app sa offline mode o may pinalitang server responses nang hindi binabago ang code ng app.

XCUITest sa CI/CD

Ang XCUITest ay pinapatakbo sa CI environments sa pamamagitan ng xcodebuild na may test flag. Para sa parallel execution sa maraming simulator, gamitin ang xcodebuild -testPlan na may configuration ng parallel execution sa Xcode scheme. Ang GitHub Actions, Bitrise at Jenkins ay may built-in na suporta para sa XCUITest.

Configuration para sa CI

Para sa CI kailangan ang configuration ng code signing, provisioning profiles at pagtukoy ng destinasyon (simulator o device). Ang iOS tests sa simulator ay hindi nangangailangan ng certificates. Para sa totoong device, kailangan ang automatic signing sa pamamagitan ng Xcode Cloud o Fastlane.

bash
# Pagpapatakbo ng XCUITest sa simulator sa pamamagitan ng 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

Pag-test ng Accessibility sa pamamagitan ng XCUITest

Ang XCUITest ay malapit na nauugnay sa Accessibility API ng Apple, dahil ang paghahanap ng elemento ay nakabatay sa accessibility attributes. Accessibility testing — hindi lamang paraan ng paghahanap ng elemento, kundi pati na rin pagsusuri ng accessibility ng app para sa mga taong may kapansanan. Maaaring suriin ng XCUITest ang accessibilityLabel, traits at hints.

Pagsusuri ng VoiceOver

VoiceOver — screen reader ng Apple para sa mga bulag na user. Pinapayagan ng XCUITest na suriin: accessibilityLabel — kung ang elemento ay inilarawan ng naiintindihang text, accessibilityTraits — kung ang uri ng elemento ay tumutugma (button, heading, image), at accessibilityHint — kung nagbibigay ito ng pahiwatig tungkol sa resulta ng aksyon. Ang mga pagsusuring ito ay kinakailangan para sa pag-publish sa App Store, at awtomatiko ito ng XCUITest sa loob ng regression run.

Automatic na pagsusuri ng Accessibility

Mula Xcode 15, sinusuportahan ng XCUITest ang built-in na pagsusuri ng Accessibility sa pamamagitan ng XCTAttachment na may uri na accessibilityAudit. Awtomatikong nag-uulat ang test tungkol sa mga elementong may hindi sapat na contrast, mga larawang walang label at maling traits. Pinapalitan nito ang manual na Accessibility Inspector.

swift
// Audit ng Accessibility sa XCUITest
func testAccessibilityAudit() {
    let app = XCUIApplication()
    app.launch()

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

    // Pagsusuri ng partikular na elemento
    let button = app.buttons["submitButton"]
    XCTAssertTrue(button.label.count > 0)
    XCTAssertTrue(button.isAccessibilityElement)
}

Performance tests sa XCUITest

Sinusuportahan ng XCUITest ang pagsukat ng UI performance sa pamamagitan ng XCTOSSignpostMetric at XCUIApplication.metrics. Maaaring sukatin ang launch time ng app, bilis ng navigation, oras ng response sa mga galaw. Ang performance tests ay pinapatakbo na may baseline measurement at awtomatikong nag-fa-fail kapag lumampas sa threshold. Pinipigilan nito ang performance regressions bago maabot ang mga user sa release version.

Configuration ng baseline

Baseline — reference time ng test execution. Xcode ay naaalala ang baseline para sa bawat test sa partikular na modelo ng device at bersyon ng iOS. Kung ang bagong execution ay lumampas sa baseline ng isang porsyento (default 10%), ang test ay itinuturing na failed. Para i-update ang baseline, gamitin ang Edit Baseline command sa test report. Mahalagang kalkulahin muli ang baseline kapag nag-update ng iOS version o nagpalit ng modelo ng device para sa CI farm.

Pag-monitor ng stability ng test

Para sa pagsubaybay ng stability ng XCUITest tests, ginagamit ang mga flag: continueAfterFailure (kung ipagpapatuloy ang test pagkatapos ng unang failure) at Xcode test plans na may repeat configurations. Inirerekomenda na i-configure ang automatic restart ng failed tests (retry) — hanggang 3 attempts para sa flaky tests na may kaugnayan sa animation timings o network delays.

Pag-test ng push notification at Deep Links

Sinusuportahan ng XCUITest ang pag-test ng push notification at Deep Links sa pamamagitan ng springboard at launchArguments. Para sa push notification, ginagamit ang XCUIApplication().launchArguments na may parameter na -UNUserNotificationCenter at pagpapadala sa pamamagitan ng XCTest. Ang Deep Links ay sine-test sa pamamagitan ng open URL na may custom scheme — ini-intercept ng XCUITest ang system dialog at sinusuri kung ang app ay nagbukas sa tamang screen. Para sa pag-test ng scenario ng pagtugon sa notification, ginagamit ang XCUIApplication().springboard na nag-simulate ng click sa notification banner sa iOS notification center. Ang mga scenario na ito ay kritikal para sa apps na may deep link at push campaign, kung saan kinakailangan ang pag-verify ng tamang pag-process ng external calls.

Integrasyon sa Instruments

Para sa detalyadong profiling ng performance, ang XCUITest ay integrated sa Instruments. Sa panahon ng test, maaaring i-start ang profiling ng Time Profiler, Core Animation o Leaks sa pamamagitan ng XCTMetric. Ang mga resulta ng profiling ay nai-save sa report at available para sa analysis sa Xcode. Ito ay lalong kapaki-pakinabang sa pag-optimize ng launch time ng app, navigation sa pagitan ng screens at performance ng animations — karaniwang bottlenecks sa iOS apps.

Mga madalas itanong

Ano ang pagkakaiba ng XCUITest at XCTest?

Ang XCTest ay pangkalahatang framework para sa lahat ng uri ng Apple tests, kabilang ang unit tests at performance tests. Ang XCUITest ay layer sa ibabaw ng XCTest para sa UI testing na nagdaragdag ng mga klase na XCUIApplication, XCUIElement at XCUIElementQuery para sa interaksyon sa interface.

Maaari bang gamitin ang XCUITest sa Objective-C?

Oo, sinusuportahan ng XCUITest ang parehong Swift at Objective-C. Gayunpaman, karamihan ng mga halimbawa at dokumentasyon ng Apple ay nakasulat sa Swift. Ang Objective-C na proyekto ay maaaring gumamit ng XCUITest nang walang karagdagang configuration — ang framework ay available sa pamamagitan ng @import XCTest.

Paano nahanap ng XCUITest ang mga elemento sa screen?

Ginagamit ng XCUITest ang Accessibility API ng Apple. Ang mga elemento ay matatagpuan sa pamamagitan ng accessibilityIdentifier, accessibilityLabel, uri (button, textField, staticText) o posisyon sa hierarchy. Kung mas tumpak ang Accessibility attributes na itinakda sa code ng app, mas stable ang mga test.

Sinusuportahan ba ng XCUITest ang pag-record ng test?

Oo, ang Xcode ay may kasamang built-in recorder para sa UI tests. Kapag pinatakbo ang test sa recording mode, itinatala ng Xcode ang lahat ng interaksyon sa interface at bumubuo ng Swift code. Ang na-record na code ay maaaring pagandahin: magdagdag ng mga pagsusuri, i-extract sa Page Objects at i-parametrize.

Paano patakbuhin ang XCUITest sa totoong device?

Para sa pagpapatakbo sa totoong device: ikonekta ang device sa Mac, idagdag ito sa Apple Developer Program, i-configure ang provisioning profile, pirmahan ang app gamit ang development certificate at piliin ang device bilang destinasyon sa xcodebuild.

Buod

  • XCUITest — native framework ng Apple para sa UI testing ng iOS, iPadOS at macOS apps
  • Integrasyon sa Xcode ay nagbibigay ng test recording, parallel execution at built-in reports
  • XCUIApplication at XCUIElement — pangunahing klase para sa interaksyon sa app
  • Accessibility attributes ay ginagamit bilang maaasahang lokator, stable sa pagbabago ng layout
  • Mga pag-antay ay naipapatupad sa pamamagitan ng XCTWaiter at NSPredicate — walang automatic synchronization
  • CI/CD sinusuportahan sa pamamagitan ng xcodebuild na may parallel execution sa simulator
  • Mga advanced scenario ay kinabibilangan ng multitouch, Siri Intents, pag-intercept ng network requests at Deep Links

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din