XCUITest este un framework Apple pentru testarea UI a aplicațiilor iOS, iPadOS și macOS, încorporat direct în XCTest și Xcode. Acesta permite simularea acțiunilor utilizatorului: clicuri, introducere text, glisări, derulare și gesturi — cu acces la starea internă a elementelor interfeței. Conform Apple Developer Documentation, 2025, XCUIApplication este punctul de intrare pentru toate testele UI și oferă acces la ierarhia elementelor ecranului.
Principalele puncte
XCUITest este un framework de testare UI lansat de Apple în Xcode 7 (2015). Acesta a înlocuit UI Automation (UIA) și a devenit instrumentul standard pentru testarea automată a interfeței pe platformele Apple. XCUITest este complet integrat în XCTest — frameworkul unificat de testare Apple.
Spre deosebire de testele unitare care verifică logica la nivel de clase și metode, XCUITest testează interfața utilizatorului prin simularea acțiunilor. Testele rulează într-un proces separat de aplicație și interacționează cu aceasta prin Accessibility API — asigurând izolare și fiabilitate.
XCUITest nu necesită instalarea de servere terțe (spre deosebire de Appium) sau biblioteci suplimentare pentru interacțiunea cu dispozitivul. Tot ce este necesar este deja inclus în Xcode. Aceasta asigură cea mai bună compatibilitate cu noile versiuni iOS și acces imediat la gesturi și elemente de control noi.
Arhitectura XCUITest se bazează pe două clase cheie: XCUIApplication — aplicația testată în execuție, și XCUIElement — elementul interfeței. Test-runnerul XCTest gestionează ciclul de viață al testelor: setUp, metode de test, tearDown. XCUITest rulează ca un proces separat care controlează aplicația prin puntea Accessibility.
Fiecare element UI este reprezentat de un obiect XCUIElement care conține metode pentru interogarea stării (exists, isHittable, label, value) și acțiuni (tap, pressForDuration, swipeUp, typeText). Elementele sunt organizate într-o ierarhie prin lanțuri de interogare: app.buttons[].staticTexts[].tables[]. Aceasta permite găsirea flexibilă a oricărui element pe ecran.
XCUITest folosește atributele Accessibility pentru identificarea elementelor: accessibilityIdentifier — identificator programatic, și accessibilityLabel — descriere pentru VoiceOver. Se recomandă setarea accessibilityIdentifier în codul aplicației — aceasta face testele stabile independent de localizare și aspect.
Testele XCUITest se scriu în Swift folosind sintaxa XCTest. Fiecare clasă de test moștenește din XCTestCase și conține metode care încep cu test. În metoda setUp se lansează aplicația cu configurația dorită, iar în tearDown se face curățarea și încheierea sesiunii.
Un test tipic: găsește elementul → execută acțiunea → verifică rezultatul. Căutarea elementului se face prin interogări copil XCUIElementQuery: app.buttons["loginButton"], app.textFields["email"]. Acțiuni: .tap(), .typeText("text"), .swipeUp(). Verificări: XCTAssertTrue(element.exists) sau 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 suportă așteptări explicite prin XCTWaiter și predicate NSPredicate. De exemplu, așteptarea apariției unui element în 5 secunde: XCTWaiter().wait(for: [expectation], timeout: 5). Spre deosebire de Detox, XCUITest nu are sincronizare automată cu cererile de rețea.
// Așteptarea apariției elementului cu 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)
XCUITest suportă testarea scenariilor complexe: gesturi multi-touch, notificări push, Deep Links, SFSafariViewController și interacțiuni între aplicații. Intențiile Siri pot fi de asemenea testate prin XCUITest folosind simularea Siri Remote.
XCUITest suportă toate gesturile populare: tap, doubleTap, pressForDuration, swipeUp/Down/Left/Right, pinch, rotate, twoFingerTap. Pentru scenarii complexe se folosește XCUIGesture cu coordonate și durată arbitrare. Aceasta permite testarea gesturilor personalizate precum desenarea sau drag-and-drop.
Începând cu Xcode 12, XCUITest suportă interceptarea cererilor de rețea prin XCTestExpectation și URLProtocol. Aceasta permite testarea aplicației în mod offline sau cu răspunsuri de server înlocuite fără modificarea codului aplicației.
XCUITest se lansează în medii CI prin xcodebuild cu flagul test. Pentru lansarea paralelă pe mai multe simulatoare se folosește xcodebuild -testPlan cu configurarea execuției paralele în schema Xcode. GitHub Actions, Bitrise și Jenkins au suport încorporat pentru XCUITest.
Pentru CI este necesară configurarea code signing, provisioning profiles și specificarea destinației (simulator sau dispozitiv). Testele iOS pe simulator nu necesită certificate. Pentru dispozitive reale este necesară semnarea automată prin Xcode Cloud sau Fastlane.
# Lansarea XCUITest pe simulator prin 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
XCUITest este strâns legat de Accessibility API Apple, deoarece căutarea elementelor se bazează pe atributele de accesibilitate. Testarea accesibilității — nu este doar o metodă de găsire a elementelor, ci și verificarea accesibilității aplicației pentru persoane cu dizabilități. XCUITest poate verifica accessibilityLabel, traits și hints.
VoiceOver — cititorul de ecran Apple pentru utilizatorii nevăzători. XCUITest permite verificarea: accessibilityLabel — dacă elementul este descris cu text inteligibil, accessibilityTraits — dacă tipul elementului corespunde (buton, titlu, imagine), și accessibilityHint — dacă oferă un indiciu despre rezultatul acțiunii. Aceste verificări sunt obligatorii pentru publicarea în App Store, iar XCUITest le automatizează în cadrul rulării de regresie.
Începând cu Xcode 15, XCUITest suportă verificarea încorporată Accessibility prin XCTAttachment cu tipul accessibilityAudit. Testul raportează automat elementele cu contrast insuficient, imagini nesemnate și traits incorecte. Aceasta înlocuiește Accessibility Inspector manual.
// Auditul de accesibilitate în XCUITest
func testAccessibilityAudit() {
let app = XCUIApplication()
app.launch()
let audit = XCTAttachment(accessibilityAudit: app)
add(audit)
// Verificarea unui element specific
let button = app.buttons["submitButton"]
XCTAssertTrue(button.label.count > 0)
XCTAssertTrue(button.isAccessibilityElement)
}
XCUITest suportă măsurarea performanței UI prin XCTOSSignpostMetric și XCUIApplication.metrics. Se poate măsura timpul de lansare a aplicației (launch time), viteza de navigare, timpul de răspuns la gesturi. Testele de performanță rulează cu măsurarea baseline și eșuează automat la depășirea pragului. Aceasta previne regresiile de performanță înainte ca acestea să ajungă la utilizatori în versiunea release.
Baseline — timpul de referință al executării testului. Xcode memorează baseline pentru fiecare test pe un model specific de dispozitiv și versiune iOS. Dacă o nouă executare depășește baseline cu un procent stabilit (implicit 10%), testul este considerat eșuat. Pentru actualizarea baseline se folosește comanda Edit Baseline în raportul de teste. Este important să se recalculeze baseline la actualizarea versiunii iOS sau schimbarea modelului de dispozitiv pentru ferma CI.
Pentru urmărirea stabilității testelor XCUITest se folosesc flaguri: continueAfterFailure (dacă testul continuă după prima eșuare) și planuri de test Xcode cu configurații de repetare. Se recomandă configurarea repornirii automate a testelor eșuate (retry) — până la 3 încercări pentru testele instabile legate de sincronizarea animațiilor sau întârzieri de rețea.
XCUITest suportă testarea notificărilor push și Deep Links prin springboard și launchArguments. Pentru notificări push se folosește XCUIApplication().launchArguments cu parametrul -UNUserNotificationCenter și trimiterea prin XCTest. Deep Links se testează prin open URL cu specificarea schemei personalizate — XCUITest interceptează dialogul de sistem și verifică dacă aplicația s-a deschis pe ecranul corect. Pentru testarea scenariului de răspuns la notificare se folosește XCUIApplication().springboard care simulează clicul pe bannerul de notificare din centrul de notificări iOS. Aceste scenarii sunt critice pentru aplicațiile cu deep link-uri și campanii push, unde este necesară verificarea corectitudinii procesării apelurilor externe.
Pentru profilarea detaliată a performanței, XCUITest se integrează cu Instruments. În timpul testului se poate lansa profilarea Time Profiler, Core Animation sau Leaks prin XCTMetric. Rezultatele profilării se salvează în raport și sunt disponibile pentru analiză în Xcode. Acest lucru este util în special la optimizarea timpului de lansare a aplicației, navigării între ecrane și performanței animațiilor — blocaje tipice în aplicațiile iOS.
Întrebări frecvente
XCTest — este un framework general pentru toate tipurile de teste Apple, inclusiv teste unitare și de performanță. XCUITest — este un strat peste XCTest pentru testarea UI, care adaugă clasele XCUIApplication, XCUIElement și XCUIElementQuery pentru interacțiunea cu interfața.
Da, XCUITest suportă atât Swift, cât și Objective-C. Cu toate acestea, majoritatea exemplelor și documentației Apple sunt scrise în Swift. Proiectele Objective-C pot folosi XCUITest fără configurare suplimentară — frameworkul este disponibil prin @import XCTest.
XCUITest folosește Accessibility API Apple. Elementele sunt găsite după accessibilityIdentifier, accessibilityLabel, tip (button, textField, staticText) sau poziție în ierarhie. Cu cât atributele Accessibility sunt mai precise în codul aplicației, cu atât testele sunt mai stabile.
Da, Xcode include un recorder încorporat pentru testele UI. La lansarea testului în modul de înregistrare, Xcode înregistrează toate interacțiunile cu interfața și generează cod Swift. Codul înregistrat poate fi îmbunătățit: adăugate verificări, extras în Page Objects și parametrizat.
Pentru lansarea pe un dispozitiv real este necesar: conectarea dispozitivului la Mac, adăugarea acestuia în Apple Developer Program, configurarea provisioning profile, semnarea aplicației cu certificat de dezvoltare și selectarea dispozitivului ca destinație în xcodebuild.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și