XCUITest: Nedir, nasıl çalışır ve iOS UI testi

Yazar: IT Sectr Yayınlanma: 2026-04-09 Okuma süresi: 8 dk

XCUITest, iOS, iPadOS ve macOS uygulamalarının UI testi için Apple’ın framework’üdür ve doğrudan XCTest ve Xcode’a entegre edilmiştir. Kullanıcı eylemlerini simüle etmeye olanak tanır: dokunmalar, metin girişi, kaydırmalar, scrol ve hareketler — arayüz elemanlarının iç durumuna erişimle birlikte. Apple Developer Documentation, 2025’e göre, XCUIApplication tüm UI testleri için giriş noktasıdır ve ekran elemanlarının hiyerarşisine erişim sağlar.

Anahtar noktalar

  • XCUITest, Xcode’a entegre edilmiş Apple’ın yerel UI test framework’üdür
  • Beyaz kutu yaklaşımı, Erişilebilirlik özniteliklerine ve eleman hiyerarşisine erişim sağlar
  • Testler, XCTest ile entegre Swift veya Objective-C ile yazılır
  • Test kaydı, Xcode’daki yerleşik kaydedici aracılığıyla kullanılabilir
  • Yürütme, ek sunucular olmadan iOS simülatöründe veya gerçek cihazda gerçekleştirilir

XCUITest nedir

XCUITest, Apple tarafından Xcode 7’de (2015) yayınlanan bir UI test framework’üdür. UI Automation (UIA)’ın yerini almış ve Apple platformlarında otomatik arayüz testi için standart araç haline gelmiştir. XCUITest, Apple’ın birleşik test framework’ü olan XCTest ile tamamen entegredir.

XCTest Birim Testlerinden Farkı

Sınıf ve yöntem düzeyinde mantığı doğrulayan birim testlerinin aksine, XCUITest eylem simülasyonu yoluyla kullanıcı arayüzünü test eder. Testler, uygulamadan ayrı bir süreçte çalışır ve onunla Erişilebilirlik API’si aracılığıyla etkileşime girer — bu, yalıtım ve güvenilirlik sağlar.

Yerel Yaklaşımın Avantajları

XCUITest, üçüncü taraf sunucuların (Appium’un aksine) veya cihaz etkileşimi için ek kitaplıkların kurulmasını gerektirmez. Gerekli her şey zaten Xcode’da bulunmaktadır. Bu, yeni iOS sürümleriyle en iyi uyumluluğu ve yeni hareketlere ve kontrollere anında erişimi garanti eder.

XCUITest ve XCTest Mimarisi

XCUITest mimarisi iki temel sınıf üzerine kurulmuştur: XCUIApplication — başlatılan test edilebilir uygulama ve XCUIElement — arayüz elemanı. XCTest test çalıştırıcısı, test yaşam döngüsünü yönetir: setUp, test yöntemleri, tearDown. XCUITest, uygulamayı Erişilebilirlik köprüsü aracılığıyla kontrol eden ayrı bir süreç olarak çalışır.

Eleman Hiyerarşisi

Her UI elemanı, durumu (exists, isHittable, label, value) ve eylemleri (tap, pressForDuration, swipeUp, typeText) sorgulamak için yöntemler içeren bir XCUIElement nesnesiyle temsil edilir. Elemanlar, sorgu zincirleri aracılığıyla bir hiyerarşi halinde düzenlenir: app.buttons[].staticTexts[].tables[]. Bu, ekrandaki herhangi bir elemanı esnek bir şekilde bulmayı sağlar.

Erişilebilirlik ve Konumlandırıcılar

XCUITest, elemanları tanımlamak için Erişilebilirlik özniteliklerini kullanır: accessibilityIdentifier — programatik bir tanımlayıcı ve accessibilityLabel — VoiceOver için bir açıklama. Uygulama kodunda accessibilityIdentifier ayarlanması önerilir — bu, testleri yerelleştirme ve düzenden bağımsız olarak kararlı hale getirir.

XCUITest ile UI Testleri Yazma

XCUITest testleri, XCTest sözdizimini kullanarak Swift ile yazılır. Her test sınıfı, XCTestCase’den miras alır ve test ile başlayan yöntemler içerir. setUp yönteminde uygulama gerekli yapılandırmayla başlatılır ve tearDown’da temizlik ve oturum sonlandırma gerçekleştirilir.

Temel Test Senaryosu

Tipik bir test: bir eleman bul → bir eylem gerçekleştir → sonucu doğrula. Eleman arama, XCUIElementQuery alt sorguları aracılığıyla yapılır: app.buttons["loginButton"], app.textFields["email"]. Eylemler: .tap(), .typeText("text"), .swipeUp(). Doğrulamalar: XCTAssertTrue(element.exists) veya 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)
    }
}

Beklemeler ve Senkronizasyon

XCUITest, XCTWaiter ve NSPredicate yüklemleri aracılığıyla açık beklemeleri destekler. Örneğin, bir elemanın 5 saniye içinde görünmesini beklemek: XCTWaiter().wait(for: [expectation], timeout: 5). Detox’un aksine, XCUITest’in ağ istekleriyle otomatik senkronizasyonu yoktur.

