Το XCUITest είναι ένα πλαίσιο της Apple για δοκιμή UI εφαρμογών iOS, iPadOS και macOS, ενσωματωμένο απευθείας στο XCTest και το Xcode. Επιτρέπει την προσομοίωση ενεργειών χρήστη: κλικ, εισαγωγή κειμένου, σύρσιμο, κύλιση και χειρονομίες — με πρόσβαση στην εσωτερική κατάσταση στοιχείων διεπαφής. Σύμφωνα με το Apple Developer Documentation, 2025, το XCUIApplication είναι το σημείο εισόδου για όλες τις δοκιμές UI και παρέχει πρόσβαση στην ιεραρχία στοιχείων οθόνης.
Κύρια σημεία
XCUITest είναι ένα πλαίσιο δοκιμής UI που κυκλοφόρησε από την Apple στο Xcode 7 (2015). Αντικατέστησε το UI Automation (UIA) και έγινε το τυπικό εργαλείο για αυτοματοποιημένη δοκιμή διεπαφής σε πλατφόρμες Apple. Το XCUITest είναι πλήρως ενσωματωμένο στο XCTest — το ενοποιημένο πλαίσιο δοκιμών της Apple.
Σε αντίθεση με τις δοκιμές μονάδας που ελέγχουν τη λογική σε επίπεδο κλάσεων και μεθόδων, το XCUITest δοκιμάζει τη διεπαφή χρήστη μέσω προσομοίωσης ενεργειών. Οι δοκιμές εκτελούνται σε ξεχωριστή διεργασία από την εφαρμογή και αλληλεπιδρούν με αυτήν μέσω του Accessibility API — αυτό εξασφαλίζει απομόνωση και αξιοπιστία.
Το XCUITest δεν απαιτεί εγκατάσταση διακομιστών τρίτων (σε αντίθεση με το Appium) ή πρόσθετων βιβλιοθηκών για αλληλεπίδραση με τη συσκευή. Όλα όσα χρειάζονται περιλαμβάνονται ήδη στο Xcode. Αυτό εξασφαλίζει την καλύτερη συμβατότητα με νέες εκδόσεις iOS και άμεση πρόσβαση σε νέες χειρονομίες και στοιχεία ελέγχου.
Η αρχιτεκτονική του XCUITest βασίζεται σε δύο βασικές κλάσεις: XCUIApplication — η εκτελούμενη δοκιμαζόμενη εφαρμογή, και XCUIElement — το στοιχείο διεπαφής. Ο εκτελεστής δοκιμών XCTest διαχειρίζεται τον κύκλο ζωής των δοκιμών: setUp, μεθόδους δοκιμής, tearDown. Το XCUITest εκτελείται ως ξεχωριστή διεργασία που ελέγχει την εφαρμογή μέσω της γέφυρας Accessibility.
Κάθε στοιχείο UI αντιπροσωπεύεται από ένα αντικείμενο XCUIElement που περιέχει μεθόδους για ερώτηση κατάστασης (exists, isHittable, label, value) και ενέργειες (tap, pressForDuration, swipeUp, typeText). Τα στοιχεία οργανώνονται σε ιεραρχία μέσω αλυσίδων ερωτημάτων: app.buttons[].staticTexts[].tables[]. Αυτό επιτρέπει την ευέλικτη εύρεση οποιουδήποτε στοιχείου στην οθόνη.
Το XCUITest χρησιμοποιεί χαρακτηριστικά Accessibility για την αναγνώριση στοιχείων: accessibilityIdentifier — προγραμματιστικό αναγνωριστικό, και accessibilityLabel — περιγραφή για το VoiceOver. Συνιστάται η ρύθμιση του accessibilityIdentifier στον κώδικα της εφαρμογής — αυτό καθιστά τις δοκιμές σταθερές ανεξάρτητα από τον εντοπισμό και τη διάταξη.
Οι δοκιμές 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").
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 δεν έχει αυτόματο συγχρονισμό με αιτήματα δικτύου.
// Αναμονή εμφάνισης στοιχείου με χρονικό όριο
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 υποστηρίζει δοκιμή σύνθετων σεναρίων: χειρονομίες πολλαπλής αφής, ειδοποιήσεις 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 μέσω xcodebuild με τη σημαία test. Για παράλληλη εκτέλεση σε πολλούς προσομοιωτές χρησιμοποιείται το xcodebuild -testPlan με διαμόρφωση παράλληλης εκτέλεσης στο σχήμα Xcode. Τα GitHub Actions, Bitrise και Jenkins έχουν ενσωματωμένη υποστήριξη για XCUITest.
Για CI απαιτείται ρύθμιση code signing, provisioning profiles και καθορισμός προορισμού (προσομοιωτής ή συσκευή). Οι δοκιμές iOS σε προσομοιωτή δεν απαιτούν πιστοποιητικά. Για πραγματικές συσκευές απαιτείται αυτόματη υπογραφή μέσω Xcode Cloud ή Fastlane.
# Εκτέλεση 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
Το XCUITest συνδέεται στενά με το Accessibility API της Apple, καθώς η αναζήτηση στοιχείων βασίζεται σε χαρακτηριστικά προσβασιμότητας. Δοκιμή προσβασιμότητας — δεν είναι μόνο μια μέθοδος εύρεσης στοιχείων, αλλά και έλεγχος της προσβασιμότητας της εφαρμογής για άτομα με αναπηρίες. Το XCUITest μπορεί να ελέγξει accessibilityLabel, traits και hints.
VoiceOver — ο αναγνώστης οθόνης της Apple για τυφλούς χρήστες. Το XCUITest επιτρέπει τον έλεγχο: accessibilityLabel — αν το στοιχείο περιγράφεται με κατανοητό κείμενο, accessibilityTraits — αν ο τύπος στοιχείου αντιστοιχεί (κουμπί, επικεφαλίδα, εικόνα), και accessibilityHint — αν δίνει υπόδειξη για το αποτέλεσμα της ενέργειας. Αυτοί οι έλεγχοι είναι υποχρεωτικοί για δημοσίευση στο App Store και το XCUITest τους αυτοματοποιεί στο πλαίσιο της εκτέλεσης παλινδρόμησης.
Από το Xcode 15, το XCUITest υποστηρίζει ενσωματωμένο έλεγχο Accessibility μέσω XCTAttachment με τύπο accessibilityAudit. Η δοκιμή αναφέρει αυτόματα στοιχεία με ανεπαρκή αντίθεση, εικόνες χωρίς ετικέτα και λανθασμένα traits. Αυτό αντικαθιστά τον χειροκίνητο Accessibility Inspector.
// Έλεγχος προσβασιμότητας στο 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 υποστηρίζει μέτρηση απόδοσης UI μέσω XCTOSSignpostMetric και XCUIApplication.metrics. Μπορεί να μετρηθεί ο χρόνος εκκίνησης εφαρμογής (launch time), ταχύτητα πλοήγησης, χρόνος απόκρισης σε χειρονομίες. Οι δοκιμές απόδοσης εκτελούνται με μέτρηση baseline και αποτυγχάνουν αυτόματα όταν ξεπερνούν το όριο. Αυτό αποτρέπει τις παλινδρομήσεις απόδοσης πριν φτάσουν στους χρήστες στην έκδοση κυκλοφορίας.
Baseline — ο χρόνος αναφοράς εκτέλεσης δοκιμής. Το Xcode αποθηκεύει το baseline για κάθε δοκιμή σε συγκεκριμένο μοντέλο συσκευής και έκδοση iOS. Εάν μια νέα εκτέλεση υπερβεί το baseline κατά ένα καθορισμένο ποσοστό (προεπιλογή 10%), η δοκιμή θεωρείται αποτυχημένη. Για ενημέρωση του baseline χρησιμοποιείται η εντολή Edit Baseline στην αναφορά δοκιμής. Είναι σημαντικό να υπολογίζεται εκ νέου το baseline κατά την ενημέρωση έκδοσης iOS ή αλλαγή μοντέλου συσκευής για τη φάρμα CI.
Για την παρακολούθηση σταθερότητας δοκιμών XCUITest χρησιμοποιούνται σημαίες: continueAfterFailure (αν η δοκιμή συνεχίζεται μετά την πρώτη αποτυχία) και σχέδια δοκιμών Xcode με διαμορφώσεις επανάληψης. Συνιστάται η ρύθμιση αυτόματης επανεκκίνησης αποτυχημένων δοκιμών (retry) — έως 3 προσπάθειες για ασταθείς δοκιμές που σχετίζονται με χρονισμούς κινούμενων εικόνων ή καθυστερήσεις δικτύου.
Το XCUITest υποστηρίζει δοκιμή ειδοποιήσεων push και Deep Links μέσω springboard και launchArguments. Για ειδοποιήσεις push χρησιμοποιείται XCUIApplication().launchArguments με παράμετρο -UNUserNotificationCenter και αποστολή μέσω XCTest. Τα Deep Links δοκιμάζονται μέσω open URL με καθορισμό προσαρμοσμένου σχήματος — το XCUITest παρεμβάλλει το παράθυρο διαλόγου συστήματος και ελέγχει αν η εφαρμογή άνοιξε στη σωστή οθόνη. Για τη δοκιμή σεναρίου απόκρισης σε ειδοποίηση χρησιμοποιείται το XCUIApplication().springboard που προσομοιώνει κλικ στο banner ειδοποίησης στο κέντρο ειδοποιήσεων iOS. Αυτά τα σενάρια είναι κρίσιμα για εφαρμογές με deep links και καμπάνιες push, όπου απαιτείται επαλήθευση της σωστής επεξεργασίας εξωτερικών κλήσεων.
Για λεπτομερή προφίλ απόδοσης, το XCUITest ενσωματώνεται με τα Instruments. Κατά τη διάρκεια της δοκιμής μπορεί να εκκινηθεί προφίλ Time Profiler, Core Animation ή Leaks μέσω XCTMetric. Τα αποτελέσματα προφίλ αποθηκεύονται στην αναφορά και είναι διαθέσιμα για ανάλυση στο Xcode. Αυτό είναι ιδιαίτερα χρήσιμο κατά τη βελτιστοποίηση του χρόνου εκκίνησης εφαρμογής, πλοήγησης μεταξύ οθονών και απόδοσης κινούμενων εικόνων — τυπικών σημείων συμφόρησης σε εφαρμογές iOS.
Συχνές ερωτήσεις
Το XCTest είναι ένα γενικό πλαίσιο για όλους τους τύπους δοκιμών Apple, συμπεριλαμβανομένων δοκιμών μονάδας και απόδοσης. Το XCUITest είναι ένα επίπεδο πάνω από το XCTest για δοκιμή UI που προσθέτει τις κλάσεις XCUIApplication, XCUIElement και XCUIElementQuery για αλληλεπίδραση με τη διεπαφή.
Ναι, το XCUITest υποστηρίζει τόσο Swift όσο και Objective-C. Ωστόσο, τα περισσότερα παραδείγματα και η τεκμηρίωση της Apple είναι γραμμένα σε Swift. Τα έργα Objective-C μπορούν να χρησιμοποιήσουν το XCUITest χωρίς πρόσθετη ρύθμιση — το πλαίσιο είναι διαθέσιμο μέσω @import XCTest.
Το XCUITest χρησιμοποιεί το Accessibility API της Apple. Τα στοιχεία βρίσκονται με accessibilityIdentifier, accessibilityLabel, τύπο (button, textField, staticText) ή θέση στην ιεραρχία. Όσο πιο ακριβή είναι τα χαρακτηριστικά Accessibility στον κώδικα της εφαρμογής, τόσο πιο σταθερές είναι οι δοκιμές.
Ναι, το Xcode περιλαμβάνει έναν ενσωματωμένο καταγραφέα για δοκιμές UI. Κατά την εκτέλεση δοκιμής σε λειτουργία εγγραφής, το Xcode καταγράφει όλες τις αλληλεπιδράσεις με τη διεπαφή και παράγει κώδικα Swift. Ο καταγεγραμμένος κώδικας μπορεί να βελτιωθεί: προσθήκη ελέγχων, εξαγωγή σε Page Objects και παραμετροποίηση.
Για εκτέλεση σε πραγματική συσκευή: συνδέστε τη συσκευή στο Mac, προσθέστε την στο Apple Developer Program, ρυθμίστε το provisioning profile, υπογράψτε την εφαρμογή με πιστοποιητικό ανάπτυξης και επιλέξτε τη συσκευή ως προορισμό στο xcodebuild.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης