XCUITest — bu Apple-ning iOS, iPadOS va macOS ilovalari uchun UI testlash freymvorki bo'lib, to'g'ridan-to'g'ri XCTest va Xcode-ga o'rnatilgan. U foydalanuvchi harakatlarini simulyatsiya qilish imkonini beradi: bosishlar, matn kiritish, surish, skroll va imo-ishoralar — interfeys elementlarining ichki holatiga kirish bilan. Apple Developer Documentation, 2025 ma'lumotlariga ko'ra, XCUIApplication barcha UI testlari uchun kirish nuqtasi bo'lib, ekran elementlari iyerarxiyasiga kirishni ta'minlaydi.
Asosiy ma'lumotlar
XCUITest — Apple tomonidan Xcode 7 da (2015 yil) chiqarilgan UI test freymvorki. U UI Automation (UIA) o'rnini egalladi va Apple platformalarida interfeysni avtomatlashtirilgan testlash uchun standart vositaga aylandi. XCUITest to'liq XCTest — Apple-ning yagona test freymvorki bilan integratsiyalangan.
Sinf va metodlar darajasida mantiqni tekshiradigan birlik testlaridan farqli o'laroq, XCUITest harakatlarni simulyatsiya qilish orqali foydalanuvchi interfeysini test qiladi. Testlar ilovadan alohida jarayonda ishga tushiriladi va u bilan Accessibility API orqali bog'lanadi — bu izolyatsiya va ishonchlilikni ta'minlaydi.
XCUITest uchinchi tomon serverlarini (Appium dan farqli o'laroq) va qurilma bilan bog'lanish uchun qo'shimcha kutubxonalarni o'rnatishni talab qilmaydi. Kerakli hamma narsa allaqachon Xcode ga kiritilgan. Bu iOS-ning yangi versiyalari bilan eng yaxshi moslikni va yangi imo-ishoralar va boshqaruv elementlariga zudlik bilan kirishni ta'minlaydi.
XCUITest arxitekturasi ikkita asosiy sinfga asoslangan: XCUIApplication — ishga tushirilgan test qilinayotgan ilova, va XCUIElement — interfeys elementi. XCTest test ishga tushiruvchisi testlarning hayotiy siklini boshqaradi: setUp, test metodlari, tearDown. XCUITest alohida jarayon sifatida ishga tushiriladi va ilovani Accessibility ko'prigi orqali boshqaradi.
Har bir UI elementi XCUIElement ob'ekti bilan ifodalanadi va holatni so'rash (exists, isHittable, label, value) va harakatlar (tap, pressForDuration, swipeUp, typeText) uchun metodlarni o'z ichiga oladi. Elementlar so'rov zanjirlari orqali iyerarxiyada tashkil etiladi: app.buttons[].staticTexts[].tables[]. Bu ekranda istalgan elementni moslashuvchan tarzda topish imkonini beradi.
XCUITest elementlarni identifikatsiya qilish uchun Accessibility atributlaridan foydalanadi: accessibilityIdentifier — dasturiy identifikator, va accessibilityLabel — VoiceOver uchun tavsif. Ilova kodida accessibilityIdentifier o'rnatish tavsiya etiladi — bu testlarni lokalizatsiya va tartibdan qat'iy nazar barqaror qiladi.
XCUITest testlari Swift tilida XCTest sintaksisidan foydalanib yoziladi. Har bir test sinfi XCTestCase dan meros oladi va test bilan boshlanadigan metodlarni o'z ichiga oladi. setUp metodida ilova kerakli konfiguratsiya bilan ishga tushiriladi, tearDown da esa tozalash va sessiyani yakunlash amalga oshiriladi.
Oddiy test: elementni top → harakatni bajar → natijani tekshir. Elementni qidirish XCUIElementQuery bolalangan so'rovlari orqali amalga oshiriladi: app.buttons["loginButton"], app.textFields["email"]. Harakatlar: .tap(), .typeText("text"), .swipeUp(). Tekshirishlar: XCTAssertTrue(element.exists) yoki 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 va NSPredicate predikatlari orqali aniq kutishlarni qo'llab-quvvatlaydi. Masalan, elementning 5 soniya ichida paydo bo'lishini kutish: XCTWaiter().wait(for: [expectation], timeout: 5). Detox dan farqli o'laroq, XCUITest tarmoq so'rovlari bilan avtomatik sinxronizatsiyaga ega emas.
// Elementning paydo bo'lishini timeout bilan kutish
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 murakkab stsenariylarni testlashni qo'llab-quvvatlaydi: multitouch imo-ishoralari, push bildirishnomalari, Deep Links, SFSafariViewController va ilovalararo o'zaro ta'sir. Siri intentlari ham Siri Remote simulyatsiyasidan foydalanib XCUITest orqali test qilinishi mumkin.
XCUITest barcha mashhur imo-ishoralarni qo'llab-quvvatlaydi: tap, doubleTap, pressForDuration, swipeUp/Down/Left/Right, pinch, rotate, twoFingerTap. Murakkab stsenariylar uchun ixtiyoriy koordinatalar va davomiylik bilan XCUIGesture ishlatiladi. Bu chizish yoki drag-and-drop kabi maxsus imo-ishoralarni test qilish imkonini beradi.
Xcode 12 dan boshlab, XCUITest tarmoq so'rovlarini tutib qolishni XCTestExpectation va URLProtocol orqali qo'llab-quvvatlaydi. Bu ilovani oflayn rejimda yoki ilova kodini o'zgartirmasdan almashtirilgan server javoblari bilan test qilish imkonini beradi.
XCUITest CI muhitlarida xcodebuild test bayrog'i bilan ishga tushiriladi. Bir nechta simulyatorlarda parallel ishga tushirish uchun xcodebuild -testPlan Xcode sxemasida parallel bajarish konfiguratsiyasi bilan ishlatiladi. GitHub Actions, Bitrise va Jenkins XCUITest uchun o'rnatilgan qo'llab-quvvatlashga ega.
CI uchun code signing, provisioning profiles va destinatsiya (simulyator yoki qurilma) o'rnatilishi talab qilinadi. Simulyatorda iOS testlari sertifikatlarni talab qilmaydi. Haqiqiy qurilmalar uchun Xcode Cloud yoki Fastlane orqali avtomatik imzolash kerak.
# XCUITest ni simulyatorda xcodebuild orqali ishga tushirish
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-ning Accessibility API si bilan chambarchas bog'langan, chunki elementlarni qidirish imkoniyat atributlariga asoslanadi. Accessibility testi — bu nafaqat elementlarni topish usuli, balki ilovaning nogironligi bo'lgan odamlar uchun imkoniyatli bo'lishini tekshirishdir. XCUITest accessibilityLabel, traits va hints ni tekshirishi mumkin.
VoiceOver — ko'zi ojiz foydalanuvchilar uchun Apple-ning ekran o'quvchisi. XCUITest tekshirish imkonini beradi: accessibilityLabel — element tushunarli matn bilan tasvirlanganmi, accessibilityTraits — element turi mos keladimi (tugma, sarlavha, rasm), va accessibilityHint — harakat natijasi haqida maslahat beradimi. Bu tekshiruvlar App Store da nashr qilish uchun majburiydir va XCUITest ularni regressiya yugurishi doirasida avtomatlashtiradi.
Xcode 15 dan boshlab, XCUITest XCTAttachment bilan accessibilityAudit turi orqali o'rnatilgan Accessibility tekshiruvini qo'llab-quvvatlaydi. Test avtomatik ravishda yetarli kontrastga ega bo'lmagan, imzosiz rasmlar va noto'g'ri traits li elementlar haqida xabar beradi. Bu qo'lda Accessibility Inspector o'rnini bosadi.
// XCUITest da Accessibility auditi
func testAccessibilityAudit() {
let app = XCUIApplication()
app.launch()
let audit = XCTAttachment(accessibilityAudit: app)
add(audit)
// Muayyan elementni tekshirish
let button = app.buttons["submitButton"]
XCTAssertTrue(button.label.count > 0)
XCTAssertTrue(button.isAccessibilityElement)
}
XCUITest XCTOSSignpostMetric va XCUIApplication.metrics orqali UI ishlashini o'lchashni qo'llab-quvvatlaydi. Ilovani ishga tushirish vaqtini (launch time), navigatsiya tezligini, imo-ishoralarga javob vaqtini o'lchash mumkin. Ishlash testlari baseline o'lchovi bilan ishga tushiriladi va chegara oshib ketganda avtomatik ravishda muvaffaqiyatsiz bo'ladi. Bu ishlash regressiyalarining reliz versiyasida foydalanuvchilarga yetib borishining oldini oladi.
Baseline — test bajarilishining etalon vaqti. Xcode har bir test uchun baseline-ni ma'lum qurilma modeli va iOS versiyasida eslab qoladi. Agar yangi ishga tushirish baseline-ni ma'lum foizga (odatda 10%) oshib ketsa, test muvaffaqiyatsiz hisoblanadi. Baseline-ni yangilash uchun test hisobotida Edit Baseline buyrug'idan foydalaniladi. iOS versiyasi yangilanganda yoki CI fermasi uchun qurilma modeli o'zgartirilganda baseline-ni qayta hisoblash muhimdir.
XCUITest testlarining barqarorligini kuzatish uchun bayroqlardan foydalaniladi: continueAfterFailure (birinchi muvaffaqiyatsizlikdan keyin testni davom ettirish kerakmi) va takrorlash konfiguratsiyalari bilan Xcode test rejalari. Muvaffaqiyatsiz testlarni avtomatik qayta ishga tushirishni (retry) — animatsiya vaqtlari yoki tarmoq kechikishlari bilan bog'liq o'zgaruvchan testlar uchun 3 tagacha urinish — konfiguratsiya qilish tavsiya etiladi.
XCUITest push bildirishnomalari va Deep Links testini springboard va launchArguments orqali qo'llab-quvvatlaydi. Push bildirishnomalari uchun XCUIApplication().launchArguments -UNUserNotificationCenter parametri bilan va XCTest orqali yuborish ishlatiladi. Deep Links maxsus sxema ko'rsatilgan holda open URL orqali test qilinadi — XCUITest tizim dialogini tutib oladi va ilova to'g'ri ekran bilan ochilganligini tekshiradi. Bildirishnomaga javob stsenariysini test qilish uchun XCUIApplication().springboard ishlatiladi, u iOS bildirishnomalar markazida bildirishnoma banneriga bosishni simulyatsiya qiladi. Bu stsenariylar chuqur havolalar va push kampaniyalari bo'lgan ilovalar uchun juda muhimdir, bu erda tashqi chaqiruvlarni to'g'ri qayta ishlashni tekshirish talab etiladi.
Batafsil ishlash profillash uchun XCUITest Instruments bilan integratsiyalashadi. Test davomida XCTMetric orqali Time Profiler, Core Animation yoki Leaks profillashni ishga tushirish mumkin. Profillash natijalari hisobotda saqlanadi va Xcode da tahlil qilish uchun mavjud. Bu, ayniqsa, ilovani ishga tushirish vaqtini, ekranlar o'rtasidagi navigatsiyani va animatsiyalar ishlashini optimallashtirishda — iOS ilovalaridagi odatdagi tor joylar — foydalidir.
Tez-tez beriladigan savollar
XCTest — Apple-ning barcha test turlari, jumladan birlik testlari va ishlash testlari uchun umumiy freymvork. XCUITest — XCTest ustidagi UI testlash uchun qo'shimcha bo'lib, interfeys bilan o'zaro ta'sir qilish uchun XCUIApplication, XCUIElement va XCUIElementQuery sinflarini qo'shadi.
Ha, XCUITest ikkala Swift va Objective-C ni qo'llab-quvvatlaydi. Biroq, Apple misollari va hujjatlarining aksariyati Swift da yozilgan. Objective-C loyihalari qo'shimcha konfiguratsiyasiz XCUITest dan foydalanishi mumkin — freymvork @import XCTest orqali mavjud.
XCUITest Apple-ning Accessibility API sidan foydalanadi. Elementlar accessibilityIdentifier, accessibilityLabel, turi (button, textField, staticText) yoki iyerarxiyadagi o'rni bo'yicha topiladi. Ilova kodida Accessibility atributlari qanchalik aniq o'rnatilgan bo'lsa, testlar shunchalik barqaror bo'ladi.
Ha, Xcode o'rnatilgan rekorder UI testlarini o'z ichiga oladi. Test yozib olish rejimida ishga tushirilganda, Xcode interfeys bilan barcha o'zaro ta'sirlarni yozib oladi va Swift kodini yaratadi. Yozib olingan kodni takomillashtirish mumkin: tekshirishlar qo'shish, Page Objects ga chiqarish va parametrlashtirish.
Haqiqiy qurilmada ishga tushirish uchun: qurilmani Mac ga ulash, uni Apple Developer Program ga qo'shish, provisioning profile sozlash, ilovani development sertifikati bilan imzolash va xcodebuild da qurilmani destinatsiya sifatida tanlash kerak.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.