swift
// Elemanın zaman aşımıyla görünmesini bekleme
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’in Gelişmiş Özellikleri

XCUITest, karmaşık senaryoların test edilmesini destekler: çoklu dokunma hareketleri, push bildirimleri, Deep Link’ler, SFSafariViewController ve uygulamalar arası etkileşim. Siri Intent’leri de Siri Remote simülasyonu kullanılarak XCUITest aracılığıyla test edilebilir.

Hareket Testi

XCUITest, tüm popüler hareketleri destekler: tap, doubleTap, pressForDuration, swipeUp/Down/Left/Right, pinch, rotate, twoFingerTap. Karmaşık senaryolar için, özel koordinatlar ve süre ile XCUIGesture kullanılır. Bu, çizim veya sürükle-bırak gibi özel hareketlerin test edilmesini sağlar.

Ağ İsteklerini Yakalama

Xcode 12’den itibaren XCUITest, XCTestExpectation ve URLProtocol aracılığıyla ağ isteklerini yakalamayı destekler. Bu, uygulama kodunu değiştirmeden îvrimdışı modda veya simüle edilmiş sunucu yanıtlarıyla uygulamayı test etmeyi sağlar.

CI/CD’de XCUITest

XCUITest, CI ortamlarında test bayrağıyla xcodebuild aracılığıyla çalıştırılır. Birden çok simülatörde paralel yürütme için, Xcode şemasında paralel yürütme yapılandırmasıyla xcodebuild -testPlan kullanılır. GitHub Actions, Bitrise ve Jenkins, XCUITest için yerleşik desteğe sahiptir.

CI Yapılandırması

CI için, kod imzalama, sağlama profilleri ve hedef (simülatör veya cihaz) yapılandırılmalıdır. Simülatördeki iOS testleri sertifika gerektirmez. Gerçek cihazlar için, Xcode Cloud veya Fastlane aracılığıyla otomatik imzalama gereklidir.

bash
# xcodebuild aracılığıyla simülatörde XCUITest çalıştırma
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 ile Erişilebilirlik Testi

XCUITest, Apple’ın Erişilebilirlik API’siyle yakından ilişkilidir, çünkü eleman arama, erişilebilirlik özniteliklerine dayanır. Erişilebilirlik testi, yalnızca elemanları bulmanın bir yolu değil, aynı zamanda uygulamanın engelli kişiler için erişilebilirliğini doğrulamanın bir yoludur. XCUITest, accessibilityLabel, traits ve hints’i kontrol edebilir.

VoiceOver Doğrulaması

VoiceOver, görme engelli kullanıcılar için Apple’ın ekran okuyucusudur. XCUITest şunları kontrol etmeye olanak tanır: accessibilityLabel — elemanın net metinle tanımlanıp tanımlanmadığı, accessibilityTraits — eleman türünün eşleşip eşleşmediği (düğme, başlık, görüntü) ve accessibilityHint — eylem sonucu hakkında bir ipucu sağlayıp sağlamadığı. Bu kontroller App Store yayını için zorunludur ve XCUITest bunları regresyon çalıştırmalarının bir parçası olarak otomatikleştirir.

Otomatik Erişilebilirlik Kontrolü

Xcode 15’ten itibaren XCUITest, accessibilityAudit türüyle XCTAttachment aracılığıyla yerleşik erişilebilirlik kontrolünü destekler. Test, yetersiz kontrasta sahip elemanlar, etiketlenmemiş görseller ve hatalı traits hakkında otomatik olarak rapor verir. Bu, manuel Erişilebilirlik Denetleyicisinin yerini alır.

swift
// XCUITest’te erişilebilirlik denetimi
func testAccessibilityAudit() {
    let app = XCUIApplication()
    app.launch()

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

    // Belirli bir elemanı kontrol etme
    let button = app.buttons["submitButton"]
    XCTAssertTrue(button.label.count > 0)
    XCTAssertTrue(button.isAccessibilityElement)
}

XCUITest’te Performans Testleri

XCUITest, XCTOSSignpostMetric ve XCUIApplication.metrics aracılığıyla UI performansı ölçümünü destekler. Uygulama başlatma süresi, gezinme hızı ve hareket yanıt süresi ölçülebilir. Performans testleri, temel ölçümle çalıştırılır ve eşik aşıldığında otomatik olarak başarısız olur. Bu, performans düşüşlerinin bir sürüm derlemesinde kullanıcılara ulaşmadan önlenmesine yardımcı olur.

Temel Çizgi Yapılandırması

Temel çizgi (baseline), bir testin referans yürütme süresidir. Xcode, belirli bir cihaz modeli ve iOS sürümündeki her test için temel çizgiyi hatırlar. Yeni bir çalıştırma, temel çizgiyi belirli bir yüzdeyle (varsayılan %10) aşarsa, test başarısız sayılır. Temel çizgiyi güncellemek için, test raporunda Edit Baseline komutu kullanılır. iOS sürümünü güncellerken veya CI çiftliği için cihaz modelini değiştirirken temel çizgiyi yeniden hesaplamak önemlidir.

