XCUITest: co to je, principy fungování a UI testování iOS

Autor: IT Sectr Publikováno: 2026-04-09 Doba čtení: 8 min

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 — nativní framework Apple pro UI testování, integrovaný v Xcode
  • Přístup white-box poskytuje přístup k atributům Accessibility a hierarchii prvků
  • Testy se píší v Swift nebo Objective-C v integraci s XCTest
  • Nahrávání testů dostupné přes vestavěný rekordér v Xcode
  • Spouštění probíhá na iOS simulátoru nebo reálném zařízení bez dalších serverů

Co je XCUITest

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.

Rozdíl oproti unit testům XCTest

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.

Výhody nativního přístupu

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 a XCTest

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.

Hierarchie prvků

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.

Accessibility a lokátory

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

Psaní UI testů v XCUITest

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.

Základní testovací scénář

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

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

Čekání a synchronizace

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

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

Pokročilé funkce XCUITest

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.

Testování gest

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.

Zachytávání síťových požadavků

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 v CI/CD

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.

Konfigurace pro CI

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.

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

Testování Accessibility pomocí XCUITest

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.

Kontrola VoiceOver

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.

Automatická kontrola Accessibility

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.

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

Výkonnostní testy v XCUITest

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.

Nastavení baseline

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.

Sledování stability testů

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.

Testování push notifikací a Deep Links

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

Integrace s Instruments

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

Jaký je rozdíl mezi XCUITest a XCTest?

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.

Lze XCUITest použít s Objective-C?

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.

Jak XCUITest nachází prvky na obrazovce?

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.

Podporuje XCUITest nahrávání testů?

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.

Jak spustit XCUITest na reálném zařízení?

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í

  • XCUITest — nativní framework Apple pro UI testování iOS, iPadOS a macOS aplikací
  • Integrace s Xcode poskytuje nahrávání testů, paralelní spouštění a vestavěné reporty
  • XCUIApplication a XCUIElement — klíčové třídy pro interakci s aplikací
  • Atributy Accessibility se používají jako spolehlivé lokátory, stabilní při změnách rozvržení
  • Čekání se implementují pomocí XCTWaiter a NSPredicate — automatická synchronizace není k dispozici
  • CI/CD podporováno přes xcodebuild s paralelním spouštěním na simulátorech
  • Pokročilé scénáře zahrnují multitouch, Siri Intents, zachytávání síťových požadavků a Deep Links

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

Prodiskutovat projekt

Přečtěte si také