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 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.
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.
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.
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.
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.
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.
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.
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").
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)
}
}
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.
// 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)
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.
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.
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.
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.
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.
# 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
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.
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.
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.
// 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)
}
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.
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.
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.
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.
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
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.
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.
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.
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.
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
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.
Basahin din