XCUITest: τι είναι, αρχές λειτουργίας και δοκιμή UI iOS

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-04-09 Χρόνος ανάγνωσης: 8 λεπ

Το XCUITest είναι ένα πλαίσιο της Apple για δοκιμή UI εφαρμογών iOS, iPadOS και macOS, ενσωματωμένο απευθείας στο XCTest και το Xcode. Επιτρέπει την προσομοίωση ενεργειών χρήστη: κλικ, εισαγωγή κειμένου, σύρσιμο, κύλιση και χειρονομίες — με πρόσβαση στην εσωτερική κατάσταση στοιχείων διεπαφής. Σύμφωνα με το Apple Developer Documentation, 2025, το XCUIApplication είναι το σημείο εισόδου για όλες τις δοκιμές UI και παρέχει πρόσβαση στην ιεραρχία στοιχείων οθόνης.

Κύρια σημεία

  • XCUITest — εγγενές πλαίσιο της Apple για δοκιμή UI, ενσωματωμένο στο Xcode
  • Προσέγγιση white-box παρέχει πρόσβαση σε χαρακτηριστικά Accessibility και ιεραρχία στοιχείων
  • Δοκιμές γράφονται σε Swift ή Objective-C με ενσωμάτωση XCTest
  • Εγγραφή δοκιμών διαθέσιμη μέσω του ενσωματωμένου καταγραφέα στο Xcode
  • Εκτέλεση γίνεται σε προσομοιωτή iOS ή πραγματική συσκευή χωρίς επιπλέον διακομιστές

Τι είναι το XCUITest

XCUITest είναι ένα πλαίσιο δοκιμής UI που κυκλοφόρησε από την Apple στο Xcode 7 (2015). Αντικατέστησε το UI Automation (UIA) και έγινε το τυπικό εργαλείο για αυτοματοποιημένη δοκιμή διεπαφής σε πλατφόρμες Apple. Το XCUITest είναι πλήρως ενσωματωμένο στο XCTest — το ενοποιημένο πλαίσιο δοκιμών της Apple.

Διαφορά από τις δοκιμές μονάδας XCTest

Σε αντίθεση με τις δοκιμές μονάδας που ελέγχουν τη λογική σε επίπεδο κλάσεων και μεθόδων, το XCUITest δοκιμάζει τη διεπαφή χρήστη μέσω προσομοίωσης ενεργειών. Οι δοκιμές εκτελούνται σε ξεχωριστή διεργασία από την εφαρμογή και αλληλεπιδρούν με αυτήν μέσω του Accessibility API — αυτό εξασφαλίζει απομόνωση και αξιοπιστία.

Πλεονεκτήματα της εγγενούς προσέγγισης

Το XCUITest δεν απαιτεί εγκατάσταση διακομιστών τρίτων (σε αντίθεση με το Appium) ή πρόσθετων βιβλιοθηκών για αλληλεπίδραση με τη συσκευή. Όλα όσα χρειάζονται περιλαμβάνονται ήδη στο Xcode. Αυτό εξασφαλίζει την καλύτερη συμβατότητα με νέες εκδόσεις iOS και άμεση πρόσβαση σε νέες χειρονομίες και στοιχεία ελέγχου.

Αρχιτεκτονική XCUITest και XCTest

Η αρχιτεκτονική του XCUITest βασίζεται σε δύο βασικές κλάσεις: XCUIApplication — η εκτελούμενη δοκιμαζόμενη εφαρμογή, και XCUIElement — το στοιχείο διεπαφής. Ο εκτελεστής δοκιμών XCTest διαχειρίζεται τον κύκλο ζωής των δοκιμών: setUp, μεθόδους δοκιμής, tearDown. Το XCUITest εκτελείται ως ξεχωριστή διεργασία που ελέγχει την εφαρμογή μέσω της γέφυρας Accessibility.

Ιεραρχία στοιχείων

Κάθε στοιχείο UI αντιπροσωπεύεται από ένα αντικείμενο XCUIElement που περιέχει μεθόδους για ερώτηση κατάστασης (exists, isHittable, label, value) και ενέργειες (tap, pressForDuration, swipeUp, typeText). Τα στοιχεία οργανώνονται σε ιεραρχία μέσω αλυσίδων ερωτημάτων: app.buttons[].staticTexts[].tables[]. Αυτό επιτρέπει την ευέλικτη εύρεση οποιουδήποτε στοιχείου στην οθόνη.

Accessibility και εντοπιστές

Το XCUITest χρησιμοποιεί χαρακτηριστικά Accessibility για την αναγνώριση στοιχείων: accessibilityIdentifier — προγραμματιστικό αναγνωριστικό, και accessibilityLabel — περιγραφή για το VoiceOver. Συνιστάται η ρύθμιση του accessibilityIdentifier στον κώδικα της εφαρμογής — αυτό καθιστά τις δοκιμές σταθερές ανεξάρτητα από τον εντοπισμό και τη διάταξη.

Σύνταξη δοκιμών UI στο XCUITest

Οι δοκιμές XCUITest γράφονται σε Swift χρησιμοποιώντας σύνταξη XCTest. Κάθε κλάση δοκιμής κληρονομεί από την XCTestCase και περιέχει μεθόδους που ξεκινούν με test. Στη μέθοδο setUp εκκινείται η εφαρμογή με την επιθυμητή διαμόρφωση, και στο tearDown γίνεται καθαρισμός και τερματισμός της συνεδρίας.

Βασικό σενάριο δοκιμής

Μια τυπική δοκιμή: βρες στοιχείο → εκτέλεσε ενέργεια → έλεγξε αποτέλεσμα. Η αναζήτηση στοιχείου γίνεται μέσω θυγατρικών ερωτημάτων XCUIElementQuery: app.buttons["loginButton"], app.textFields["email"]. Ενέργειες: .tap(), .typeText("text"), .swipeUp(). Έλεγχοι: XCTAssertTrue(element.exists) ή 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)
    }
}

Αναμονές και συγχρονισμός

Το XCUITest υποστηρίζει ρητές αναμονές μέσω XCTWaiter και κατηγορημάτων NSPredicate. Για παράδειγμα, αναμονή εμφάνισης στοιχείου εντός 5 δευτερολέπτων: XCTWaiter().wait(for: [expectation], timeout: 5). Σε αντίθεση με το Detox, το XCUITest δεν έχει αυτόματο συγχρονισμό με αιτήματα δικτύου.

swift
// Αναμονή εμφάνισης στοιχείου με χρονικό όριο
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

Το XCUITest υποστηρίζει δοκιμή σύνθετων σεναρίων: χειρονομίες πολλαπλής αφής, ειδοποιήσεις push, Deep Links, SFSafariViewController και διαλειτουργικότητα εφαρμογών. Τα Siri Intents μπορούν επίσης να δοκιμαστούν μέσω XCUITest με χρήση προσομοίωσης Siri Remote.

Δοκιμή χειρονομιών

Το XCUITest υποστηρίζει όλες τις δημοφιλείς χειρονομίες: tap, doubleTap, pressForDuration, swipeUp/Down/Left/Right, pinch, rotate, twoFingerTap. Για σύνθετα σενάρια χρησιμοποιείται το XCUIGesture με αυθαίρετες συντεταγμένες και διάρκεια. Αυτό επιτρέπει τη δοκιμή προσαρμοσμένων χειρονομιών όπως σχέδιο ή drag-and-drop.

Παρεμβολή αιτημάτων δικτύου

Από το Xcode 12, το XCUITest υποστηρίζει παρεμβολή αιτημάτων δικτύου μέσω XCTestExpectation και URLProtocol. Αυτό επιτρέπει τη δοκιμή της εφαρμογής σε λειτουργία εκτός σύνδεσης ή με αλλαγμένες απαντήσεις διακομιστή χωρίς τροποποίηση του κώδικα της εφαρμογής.

XCUITest σε CI/CD

Το XCUITest εκτελείται σε περιβάλλοντα CI μέσω xcodebuild με τη σημαία test. Για παράλληλη εκτέλεση σε πολλούς προσομοιωτές χρησιμοποιείται το xcodebuild -testPlan με διαμόρφωση παράλληλης εκτέλεσης στο σχήμα Xcode. Τα GitHub Actions, Bitrise και Jenkins έχουν ενσωματωμένη υποστήριξη για XCUITest.

Διαμόρφωση για CI

Για CI απαιτείται ρύθμιση code signing, provisioning profiles και καθορισμός προορισμού (προσομοιωτής ή συσκευή). Οι δοκιμές iOS σε προσομοιωτή δεν απαιτούν πιστοποιητικά. Για πραγματικές συσκευές απαιτείται αυτόματη υπογραφή μέσω Xcode Cloud ή Fastlane.

bash
# Εκτέλεση XCUITest σε προσομοιωτή μέσω 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

Δοκιμή Accessibility μέσω XCUITest

Το XCUITest συνδέεται στενά με το Accessibility API της Apple, καθώς η αναζήτηση στοιχείων βασίζεται σε χαρακτηριστικά προσβασιμότητας. Δοκιμή προσβασιμότητας — δεν είναι μόνο μια μέθοδος εύρεσης στοιχείων, αλλά και έλεγχος της προσβασιμότητας της εφαρμογής για άτομα με αναπηρίες. Το XCUITest μπορεί να ελέγξει accessibilityLabel, traits και hints.

Έλεγχος VoiceOver

VoiceOver — ο αναγνώστης οθόνης της Apple για τυφλούς χρήστες. Το XCUITest επιτρέπει τον έλεγχο: accessibilityLabel — αν το στοιχείο περιγράφεται με κατανοητό κείμενο, accessibilityTraits — αν ο τύπος στοιχείου αντιστοιχεί (κουμπί, επικεφαλίδα, εικόνα), και accessibilityHint — αν δίνει υπόδειξη για το αποτέλεσμα της ενέργειας. Αυτοί οι έλεγχοι είναι υποχρεωτικοί για δημοσίευση στο App Store και το XCUITest τους αυτοματοποιεί στο πλαίσιο της εκτέλεσης παλινδρόμησης.

Αυτόματος έλεγχος Accessibility

Από το Xcode 15, το XCUITest υποστηρίζει ενσωματωμένο έλεγχο Accessibility μέσω XCTAttachment με τύπο accessibilityAudit. Η δοκιμή αναφέρει αυτόματα στοιχεία με ανεπαρκή αντίθεση, εικόνες χωρίς ετικέτα και λανθασμένα traits. Αυτό αντικαθιστά τον χειροκίνητο Accessibility Inspector.

swift
// Έλεγχος προσβασιμότητας στο XCUITest
func testAccessibilityAudit() {
    let app = XCUIApplication()
    app.launch()

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

    // Έλεγχος συγκεκριμένου στοιχείου
    let button = app.buttons["submitButton"]
    XCTAssertTrue(button.label.count > 0)
    XCTAssertTrue(button.isAccessibilityElement)
}

Δοκιμές απόδοσης στο XCUITest

Το XCUITest υποστηρίζει μέτρηση απόδοσης UI μέσω XCTOSSignpostMetric και XCUIApplication.metrics. Μπορεί να μετρηθεί ο χρόνος εκκίνησης εφαρμογής (launch time), ταχύτητα πλοήγησης, χρόνος απόκρισης σε χειρονομίες. Οι δοκιμές απόδοσης εκτελούνται με μέτρηση baseline και αποτυγχάνουν αυτόματα όταν ξεπερνούν το όριο. Αυτό αποτρέπει τις παλινδρομήσεις απόδοσης πριν φτάσουν στους χρήστες στην έκδοση κυκλοφορίας.

Ρύθμιση baseline

Baseline — ο χρόνος αναφοράς εκτέλεσης δοκιμής. Το Xcode αποθηκεύει το baseline για κάθε δοκιμή σε συγκεκριμένο μοντέλο συσκευής και έκδοση iOS. Εάν μια νέα εκτέλεση υπερβεί το baseline κατά ένα καθορισμένο ποσοστό (προεπιλογή 10%), η δοκιμή θεωρείται αποτυχημένη. Για ενημέρωση του baseline χρησιμοποιείται η εντολή Edit Baseline στην αναφορά δοκιμής. Είναι σημαντικό να υπολογίζεται εκ νέου το baseline κατά την ενημέρωση έκδοσης iOS ή αλλαγή μοντέλου συσκευής για τη φάρμα CI.

Παρακολούθηση σταθερότητας δοκιμών

Για την παρακολούθηση σταθερότητας δοκιμών XCUITest χρησιμοποιούνται σημαίες: continueAfterFailure (αν η δοκιμή συνεχίζεται μετά την πρώτη αποτυχία) και σχέδια δοκιμών Xcode με διαμορφώσεις επανάληψης. Συνιστάται η ρύθμιση αυτόματης επανεκκίνησης αποτυχημένων δοκιμών (retry) — έως 3 προσπάθειες για ασταθείς δοκιμές που σχετίζονται με χρονισμούς κινούμενων εικόνων ή καθυστερήσεις δικτύου.

Δοκιμή ειδοποιήσεων push και Deep Links

Το XCUITest υποστηρίζει δοκιμή ειδοποιήσεων push και Deep Links μέσω springboard και launchArguments. Για ειδοποιήσεις push χρησιμοποιείται XCUIApplication().launchArguments με παράμετρο -UNUserNotificationCenter και αποστολή μέσω XCTest. Τα Deep Links δοκιμάζονται μέσω open URL με καθορισμό προσαρμοσμένου σχήματος — το XCUITest παρεμβάλλει το παράθυρο διαλόγου συστήματος και ελέγχει αν η εφαρμογή άνοιξε στη σωστή οθόνη. Για τη δοκιμή σεναρίου απόκρισης σε ειδοποίηση χρησιμοποιείται το XCUIApplication().springboard που προσομοιώνει κλικ στο banner ειδοποίησης στο κέντρο ειδοποιήσεων iOS. Αυτά τα σενάρια είναι κρίσιμα για εφαρμογές με deep links και καμπάνιες push, όπου απαιτείται επαλήθευση της σωστής επεξεργασίας εξωτερικών κλήσεων.

Ενσωμάτωση με Instruments

Για λεπτομερή προφίλ απόδοσης, το XCUITest ενσωματώνεται με τα Instruments. Κατά τη διάρκεια της δοκιμής μπορεί να εκκινηθεί προφίλ Time Profiler, Core Animation ή Leaks μέσω XCTMetric. Τα αποτελέσματα προφίλ αποθηκεύονται στην αναφορά και είναι διαθέσιμα για ανάλυση στο Xcode. Αυτό είναι ιδιαίτερα χρήσιμο κατά τη βελτιστοποίηση του χρόνου εκκίνησης εφαρμογής, πλοήγησης μεταξύ οθονών και απόδοσης κινούμενων εικόνων — τυπικών σημείων συμφόρησης σε εφαρμογές iOS.

Συχνές ερωτήσεις

Ποια είναι η διαφορά μεταξύ XCUITest και XCTest;

Το XCTest είναι ένα γενικό πλαίσιο για όλους τους τύπους δοκιμών Apple, συμπεριλαμβανομένων δοκιμών μονάδας και απόδοσης. Το XCUITest είναι ένα επίπεδο πάνω από το XCTest για δοκιμή UI που προσθέτει τις κλάσεις XCUIApplication, XCUIElement και XCUIElementQuery για αλληλεπίδραση με τη διεπαφή.

Μπορεί το XCUITest να χρησιμοποιηθεί με Objective-C;

Ναι, το XCUITest υποστηρίζει τόσο Swift όσο και Objective-C. Ωστόσο, τα περισσότερα παραδείγματα και η τεκμηρίωση της Apple είναι γραμμένα σε Swift. Τα έργα Objective-C μπορούν να χρησιμοποιήσουν το XCUITest χωρίς πρόσθετη ρύθμιση — το πλαίσιο είναι διαθέσιμο μέσω @import XCTest.

Πώς βρίσκει το XCUITest στοιχεία στην οθόνη;

Το XCUITest χρησιμοποιεί το Accessibility API της Apple. Τα στοιχεία βρίσκονται με accessibilityIdentifier, accessibilityLabel, τύπο (button, textField, staticText) ή θέση στην ιεραρχία. Όσο πιο ακριβή είναι τα χαρακτηριστικά Accessibility στον κώδικα της εφαρμογής, τόσο πιο σταθερές είναι οι δοκιμές.

Υποστηρίζει το XCUITest εγγραφή δοκιμών;

Ναι, το Xcode περιλαμβάνει έναν ενσωματωμένο καταγραφέα για δοκιμές UI. Κατά την εκτέλεση δοκιμής σε λειτουργία εγγραφής, το Xcode καταγράφει όλες τις αλληλεπιδράσεις με τη διεπαφή και παράγει κώδικα Swift. Ο καταγεγραμμένος κώδικας μπορεί να βελτιωθεί: προσθήκη ελέγχων, εξαγωγή σε Page Objects και παραμετροποίηση.

Πώς εκτελείται το XCUITest σε πραγματική συσκευή;

Για εκτέλεση σε πραγματική συσκευή: συνδέστε τη συσκευή στο Mac, προσθέστε την στο Apple Developer Program, ρυθμίστε το provisioning profile, υπογράψτε την εφαρμογή με πιστοποιητικό ανάπτυξης και επιλέξτε τη συσκευή ως προορισμό στο xcodebuild.

Περίληψη

  • XCUITest — εγγενές πλαίσιο Apple για δοκιμή UI εφαρμογών iOS, iPadOS και macOS
  • Ενσωμάτωση με Xcode παρέχει εγγραφή δοκιμών, παράλληλη εκτέλεση και ενσωματωμένες αναφορές
  • XCUIApplication και XCUIElement — βασικές κλάσεις για αλληλεπίδραση με εφαρμογή
  • Χαρακτηριστικά Accessibility χρησιμοποιούνται ως αξιόπιστοι εντοπιστές, σταθεροί σε αλλαγές διάταξης
  • Αναμονές υλοποιούνται μέσω XCTWaiter και NSPredicate — δεν υπάρχει αυτόματος συγχρονισμός
  • CI/CD υποστηρίζεται μέσω xcodebuild με παράλληλη εκτέλεση σε προσομοιωτές
  • Προηγμένα σενάρια περιλαμβάνουν multitouch, Siri Intents, παρεμβολή αιτημάτων δικτύου και Deep Links

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης