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 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.
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.
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 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.
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.
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.
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.
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").
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)
}
}
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.
// 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 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.
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.
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.
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.
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.
# 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
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.
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.
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.
// 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)
}
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.
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.
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.
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.
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
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.
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.
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.
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.
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ó
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.
Olvassa el is