Test Kararlılığı İzleme

XCUITest testlerinin kararlılığını izlemek için bayraklar kullanılır: continueAfterFailure (ilk başarısızlıktan sonra teste devam edilip edilmeyeceği) ve yeniden deneme yapılandırmalarıyla Xcode test planları. Başarısız testlerin (retry) otomatik olarak yeniden başlatılmasının yapılandırılması önerilir — animasyon zamanlaması veya ağ gecikmeleriyle ilgili dengesiz testler için 3 denemeye kadar.

Push Bildirimleri ve Deep Link Testi

XCUITest, springboard ve launchArguments aracılığıyla push bildirimleri ve Deep Link testini destekler. Push bildirimleri için, -UNUserNotificationCenter parametresiyle XCUIApplication().launchArguments ve XCTest aracılığıyla gönderme kullanılır. Deep Link’ler, özel bir şema ile open URL aracılığıyla test edilir — XCUITest, sistem iletişim kutusunu yakalar ve uygulamanın doğru ekranla açılıp açılmadığını kontrol eder. Bildirim yanıt senaryosunu test etmek için, iOS bildirim merkezindeki bildirim bannerına dokunmayı simüle eden XCUIApplication().springboard kullanılır. Bu senaryolar, derin bağlantıları ve push kampanyaları olan uygulamalar için kritiktir ve harici çağrıların doğru şekilde işlenmesini doğrulamak gerekir.

Instruments ile Entegrasyon

Ayrıntılı performans profili oluşturma için XCUITest, Instruments ile entegre olur. Test sırasında, XCTMetric aracılığıyla Time Profiler, Core Animation veya Leaks profili başlatılabilir. Profil oluşturma sonuçları raporda kaydedilir ve Xcode’da analiz için kullanılabilir. Bu, özellikle uygulama başlatma süresini, ekranlar arasında gezinmeyi ve animasyon performansını — iOS uygulamalarındaki tipik darboğazları — optimize etmek için kullanışlıdır.

Sıkça Sorulan Sorular

XCUITest ve XCTest arasındaki fark nedir?

XCTest, birim testleri ve performans testleri dahil olmak üzere tüm Apple test türleri için genel framework’tür. XCUITest, arayüzle etkileşim için XCUIApplication, XCUIElement ve XCUIElementQuery sınıflarını ekleyen, UI testi için XCTest üzerinde bir uzantıdır.

XCUITest Objective-C ile kullanılabilir mi?

Evet, XCUITest hem Swift hem de Objective-C’yi destekler. Ancak, Apple örneklerinin ve dokümantasyonunun çoğu Swift ile yazılmıştır. Objective-C projeleri, ek kurulum olmadan XCUITest’i kullanabilir — framework @import XCTest aracılığıyla kullanılabilir.

XCUITest ekrandaki elemanları nasıl bulur?

XCUITest, Apple’ın Erişilebilirlik API’sini kullanır. Elemanlar, accessibilityIdentifier, accessibilityLabel, tür (button, textField, staticText) veya hiyerarşideki konuma göre bulunur. Uygulama kodundaki erişilebilirlik öznitelikleri ne kadar kesin olursa, testler o kadar kararlı olur.

XCUITest test kaydını destekliyor mu?

Evet, Xcode, UI testleri için yerleşik bir kaydedici içerir. Bir test kayıt modunda çalıştırıldığında, Xcode arayüzle tüm etkileşimleri yakalar ve Swift kodu üretir. Kaydedilen kod, doğrulamalar eklenerek, Page Objects’e çıkarılarak ve parametrelendirilerek geliştirilebilir.

Gerçek cihazda XCUITest nasıl çalıştırılır?

Gerçek bir cihazda çalıştırmak için: cihazı bir Mac’e bağlayın, Apple Developer Program’a ekleyin, bir sağlama profili yapılandırın, uygulamayı bir geliştirme sertifikasıyla imzalayın ve xcodebuild’de cihazı hedef olarak seçin.

Özet

  • XCUITest, iOS, iPadOS ve macOS uygulamaları için Apple’ın yerel UI test framework’üdür
  • Xcode entegrasyonu test kaydı, paralel yürütme ve yerleşik raporlar sağlar
  • XCUIApplication ve XCUIElement, uygulamayla etkileşim için temel sınıflardır
  • Erişilebilirlik öznitelikleri güvenilir konumlandırıcılar olarak kullanılır, düzen değişikliklerinde kararlıdır
  • Beklemeler XCTWaiter ve NSPredicate aracılığıyla uygulanır — otomatik senkronizasyon yoktur
  • CI/CD, simülatörlerde paralel yürütmeyle xcodebuild aracılığıyla desteklenir
  • Gelişmiş senaryolar çoklu dokunma, Siri Intent’leri, ağ isteği yakalama ve Deep Link’leri içerir

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun