XCUITest je framework Apple pro UI testování iOS, iPadOS a macOS aplikací, integrovaný přímo do XCTest a Xcode. Umožňuje simulaci akcí uživatele: kliknutí, zadávání textu, přejetí, rolování a gesta — s přístupem k internímu stavu prvků rozhraní. Podle Apple Developer Documentation, 2025 je XCUIApplication vstupním bodem pro všechny UI testy a poskytuje přístup k hierarchii prvků obrazovky.
Hlavní body
XCUITest je framework pro UI testování vydaný Apple v Xcode 7 (2015). Nahradil UI Automation (UIA) a stal se standardním nástrojem pro automatizované testování rozhraní na platformách Apple. XCUITest je plně integrován do XCTest — jednotného testovacího frameworku Apple.
Na rozdíl od unit testů, které kontrolují logiku na úrovni tříd a metod, XCUITest testuje uživatelské rozhraní prostřednictvím simulace akcí. Testy běží v samostatném procesu od aplikace a komunikují s ní přes Accessibility API — to zajišťuje izolaci a spolehlivost.
XCUITest nevyžaduje instalaci serverů třetích stran (na rozdíl od Appium) ani dalších knihoven pro interakci se zařízením. Vše potřebné je již součástí Xcode. To zajišťuje nejlepší kompatibilitu s novými verzemi iOS a okamžitý přístup k novým gestům a ovládacím prvkům.
Architektura XCUITest je postavena na dvou klíčových třídách: XCUIApplication — spuštěná testovaná aplikace, a XCUIElement — prvek rozhraní. Testovací běh XCTest spravuje životní cyklus testů: setUp, testovací metody, tearDown. XCUITest běží jako samostatný proces, který řídí aplikaci přes most Accessibility.
Každý prvek UI je reprezentován objektem XCUIElement, který obsahuje metody pro dotazování stavu (exists, isHittable, label, value) a akce (tap, pressForDuration, swipeUp, typeText). Prvky jsou organizovány do hierarchie pomocí řetězců dotazů: app.buttons[].staticTexts[].tables[]. To umožňuje flexibilní nalezení libovolného prvku na obrazovce.
XCUITest používá atributy Accessibility pro identifikaci prvků: accessibilityIdentifier — programový identifikátor, a accessibilityLabel — popis pro VoiceOver. Doporučuje se nastavit accessibilityIdentifier v kódu aplikace — to činí testy stabilními nezávisle na lokalizaci a rozvržení.
Testy XCUITest se píší v Swift pomocí syntaxe XCTest. Každá testovací třída dědí z XCTestCase a obsahuje metody začínající testem. V metodě setUp se spouští aplikace s požadovanou konfigurací a v tearDown probíhá čištění a ukončení relace.
Typický test: najdi prvek → proveď akci → zkontroluj výsledek. Vyhledávání prvku probíhá prostřednictvím podřízených dotazů XCUIElementQuery: app.buttons["loginButton"], app.textFields["email"]. Akce: .tap(), .typeText("text"), .swipeUp(). Kontroly: XCTAssertTrue(element.exists) nebo 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 podporuje explicitní čekání prostřednictvím XCTWaiter a predikátů NSPredicate. Například čekání na zobrazení prvku do 5 sekund: XCTWaiter().wait(for: [expectation], timeout: 5). Na rozdíl od Detox, XCUITest nemá automatickou synchronizaci s požadavky sítě.
// Čekání na zobrazení prvku s timeoutem
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 podporuje testování složitých scénářů: multi-touch gesta, push notifikace, Deep Links, SFSafariViewController a meziaplikační interakci. Siri intence lze také testovat pomocí XCUITest s využitím simulace Siri Remote.
XCUITest podporuje všechna populární gesta: tap, doubleTap, pressForDuration, swipeUp/Down/Left/Right, pinch, rotate, twoFingerTap. Pro složité scénáře se používá XCUIGesture s libovolnými souřadnicemi a dobou trvání. To umožňuje testování vlastních gest, jako je kreslení nebo drag-and-drop.
Od Xcode 12 podporuje XCUITest zachytávání síťových požadavků prostřednictvím XCTestExpectation a URLProtocol. To umožňuje testování aplikace v offline režimu nebo s nahrazenými odpověďmi serveru bez úpravy kódu aplikace.
XCUITest se spouští v CI prostředích pomocí xcodebuild s příznakem test. Pro paralelní spouštění na více simulátorech se používá xcodebuild -testPlan s konfigurací paralelního provádění ve schématu Xcode. GitHub Actions, Bitrise a Jenkins mají vestavěnou podporu pro XCUITest.
Pro CI je vyžadována konfigurace code signing, provisioning profiles a určení destinace (simulátor nebo zařízení). iOS testy na simulátoru nevyžadují certifikáty. Pro reálná zařízení je nutné automatické podepisování přes Xcode Cloud nebo Fastlane.
# Spuštění XCUITest na simulátoru přes 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 je úzce propojen s Accessibility API Apple, protože vyhledávání prvků je založeno na atributech přístupnosti. Testování přístupnosti — není pouze metodou hledání prvků, ale také kontrolou přístupnosti aplikace pro osoby s postižením. XCUITest může kontrolovat accessibilityLabel, traits a hints.
VoiceOver — čtečka obrazovky Apple pro nevidomé uživatele. XCUITest umožňuje kontrolu: accessibilityLabel — zda je prvek popsán srozumitelným textem, accessibilityTraits — zda typ prvku odpovídá (tlačítko, nadpis, obrázek), a accessibilityHint — zda poskytuje nápovědu o výsledku akce. Tyto kontroly jsou povinné pro publikování v App Store a XCUITest je automatizuje v rámci regresního běhu.
Od Xcode 15 podporuje XCUITest vestavěnou kontrolu Accessibility prostřednictvím XCTAttachment s typem accessibilityAudit. Test automaticky hlásí prvky s nedostatečným kontrastem, neoznačené obrázky a nesprávné traits. To nahrazuje ruční Accessibility Inspector.
// Audit přístupnosti v XCUITest
func testAccessibilityAudit() {
let app = XCUIApplication()
app.launch()
let audit = XCTAttachment(accessibilityAudit: app)
add(audit)
// Kontrola konkrétního prvku
let button = app.buttons["submitButton"]
XCTAssertTrue(button.label.count > 0)
XCTAssertTrue(button.isAccessibilityElement)
}
XCUITest podporuje měření výkonu UI prostřednictvím XCTOSSignpostMetric a XCUIApplication.metrics. Lze měřit dobu spuštění aplikace (launch time), rychlost navigace, dobu odezvy na gesta. Výkonnostní testy se spouštějí s měřením baseline a automaticky selhávají při překročení prahu. To zabraňuje regresím výkonu dříve, než se dostanou k uživatelům v release verzi.
Baseline — referenční doba provedení testu. Xcode si pamatuje baseline pro každý test na konkrétním modelu zařízení a verzi iOS. Pokud nové spuštění překročí baseline o stanovené procento (výchozí 10%), test je považován za neúspěšný. Pro aktualizaci baseline se používá příkaz Edit Baseline v reportu testů. Je důležité přepočítat baseline při aktualizaci verze iOS nebo změně modelu zařízení pro CI farmu.
Pro sledování stability XCUITest testů se používají příznaky: continueAfterFailure (zda pokračovat v testu po prvním selhání) a testovací plány Xcode s konfiguracemi opakování. Doporučuje se nastavit automatické restartování neúspěšných testů (retry) — až 3 pokusy pro flaky testy související s načasováním animací nebo síťovými zpožděními.
XCUITest podporuje testování push notifikací a Deep Links prostřednictvím springboard a launchArguments. Pro push notifikace se používá XCUIApplication().launchArguments s parametrem -UNUserNotificationCenter a odesláním přes XCTest. Deep Links se testují pomocí open URL s uvedením vlastního schématu — XCUITest zachytí systémový dialog a zkontroluje, zda se aplikace otevřela na správné obrazovce. Pro testování scénáře odpovědi na notifikaci se používá XCUIApplication().springboard, který simuluje kliknutí na banner notifikace v centru notifikací iOS. Tyto scénáře jsou kritické pro aplikace s hlubokými odkazy a push kampaněmi, kde je nutné ověřit správnost zpracování externích volání.
Pro detailní profilování výkonu se XCUITest integruje s Instruments. Během testu lze spustit profilování Time Profiler, Core Animation nebo Leaks pomocí XCTMetric. Výsledky profilování se ukládají do reportu a jsou k dispozici pro analýzu v Xcode. To je užitečné zejména při optimalizaci doby spuštění aplikace, navigace mezi obrazovkami a výkonu animací — typických úzkých hrdel v iOS aplikacích.
Často kladené otázky
XCTest je obecný framework pro všechny typy Apple testů, včetně unit testů a výkonnostních testů. XCUITest je vrstva nad XCTest pro UI testování, která přidává třídy XCUIApplication, XCUIElement a XCUIElementQuery pro interakci s rozhraním.
Ano, XCUITest podporuje jak Swift, tak Objective-C. Většina příkladů a dokumentace Apple je však psána ve Swift. Objective-C projekty mohou používat XCUITest bez další konfigurace — framework je dostupný přes @import XCTest.
XCUITest používá Accessibility API Apple. Prvky se nacházejí podle accessibilityIdentifier, accessibilityLabel, typu (button, textField, staticText) nebo pozice v hierarchii. Čím přesněji jsou atributy Accessibility nastaveny v kódu aplikace, tím stabilnější jsou testy.
Ano, Xcode obsahuje vestavěný rekordér pro UI testy. Při spuštění testu v režimu nahrávání Xcode zaznamenává všechny interakce s rozhraním a generuje Swift kód. Nahraný kód lze vylepšit: přidat kontroly, vyčlenit do Page Objects a parametrizovat.
Pro spuštění na reálném zařízení je třeba: připojit zařízení k Macu, přidat jej do Apple Developer Program, nastavit provisioning profile, podepsat aplikaci vývojářským certifikátem a vybrat zařízení jako destinaci v xcodebuild.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také