XCUITest: apa itu, prinsip kerja dan pengujian UI iOS

Penulis: IT Sectr Diterbitkan: 2026-04-09 Waktu membaca: 8 mnt

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 — framework native Apple untuk pengujian UI, tertanam di Xcode
  • Pendekatan white-box menyediakan akses ke atribut Accessibility dan hierarki elemen
  • Pengujian ditulis dalam Swift atau Objective-C dengan integrasi XCTest
  • Rekaman tes tersedia melalui perekam bawaan di Xcode
  • Eksekusi dilakukan di simulator iOS atau perangkat nyata tanpa server tambahan

Apa itu XCUITest

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.

Perbedaan dengan pengujian unit XCTest

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.

Keuntungan pendekatan native

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

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.

Hierarki elemen

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.

Accessibility dan lokator

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.

Menulis pengujian UI di XCUITest

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.

Skenario pengujian dasar

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

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

Penantian dan sinkronisasi

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.

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

Fitur lanjutan XCUITest

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.

Pengujian gerakan

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.

Mencegat permintaan jaringan

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

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.

Konfigurasi untuk CI

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.

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

Pengujian Accessibility melalui XCUITest

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.

Pemeriksaan VoiceOver

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.

Pemeriksaan Accessibility otomatis

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.

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

Pengujian kinerja di XCUITest

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.

Konfigurasi baseline

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.

Pemantauan stabilitas pengujian

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.

Pengujian notifikasi push dan Deep Links

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.

Integrasi dengan Instruments

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

Apa perbedaan antara XCUITest dan XCTest?

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.

Bisakah XCUITest digunakan dengan Objective-C?

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.

Bagaimana XCUITest menemukan elemen di layar?

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.

Apakah XCUITest mendukung perekaman pengujian?

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.

Bagaimana cara menjalankan XCUITest di perangkat nyata?

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

  • XCUITest — framework native Apple untuk pengujian UI aplikasi iOS, iPadOS, dan macOS
  • Integrasi dengan Xcode menyediakan perekaman pengujian, eksekusi paralel, dan laporan bawaan
  • XCUIApplication dan XCUIElement — kelas kunci untuk interaksi dengan aplikasi
  • Atribut Accessibility digunakan sebagai lokator andal yang stabil terhadap perubahan tata letak
  • Penantian diimplementasikan melalui XCTWaiter dan NSPredicate — tidak ada sinkronisasi otomatis
  • CI/CD didukung melalui xcodebuild dengan eksekusi paralel di simulator
  • Skenario lanjutan mencakup multitouch, Siri Intents, pencegat permintaan jaringan, dan Deep Links

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.

Diskusikan proyek

Baca juga