XCUITest adalah framework Apple untuk pengujian UI aplikasi iOS, iPadOS, dan macOS, yang tertanam langsung di XCTest dan Xcode. Framework ini memungkinkan simulasi tindakan pengguna: klik, input teks, gesekan, gulir, dan gerakan — dengan akses ke keadaan internal elemen antarmuka. Menurut Apple Developer Documentation, 2025, XCUIApplication adalah titik masuk untuk semua pengujian UI dan menyediakan akses ke hierarki elemen layar.
Poin utama
XCUITest adalah framework pengujian UI yang dirilis oleh Apple di Xcode 7 (2015). Framework ini menggantikan UI Automation (UIA) dan menjadi alat standar untuk pengujian antarmuka otomatis di platform Apple. XCUITest sepenuhnya terintegrasi dengan XCTest — framework pengujian terpadu Apple.
Tidak seperti pengujian unit yang memeriksa logika di tingkat kelas dan metode, XCUITest menguji antarmuka pengguna melalui simulasi tindakan. Pengujian berjalan di proses terpisah dari aplikasi dan berinteraksi dengannya melalui Accessibility API — ini memastikan isolasi dan keandalan.
XCUITest tidak memerlukan instalasi server pihak ketiga (tidak seperti Appium) atau pustaka tambahan untuk berinteraksi dengan perangkat. Semua yang diperlukan sudah termasuk dalam Xcode. Ini memberikan kompatibilitas terbaik dengan versi iOS baru dan akses instan ke gerakan serta elemen kontrol baru.
Arsitektur XCUITest didasarkan pada dua kelas kunci: XCUIApplication — aplikasi yang sedang diuji, dan XCUIElement — elemen antarmuka. Pelari pengujian XCTest mengelola siklus hidup pengujian: setUp, metode pengujian, tearDown. XCUITest berjalan sebagai proses terpisah yang mengontrol aplikasi melalui jembatan Accessibility.
Setiap elemen UI diwakili oleh objek XCUIElement yang berisi metode untuk memeriksa status (exists, isHittable, label, value) dan tindakan (tap, pressForDuration, swipeUp, typeText). Elemen diatur dalam hierarki melalui rantai kueri: app.buttons[].staticTexts[].tables[]. Ini memungkinkan pencarian fleksibel elemen apa pun di layar.
XCUITest menggunakan atribut Accessibility untuk identifikasi elemen: accessibilityIdentifier — pengenal terprogram, dan accessibilityLabel — deskripsi untuk VoiceOver. Disarankan untuk mengatur accessibilityIdentifier di kode aplikasi — ini membuat pengujian stabil terlepas dari lokalisasi dan tata letak.
Pengujian XCUITest ditulis dalam Swift menggunakan sintaks XCTest. Setiap kelas pengujian mewarisi dari XCTestCase dan berisi metode yang dimulai dengan test. Dalam metode setUp, aplikasi dijalankan dengan konfigurasi yang diinginkan, dan di tearDown dilakukan pembersihan dan pengakhiran sesi.
Pengujian tipikal: temukan elemen → lakukan tindakan → periksa hasil. Pencarian elemen dilakukan melalui kueri anak XCUIElementQuery: app.buttons["loginButton"], app.textFields["email"]. Tindakan: .tap(), .typeText("text"), .swipeUp(). Pemeriksaan: XCTAssertTrue(element.exists) atau 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 mendukung penantian eksplisit melalui XCTWaiter dan predikat NSPredicate. Misalnya, menunggu kemunculan elemen dalam 5 detik: XCTWaiter().wait(for: [expectation], timeout: 5). Tidak seperti Detox, XCUITest tidak memiliki sinkronisasi otomatis dengan permintaan jaringan.
// Menunggu kemunculan elemen dengan batas waktu
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 mendukung pengujian skenario kompleks: gerakan multi-sentuh, notifikasi push, Deep Links, SFSafariViewController, dan interaksi antar aplikasi. Inten Siri juga dapat diuji melalui XCUITest menggunakan simulasi Siri Remote.
XCUITest mendukung semua gerakan populer: tap, doubleTap, pressForDuration, swipeUp/Down/Left/Right, pinch, rotate, twoFingerTap. Untuk skenario kompleks, XCUIGesture digunakan dengan koordinat dan durasi arbitrer. Ini memungkinkan pengujian gerakan kustom seperti menggambar atau drag-and-drop.
Mulai Xcode 12, XCUITest mendukung pencegatan permintaan jaringan melalui XCTestExpectation dan URLProtocol. Ini memungkinkan pengujian aplikasi dalam mode offline atau dengan respons server yang diganti tanpa mengubah kode aplikasi.
XCUITest dijalankan di lingkungan CI melalui xcodebuild dengan flag test. Untuk eksekusi paralel di beberapa simulator, gunakan xcodebuild -testPlan dengan konfigurasi eksekusi paralel di skema Xcode. GitHub Actions, Bitrise, dan Jenkins memiliki dukungan bawaan untuk XCUITest.
Untuk CI diperlukan konfigurasi code signing, provisioning profiles, dan penentuan destinasi (simulator atau perangkat). Pengujian iOS di simulator tidak memerlukan sertifikat. Untuk perangkat nyata, diperlukan penandatanganan otomatis melalui Xcode Cloud atau Fastlane.
# Menjalankan XCUITest di simulator melalui 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 terkait erat dengan Accessibility API Apple, karena pencarian elemen didasarkan pada atribut aksesibilitas. Pengujian aksesibilitas — bukan hanya metode menemukan elemen, tetapi juga memeriksa aksesibilitas aplikasi bagi penyandang disabilitas. XCUITest dapat memeriksa accessibilityLabel, traits, dan hints.
VoiceOver — pembaca layar Apple untuk pengguna tunanetra. XCUITest memungkinkan pemeriksaan: accessibilityLabel — apakah elemen dijelaskan dengan teks yang dapat dipahami, accessibilityTraits — apakah jenis elemen sesuai (tombol, judul, gambar), dan accessibilityHint — apakah memberikan petunjuk tentang hasil tindakan. Pemeriksaan ini wajib untuk publikasi di App Store, dan XCUITest mengotomatiskannya dalam kerangka lari regresi.
Mulai Xcode 15, XCUITest mendukung pemeriksaan Accessibility bawaan melalui XCTAttachment dengan tipe accessibilityAudit. Pengujian secara otomatis melaporkan elemen dengan kontras tidak mencukupi, gambar tanpa label, dan traits yang salah. Ini menggantikan Accessibility Inspector manual.
// Audit aksesibilitas di XCUITest
func testAccessibilityAudit() {
let app = XCUIApplication()
app.launch()
let audit = XCTAttachment(accessibilityAudit: app)
add(audit)
// Memeriksa elemen tertentu
let button = app.buttons["submitButton"]
XCTAssertTrue(button.label.count > 0)
XCTAssertTrue(button.isAccessibilityElement)
}
XCUITest mendukung pengukuran kinerja UI melalui XCTOSSignpostMetric dan XCUIApplication.metrics. Waktu peluncuran aplikasi (launch time), kecepatan navigasi, waktu respons terhadap gerakan dapat diukur. Pengujian kinerja dijalankan dengan pengukuran baseline dan secara otomatis gagal saat melebihi ambang batas. Ini mencegah regresi kinerja sebelum mencapai pengguna dalam versi rilis.
Baseline — waktu referensi eksekusi pengujian. Xcode menyimpan baseline untuk setiap pengujian pada model perangkat tertentu dan versi iOS. Jika eksekusi baru melebihi baseline dengan persentase tertentu (default 10%), pengujian dianggap gagal. Untuk memperbarui baseline, gunakan perintah Edit Baseline di laporan pengujian. Penting untuk menghitung ulang baseline saat memperbarui versi iOS atau mengubah model perangkat untuk farm CI.
Untuk melacak stabilitas pengujian XCUITest, digunakan flag: continueAfterFailure (apakah melanjutkan pengujian setelah kegagalan pertama) dan rencana pengujian Xcode dengan konfigurasi pengulangan. Disarankan untuk mengonfigurasi restart otomatis pengujian yang gagal (retry) — hingga 3 percobaan untuk pengujian flaky yang terkait dengan waktu animasi atau penundaan jaringan.
XCUITest mendukung pengujian notifikasi push dan Deep Links melalui springboard dan launchArguments. Untuk notifikasi push, gunakan XCUIApplication().launchArguments dengan parameter -UNUserNotificationCenter dan pengiriman melalui XCTest. Deep Links diuji melalui open URL dengan skema kustom — XCUITest mencegat dialog sistem dan memeriksa apakah aplikasi terbuka di layar yang benar. Untuk menguji skenario respons terhadap notifikasi, gunakan XCUIApplication().springboard yang mensimulasikan klik pada spanduk notifikasi di pusat notifikasi iOS. Skenario ini sangat penting untuk aplikasi dengan deep link dan kampanye push, di mana diperlukan verifikasi kebenaran pemrosesan panggilan eksternal.
Untuk pembuatan profil kinerja yang terperinci, XCUITest terintegrasi dengan Instruments. Selama pengujian, pembuatan profil Time Profiler, Core Animation, atau Leaks dapat dijalankan melalui XCTMetric. Hasil pembuatan profil disimpan dalam laporan dan tersedia untuk analisis di Xcode. Ini sangat berguna saat mengoptimalkan waktu peluncuran aplikasi, navigasi antar layar, dan kinerja animasi — hambatan umum dalam aplikasi iOS.
Pertanyaan yang sering diajukan
XCTest adalah framework umum untuk semua jenis pengujian Apple, termasuk pengujian unit dan kinerja. XCUITest adalah lapisan di atas XCTest untuk pengujian UI yang menambahkan kelas XCUIApplication, XCUIElement, dan XCUIElementQuery untuk interaksi dengan antarmuka.
Ya, XCUITest mendukung Swift dan Objective-C. Namun, sebagian besar contoh dan dokumentasi Apple ditulis dalam Swift. Proyek Objective-C dapat menggunakan XCUITest tanpa konfigurasi tambahan — framework tersedia melalui @import XCTest.
XCUITest menggunakan Accessibility API Apple. Elemen ditemukan berdasarkan accessibilityIdentifier, accessibilityLabel, tipe (button, textField, staticText), atau posisi dalam hierarki. Semakin akurat atribut Accessibility diatur dalam kode aplikasi, semakin stabil pengujiannya.
Ya, Xcode menyertakan perekam bawaan untuk pengujian UI. Saat menjalankan pengujian dalam mode perekaman, Xcode mencatat semua interaksi dengan antarmuka dan menghasilkan kode Swift. Kode yang direkam dapat ditingkatkan: menambahkan pemeriksaan, mengekstrak ke Page Objects, dan memparameternya.
Untuk menjalankan di perangkat nyata: hubungkan perangkat ke Mac, tambahkan ke Apple Developer Program, konfigurasi provisioning profile, tanda tangani aplikasi dengan sertifikat pengembangan, dan pilih perangkat sebagai destinasi di xcodebuild.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga