XCUITest: mi ez, működési elvek és iOS UI tesztelés

Szerző: IT Sectr Megjelenés: 2026-04-09 Olvasási idő: 8 perc

Az XCUITest egy Apple-keretrendszer iOS, iPadOS és macOS alkalmazások UI teszteléséhez, amely közvetlenül az XCTestbe és az Xcode-ba van beépítve. Lehetővé teszi a felhasználói műveletek szimulációját: kattintások, szövegbevitel, csúsztatások, görgetés és gesztusok — hozzáféréssel a felületi elemek belső állapotához. A Apple Developer Documentation, 2025 szerint az XCUIApplication az belépési pont az összes UI teszthez, és hozzáférést biztosít a képernyőelemek hierarchiájához.

Főbb pontok

  • XCUITest — natív Apple keretrendszer UI teszteléshez, beépítve az Xcode-ba
  • White-box megközelítés hozzáférést biztosít az Accessibility attribútumokhoz és az elemhierarchiához
  • Tesztek Swift vagy Objective-C nyelven íródnak az XCTest integrációjával
  • Tesztfelvétel elérhető az Xcode beépített rögzítőjén keresztül
  • Futtatás iOS szimulátoron vagy valós eszközön történik további szerverek nélkül

Mi az XCUITest

XCUITest egy UI tesztelési keretrendszer, amelyet az Apple adott ki az Xcode 7-ben (2015). Felváltotta az UI Automation (UIA) eszközt, és szabványos eszközzé vált a felület automatikus tesztelésére Apple platformokon. Az XCUITest teljes mértékben integrált az XCTest-be — az Apple egységes tesztkeretrendszerébe.

Különbség az XCTest egységtesztektől

Az egységtesztekkel ellentétben, amelyek a logikát osztály- és metódusszinten ellenőrzik, az XCUITest a felhasználói felületet teszteli műveletek szimulációján keresztül. A tesztek külön folyamatban futnak az alkalmazástól, és az Accessibility API-n keresztül kommunikálnak vele — ez biztosítja az elkülönítést és megbízhatóságot.

A natív megközelítés előnyei

Az XCUITest nem igényel harmadik féltől származó szerverek telepítését (ellentétben az Appiummal) vagy további könyvtárakat az eszközzel való interakcióhoz. Minden szükséges már benne van az Xcode-ban. Ez biztosítja a legjobb kompatibilitást az új iOS-verziókkal és azonnali hozzáférést az új gesztusokhoz és vezérlőelemekhez.

Az XCUITest és XCTest architektúrája

Az XCUITest architektúrája két kulcsfontosságú osztályon alapul: XCUIApplication — a futó tesztelt alkalmazás, és XCUIElement — a felületi elem. Az XCTest tesztfuttató kezeli a tesztek életciklusát: setUp, tesztmetódusok, tearDown. Az XCUITest külön folyamatként fut, amely az Accessibility hídon keresztül vezérli az alkalmazást.

Elemhierarchia

Minden UI elemet egy XCUIElement objektum képvisel, amely metódusokat tartalmaz az állapot lekérdezésére (exists, isHittable, label, value) és műveletekre (tap, pressForDuration, swipeUp, typeText). Az elemek hierarchiába szerveződnek lekérdezési láncokon keresztül: app.buttons[].staticTexts[].tables[]. Ez lehetővé teszi bármely elem rugalmas megtalálását a képernyőn.

Accessibility és lokátorok

Az XCUITest az Accessibility attribútumokat használja az elemek azonosítására: accessibilityIdentifier — programozói azonosító, és accessibilityLabel — leírás a VoiceOver számára. Javasolt az accessibilityIdentifier beállítása az alkalmazás kódjában — ez a teszteket a lokalizációtól és elrendezéstől függetlenül stabillá teszi.

UI tesztek írása XCUITest-ben

Az XCUITest tesztek Swift nyelven íródnak az XCTest szintaxis használatával. Minden tesztosztály a XCTestCase-ből származik, és test-tel kezdődő metódusokat tartalmaz. A setUp metódusban az alkalmazás a kívánt konfigurációval indul, a tearDown-ban pedig tisztítás és a munkamenet befejezése történik.

Alap tesztforgatókönyv

Egy tipikus teszt: keresd meg az elemet → hajtsd végre a műveletet → ellenőrizd az eredményt. Az elem keresése XCUIElementQuery gyermek lekérdezésén keresztül történik: app.buttons["loginButton"], app.textFields["email"]. Műveletek: .tap(), .typeText("text"), .swipeUp(). Ellenőrzések: XCTAssertTrue(element.exists) vagy 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)
    }
}

Várakozások és szinkronizáció

Az XCUITest támogatja az explicit várakozásokat a XCTWaiter és NSPredicate predikátumok segítségével. Például egy elem megjelenésére várakozás 5 másodpercen belül: XCTWaiter().wait(for: [expectation], timeout: 5). A Detox-szal ellentétben az XCUITest nem rendelkezik automatikus szinkronizációval a hálózati kérésekkel.

swift
// Elem megjelenésének várakozás időkorláttal
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)

Az XCUITest haladó képességei

Az XCUITest támogatja az összetett forgatókönyvek tesztelését: multitouch gesztusok, push értesítések, Deep Linkek, SFSafariViewController és alkalmazások közötti interakció. A Siri intenciók is tesztelhetők XCUITest segítségével a Siri Remote szimuláció használatával.

Gesztusok tesztelése

Az XCUITest támogatja az összes népszerű gesztust: tap, doubleTap, pressForDuration, swipeUp/Down/Left/Right, pinch, rotate, twoFingerTap. Összetett forgatókönyvekhez a XCUIGesture használható tetszőleges koordinátákkal és időtartammal. Ez lehetővé teszi az egyéni gesztusok tesztelését, mint a rajzolás vagy drag-and-drop.

Hálózati kérések elfogása

Az Xcode 12-től kezdve az XCUITest támogatja a hálózati kérések elfogását az XCTestExpectation és URLProtocol segítségével. Ez lehetővé teszi az alkalmazás offline módban vagy kicserélt szerverválaszokkal történő tesztelését az alkalmazás kódjának módosítása nélkül.

XCUITest CI/CD-ben

Az XCUITest CI környezetekben az xcodebuild segítségével indul a test flag-gel. Párhuzamos futtatáshoz több szimulátoron az xcodebuild -testPlan használható a párhuzamos végrehajtás konfigurációjával az Xcode sémában. A GitHub Actions, Bitrise és Jenkins beépített támogatással rendelkezik az XCUITest-hez.

Konfiguráció CI-hez

A CI-hez szükséges a code signing, provisioning profiles beállítása és a cél megadása (szimulátor vagy eszköz). Az iOS tesztek szimulátoron nem igényelnek tanúsítványokat. Valós eszközökhöz automatikus aláírás szükséges az Xcode Cloud vagy Fastlane segítségével.

bash
# XCUITest futtatása szimulátoron az xcodebuild segítségével
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

Accessibility tesztelés XCUITest segítségével

Az XCUITest szorosan kapcsolódik az Apple Accessibility API-jához, mivel az elemek keresése az akadálymentességi attribútumokon alapul. Akadálymentességi tesztelés — nemcsak az elemek megtalálásának módja, hanem az alkalmazás akadálymentességének ellenőrzése a fogyatékkal élők számára. Az XCUITest ellenőrizheti az accessibilityLabel, traits és hints értékeket.

VoiceOver ellenőrzés

A VoiceOver — az Apple képernyőolvasója vak felhasználók számára. Az XCUITest lehetővé teszi annak ellenőrzését: accessibilityLabel — az elem érthető szöveggel van-e leírva, accessibilityTraits — az elem típusa megfelel-e (gomb, fejléc, kép), és accessibilityHint — ad-e támpontot a művelet eredményéről. Ezek az ellenőrzések kötelezőek az App Store-ban történő megjelenéshez, és az XCUITest automatizálja őket a regressziós futtatás keretében.

Automatikus Accessibility ellenőrzés

Az Xcode 15-től kezdve az XCUITest támogatja a beépített Accessibility ellenőrzést a XCTAttachment segítségével accessibilityAudit típussal. A teszt automatikusan jelenti az elégtelen kontrasztú elemeket, címkézetlen képeket és helytelen traits-eket. Ez helyettesíti a kézi Accessibility Inspector-t.

swift
// Akadálymentességi audit az XCUITest-ben
func testAccessibilityAudit() {
    let app = XCUIApplication()
    app.launch()

    let audit = XCTAttachment(accessibilityAudit: app)
    add(audit)

    // Adott elem ellenőrzése
    let button = app.buttons["submitButton"]
    XCTAssertTrue(button.label.count > 0)
    XCTAssertTrue(button.isAccessibilityElement)
}

Teljesítménytesztek XCUITest-ben

Az XCUITest támogatja a UI teljesítmény mérését a XCTOSSignpostMetric és XCUIApplication.metrics segítségével. Mérhető az alkalmazás indítási ideje (launch time), navigációs sebesség, gesztusokra adott válaszidő. A teljesítménytesztek baseline méréssel futnak, és automatikusan sikertelenek lesznek a küszöbérték túllépésekor. Ez megakadályozza a teljesítményregressziókat, mielőtt elérnék a felhasználókat a kiadási verzióban.

Baseline konfiguráció

A baseline — a teszt végrehajtásának referenci ideje. Az Xcode minden teszthez eltárolja a baseline-t az adott eszközmodellen és iOS-verzión. Ha egy új futtatás egy meghatározott százalékkal (alapértelmezett 10%) meghaladja a baseline-t, a teszt sikertelennek minősül. A baseline frissítéséhez az Edit Baseline parancs használható a tesztjelentésben. Fontos a baseline újraszámítása az iOS-verzió frissítésekor vagy az eszközmodell megváltoztatásakor a CI farm számára.

Tesztstabilitás monitorozása

Az XCUITest tesztek stabilitásának nyomon követéséhez flag-ek használhatók: continueAfterFailure (folytatódjon-e a teszt az első sikertelenség után) és Xcode teszttervek ismétlési konfigurációkkal. Javasolt a sikertelen tesztek automatikus újraindításának (retry) beállítása — legfeljebb 3 próbálkozás a flaky tesztekhez, amelyek animációs időzítésekkel vagy hálózati késleltetésekkel kapcsolatosak.

Push értesítések és Deep Linkek tesztelése

Az XCUITest támogatja a push értesítések és Deep Linkek tesztelését a springboard és launchArguments segítségével. Push értesítésekhez az XCUIApplication().launchArguments használható a -UNUserNotificationCenter paraméterrel és XCTesten keresztüli küldéssel. A Deep Linkek open URL-en keresztül tesztelhetők egyéni séma megadásával — az XCUITest elfogja a rendszer párbeszédablakát, és ellenőrzi, hogy az alkalmazás a megfelelő képernyővel nyílt-e meg. Az értesítésre adott válasz forgatókönyvének teszteléséhez az XCUIApplication().springboard használható, amely az értesítési bannerre kattintást szimulálja az iOS értesítési központban. Ezek a forgatókönyvek kritikusak a mély linkekkel és push kampányokkal rendelkező alkalmazásokhoz, ahol a külső hívások helyes feldolgozásának ellenőrzése szükséges.

Integráció az Instruments-szel

Részletes teljesítményprofilírozáshoz az XCUITest integrálódik az Instruments-szel. A teszt során elindítható a Time Profiler, Core Animation vagy Leaks profilírozás az XCTMetric segítségével. A profilírozás eredményei a jelentésben kerülnek mentésre, és elérhetők elemzésre az Xcode-ban. Ez különösen hasznos az alkalmazás indítási idejének, a képernyők közötti navigációnak és az animációk teljesítményének optimalizálásakor — ami tipikus szűk keresztmetszet az iOS alkalmazásokban.

Gyakran ismételt kérdések

Mi a különbség az XCUITest és az XCTest között?

Az XCTest általános keretrendszer az összes Apple teszttípushoz, beleértve az egységteszteket és teljesítményteszteket. Az XCUITest egy réteg az XCTest felett UI teszteléshez, amely hozzáadja az XCUIApplication, XCUIElement és XCUIElementQuery osztályokat a felülettel való interakcióhoz.

Használható az XCUITest Objective-C-vel?

Igen, az XCUITest támogatja mind a Swift, mind az Objective-C nyelveket. Az Apple példái és dokumentációja azonban többnyire Swift-ben íródott. Az Objective-C projektek további konfiguráció nélkül használhatják az XCUITest-et — a keretrendszer elérhető az @import XCTest segítségével.

Hogyan találja meg az XCUITest az elemeket a képernyőn?

Az XCUITest az Apple Accessibility API-ját használja. Az elemek accessibilityIdentifier, accessibilityLabel, típus (button, textField, staticText) vagy hierarchiában elfoglalt pozíció alapján találhatók meg. Minél pontosabban vannak beállítva az Accessibility attribútumok az alkalmazás kódjában, annál stabilabbak a tesztek.

Támogatja az XCUITest a tesztek rögzítését?

Igen, az Xcode tartalmaz egy beépített rögzítőt az UI tesztekhez. Amikor a teszt rögzítési módban indul, az Xcode rögzíti az összes interakciót a felülettel, és Swift kódot generál. A rögzített kód továbbfejleszthető: ellenőrzések hozzáadása, Page Objects-be kiszervezés és paraméterezés.

Hogyan futtatható az XCUITest valós eszközön?

Valós eszközön történő futtatáshoz: csatlakoztasd az eszközt a Mac-hez, add hozzá az Apple Developer Program-hoz, állítsd be a provisioning profile-t, írd alá az alkalmazást fejlesztői tanúsítvánnyal, és válaszd ki az eszközt célként az xcodebuild-ben.

Összefoglaló

  • XCUITest — natív Apple keretrendszer iOS, iPadOS és macOS alkalmazások UI teszteléséhez
  • Integráció az Xcode-dal tesztfelvételt, párhuzamos futtatást és beépített jelentéseket biztosít
  • XCUIApplication és XCUIElement — kulcsosztályok az alkalmazással való interakcióhoz
  • Accessibility attribútumok megbízható lokátorként szolgálnak, stabilak az elrendezés változásainál
  • Várakozások XCTWaiter és NSPredicate segítségével valósulnak meg — nincs automatikus szinkronizáció
  • CI/CD támogatott az xcodebuild segítségével párhuzamos futtatással szimulátorokon
  • Haladó forgatókönyvek magukban foglalják a multitouch-ot, Siri Intents-eket, hálózati kérések elfogását és Deep Linkeket

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is