XCUITest — Apple tərəfindən iOS, iPadOS və macOS tətbiqlərinin UI testi üçün yaradılmış, birbaşa XCTest və Xcode-a daxil edilmiş freymvorkdur. O, istifadəçi hərəkətlərini simulyasiya etməyə imkan verir: kliklər, mətn daxil etmə, sürüşdürmə, skroll və jestlər — interfeys elementlərinin daxili vəziyyətinə girişlə. Apple Developer Documentation, 2025-ə görə, XCUIApplication bütün UI testləri üçün giriş nöqtəsidir və ekran elementləri iyerarxiyasına giriş təmin edir.
Əsas məqamlar
XCUITest — Apple tərəfindən Xcode 7-də (2015-ci il) buraxılmış UI test freymvorkudur. O, UI Automation (UIA) freymvorkunu əvəz etdi və Apple platformalarında interfeysin avtomatlaşdırılmış testi üçün standart alətə çevrildi. XCUITest tamamilə XCTest — Apple-ın vahid test freymvorku ilə inteqrasiya olunub.
Sinif və metod səviyyəsində məntiqi yoxlayan vahid testlərdən fərqli olaraq, XCUITest hərəkətlərin simulyasiyası vasitəsilə istifadəçi interfeysini test edir. Testlər tətbiqdən ayrı prosesdə işə salınır və onunla Accessibility API vasitəsilə əlaqə qurur — bu, izolyasiya və etibarlılığı təmin edir.
XCUITest üçüncü tərəf serverlərinin (Appium-dan fərqli olaraq) və cihazla əlaqə üçün əlavə kitabxanaların qurulmasını tələb etmir. Lazım olan hər şey artıq Xcode-a daxildir. Bu, iOS-un yeni versiyaları ilə ən yaxşı uyğunluğu və yeni jestlərə və idarəetmə elementlərinə ani girişi təmin edir.
XCUITest arxitekturası iki əsas sinfə əsaslanır: XCUIApplication — işə salınmış test edilən tətbiq, və XCUIElement — interfeys elementi. XCTest test-runner-ı testlərin həyat dövrünü idarə edir: setUp, test metodları, tearDown. XCUITest ayrı proses kimi işə salınır və tətbiqi Accessibility körpüsü vasitəsilə idarə edir.
Hər bir UI elementi XCUIElement obyekti ilə təmsil olunur və vəziyyəti sorğulamaq (exists, isHittable, label, value) və hərəkətlər (tap, pressForDuration, swipeUp, typeText) üçün metodlar ehtiva edir. Elementlər sorgu zəncirləri vasitəsilə ierarxiyada təşkil olunur: app.buttons[].staticTexts[].tables[]. Bu, ekranda istənilən elementi çevik şəkildə tapmağa imkan verir.
XCUITest elementlərin identifikasiyası üçün Accessibility atributlarından istifadə edir: accessibilityIdentifier — proqram identifikatoru, və accessibilityLabel — VoiceOver üçün təsvir. Tətbiq kodunda accessibilityIdentifier təyin etmək tövsiyə olunur — bu, testləri lokallaşdırma və düzendən asılı olmayaraq sabit edir.
XCUITest testləri Swift dilində XCTest sintaksisindən istifadə etməklə yazılır. Hər bir test sinfi XCTestCase-dən miras alır və test ilə başlayan metodlar ehtiva edir. setUp metodunda tətbiq lazımi konfiqurasiya ilə işə salınır, tearDown-da isə təmizləmə və sessiyanın bitirilməsi həyata keçirilir.
Tipik test: elementi tap → hərəkəti yerinə yetir → nəticəni yoxla. Elementin axtarışı XCUIElementQuery alt sorğuları vasitəsilə aparılır: app.buttons["loginButton"], app.textFields["email"]. Hərəkətlər: .tap(), .typeText("text"), .swipeUp(). Yoxlamalar: XCTAssertTrue(element.exists) və ya 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 və NSPredicate predikatları vasitəsilə açıq gözləmələri dəstəkləyir. Məsələn, elementin 5 saniyə ərzində görünməsini gözləmək: XCTWaiter().wait(for: [expectation], timeout: 5). Detox-dan fərqli olaraq, XCUITest şəbəkə sorğuları ilə avtomatik sinxronizasiyaya malik deyil.
// Elementin görünməsini timeout ilə gözləmə
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 mürəkkəb ssenarilərin testini dəstəkləyir: multitouch jestləri, push bildirişləri, Deep Links, SFSafariViewController və tətbiqlərarası qarşılıqlı əlaqə. Siri intentləri də Siri Remote simulyasiyası vasitəsilə XCUITest-də test edilə bilər.
XCUITest bütün məşhur jestləri dəstəkləyir: tap, doubleTap, pressForDuration, swipeUp/Down/Left/Right, pinch, rotate, twoFingerTap. Mürəkkəb ssenarilər üçün ixtiyari koordinatlar və müddət ilə XCUIGesture istifadə olunur. Bu, rəsm çəkmə və ya drag-and-drop kimi fərdi jestləri test etməyə imkan verir.
Xcode 12-dən etibarən XCUITest şəbəkə sorğularının tutulmasını XCTestExpectation və URLProtocol vasitəsilə dəstəkləyir. Bu, tətbiqin oflayn rejimdə və ya tətbiq kodunu dəyişdirmədən dəyişdirilmiş server cavabları ilə test edilməsinə imkan verir.
XCUITest CI mühitlərində xcodebuild test flagı ilə işə salınır. Bir neçə simulyatorda paralel işə salma üçün xcodebuild -testPlan Xcode sxemində paralel icra konfiqurasiyası ilə istifadə olunur. GitHub Actions, Bitrise və Jenkins XCUITest üçün daxili dəstəyə malikdir.
CI üçün code signing, provisioning profiles və destineyşn (simulyator və ya cihaz) təyin edilməsi tələb olunur. Simulyatorda iOS testləri sertifikat tələb etmir. Real cihazlar üçün Xcode Cloud və ya Fastlane vasitəsilə avtomatik imzalama lazımdır.
# XCUITest-in simulyatorda xcodebuild vasitəsilə işə salınması
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-ın Accessibility API-si ilə sıx bağlıdır, çünki element axtarışı əlçatanlıq atributlarına əsaslanır. Accessibility testi — bu təkcə elementlərin tapılma üsulu deyil, həm də tətbiqin əlilliyi olan insanlar üçün əlçatanlığının yoxlanılmasıdır. XCUITest accessibilityLabel, traits və hints-i yoxlaya bilər.
VoiceOver — kor istifadəçilər üçün Apple-ın ekran oxuyucusudur. XCUITest yoxlamağa imkan verir: accessibilityLabel — elementin başa düşülən mətnlə təsvir edilib-edilmədiyi, accessibilityTraits — element tipinin uyğunluğu (düymə, başlıq, şəkil), və accessibilityHint — hərəkətin nəticəsi haqqında ipucu verib-vermədiyi. Bu yoxlamalar App Store-da dərc üçün məcburidir və XCUITest onları reqressiya qaçışı çərçivəsində avtomatlaşdırır.
Xcode 15-dən etibarən XCUITest XCTAttachment ilə accessibilityAudit tipi vasitəsilə daxili Accessibility yoxlamasını dəstəkləyir. Test avtomatik olaraq kifayət qədər kontrastı olmayan, imzasız şəkillər və yanlış traits-li elementlər barədə məlumat verir. Bu, əl ilə Accessibility Inspector-u əvəz edir.
// XCUITest-də Accessibility auditi
func testAccessibilityAudit() {
let app = XCUIApplication()
app.launch()
let audit = XCTAttachment(accessibilityAudit: app)
add(audit)
// Konkret elementin yoxlanılması
let button = app.buttons["submitButton"]
XCTAssertTrue(button.label.count > 0)
XCTAssertTrue(button.isAccessibilityElement)
}
XCUITest XCTOSSignpostMetric və XCUIApplication.metrics vasitəsilə UI performansının ölçülməsini dəstəkləyir. Tətbiqin işə salınma vaxtını (launch time), naviqasiya sürətini, jestlərə cavab müddətini ölçmək olar. Performans testləri baseline ölçülməsi ilə işə salınır və hədd aşıldıqda avtomatik uğursuz olur. Bu, performans reqressiyalarının release versiyasında istifadəçilərə çatmazdan qabaq qarşısını almağa imkan verir.
Baseline — testin icrasının istinad vaxtıdır. Xcode hər bir test üçün baseline-i konkret cihaz modeli və iOS versiyasında yadda saxlayır. Əgər yeni icra baseline-i müəyyən faizdən (defolt 10%) çox keçərsə, test uğursuz sayılır. Baseline yeniləmək üçün test hesabatında Edit Baseline əmrindən istifadə olunur. iOS versiyası yenilənərkən və ya CI ferması üçün cihaz modeli dəyişdirilərkən baseline-ı yenidən hesablamaq vacibdir.
XCUITest testlərinin sabitliyini izləmək üçün flaglardan istifadə olunur: continueAfterFailure (ilk uğursuzluqdan sonra testi davam etdirib-etdirməmək) və təkrarlama konfiqurasiyaları olan Xcode test planları. Uğursuz testlərin avtomatik yenidən işə salınmasını (retry) — animasiya vaxtlamaları və ya şəbəkə gecikmələri ilə bağlı flak edən testlər üçün 3 cəhdə qədər konfiqurasiya etmək tövsiyə olunur.
XCUITest push bildirişləri və Deep Links testini springboard və launchArguments vasitəsilə dəstəkləyir. Push bildirişləri üçün XCUIApplication().launchArguments -UNUserNotificationCenter parametri ilə və XCTest vasitəsilə göndərmə ilə istifadə olunur. Deep Links fərdi sxem göstərilməklə open URL vasitəsilə test edilir — XCUITest sistem dialoqunu tutur və tətbiqin düzgün ekranla açılıb-açılmadığını yoxlayır. Bildirişə cavab ssenarisini test etmək üçün XCUIApplication().springboard istifadə olunur, o, iOS bildiriş mərkəzində bildiriş bannerinə klikləməni simulyasiya edir. Bu ssenarilər dərin keçidlər və push kampaniyaları olan tətbiqlər üçün kritik əhəmiyyət daşıyır, burada xarici çağırışların düzgün işlənməsini yoxlamaq tələb olunur.
Ətraflı performans profilləşdirməsi üçün XCUITest Instruments ilə inteqrasiya olunur. Test zamanı XCTMetric vasitəsilə Time Profiler, Core Animation və ya Leaks profilləşdirməsini işə salmaq olar. Profilləşdirmə nəticələri hesabatda saxlanılır və Xcode-da təhlil üçün əlçatandır. Bu, iOS tətbiqlərində tipik darboğazlar olan tətbiqin işə salınma vaxtının, ekranlar arası naviqasiyanın və animasiya performansının optimallaşdırılmasında xüsusilə faydalıdır.
Tez-tez verilən suallar
XCTest — Apple-ın bütün test növləri, o cümlədən vahid testlər və performans testləri üçün ümumi freymvorkudur. XCUITest — XCTest üzərində UI testi üçün əlavədir, interfeyslə qarşılıqlı əlaqə üçün XCUIApplication, XCUIElement və XCUIElementQuery siniflərini əlavə edir.
Bəli, XCUITest həm Swift, həm də Objective-C-ni dəstəkləyir. Lakin Apple-ın nümunə və sənədlərinin çoxu Swift-də yazılıb. Objective-C layihələri əlavə konfiqurasiya olmadan XCUITest-dən istifadə edə bilər — freymvork @import XCTest vasitəsilə əlçatandır.
XCUITest Apple-ın Accessibility API-sindən istifadə edir. Elementlər accessibilityIdentifier, accessibilityLabel, tip (button, textField, staticText) və ya iyerarxiyada mövqe ilə tapılır. Tətbiq kodunda Accessibility atributları nə qədər dəqiq təyin edilərsə, testlər bir o qədər sabit olar.
Bəli, Xcode daxili UI test recorder-i ehtiva edir. Test yazı rejimində işə salındıqda Xcode interfeyslə bütün qarşılıqlı əlaqələri qeyd edir və Swift kodu yaradır. Yazılmış kodu təkmilləşdirmək olar: yoxlamalar əlavə etmək, Page Objects-ə çıxarmaq və parametrləşdirmək.
Real cihazda işə salmaq üçün: cihazı Mac-a qoşmaq, onu Apple Developer Program-a əlavə etmək, provisioning profile konfiqurasiya etmək, tətbiqi development sertifikatı ilə imzalamaq və xcodebuild-də cihazı destineyşn kimi seçmək lazımdır.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun