XCUITest: ce este, principii de funcționare și testarea UI iOS

Autor: IT Sectr Publicat: 2026-04-09 Timp de citire: 8 min

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 — framework nativ Apple pentru testarea UI, încorporat în Xcode
  • Abordarea white-box asigură acces la atributele Accessibility și ierarhia elementelor
  • Testele se scriu în Swift sau Objective-C în integrare cu XCTest
  • Înregistrarea testelor disponibilă prin recorderul încorporat în Xcode
  • Lansarea se face pe simulatorul iOS sau pe dispozitiv real fără servere suplimentare

Ce este XCUITest

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.

Diferența față de testele unitare XCTest

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.

Avantajele abordării native

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 și XCTest

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.

Ierarhia elementelor

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.

Accessibility și localizatori

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.

Scrierea testelor UI în XCUITest

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.

Scenariu de test de bază

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").

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)
    }
}

Așteptări și sincronizare

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.

swift
// 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)

Caracteristici avansate XCUITest

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.

Testarea gesturilor

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.

Interceptarea cererilor de rețea

Î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 în CI/CD

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.

Configurare pentru CI

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.

bash
# 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

Testarea Accessibility prin XCUITest

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.

Verificarea VoiceOver

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.

Verificarea automată Accessibility

Î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.

swift
// 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)
}

Teste de performanță în XCUITest

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.

Configurarea baseline

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.

Monitorizarea stabilității testelor

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.

Testarea notificărilor push și Deep Links

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.

Integrarea cu Instruments

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

Care este diferența dintre XCUITest și XCTest?

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.

Se poate folosi XCUITest cu Objective-C?

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.

Cum găsește XCUITest elementele pe ecran?

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.

Suportă XCUITest înregistrarea testelor?

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.

Cum se lansează XCUITest pe un dispozitiv real?

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

  • XCUITest — framework nativ Apple pentru testarea UI a aplicațiilor iOS, iPadOS și macOS
  • Integrarea cu Xcode asigură înregistrarea testelor, lansarea paralelă și rapoarte încorporate
  • XCUIApplication și XCUIElement — clase cheie pentru interacțiunea cu aplicația
  • Atributele Accessibility sunt folosite ca localizatori fiabili, stabili la modificări de aspect
  • Așteptările se implementează prin XCTWaiter și NSPredicate — sincronizare automată nu există
  • CI/CD suportat prin xcodebuild cu lansare paralelă pe simulatoare
  • Scenariile avansate includ multitouch, Siri Intents, interceptarea cererilor de rețea și Deep Links

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.

Discutați proiectul

Citiți și