XCUITest: ما هو وكيف يعمل واختبار واجهة مستخدم iOS

المؤلف: IT Sectr نُشر: 2026-04-09 وقت القراءة: 8 دق

XCUITest هو إطار عمل من Apple لاختبار واجهة المستخدم لتطبيقات iOS وiPadOS وmacOS، مدمج مباشرة في XCTest وXcode. يسمح بمحاكاة إجراءات المستخدم: النقرات وإدخال النص والتمرير والسحب والإيماءات — مع الوصول إلى الحالة الداخلية لعناصر الواجهة. وفقاً لـ Apple Developer Documentation, 2025، XCUIApplication هي نقطة الدخول لجميع اختبارات واجهة المستخدم وتوفر الوصول إلى تسلسل هرمي لعناصر الشاشة.

الخلاصة

  • XCUITest هو إطار عمل Apple الأصلي لاختبار واجهة المستخدم المدمج في Xcode
  • نهج الصندوق الأبيض يوفر الوصول إلى سمات إمكانية الوصول والتسلسل الهرمي للعناصر
  • الاختبارات تُكتب بلغة Swift أو Objective-C المدمجة مع XCTest
  • تسجيل الاختبارات متاح من خلال المسجل المدمج في Xcode
  • التشغيل يتم على محاكي iOS أو جهاز حقيقي بدون خوادم إضافية

ما هو XCUITest

XCUITest هو إطار عمل لاختبار واجهة المستخدم أصدرته Apple في Xcode 7 (2015). حل محل UI Automation (UIA) وأصبح الأداة القياسية لاختبار الواجهة الآلي على منصات Apple. XCUITest مدمج بالكامل في XCTest — إطار الاختبار الموحد من Apple.

الفرق عن اختبارات الوحدة في XCTest

على عكس اختبارات الوحدة التي تتحقق من المنطق على مستوى الفئات والطرق، يختبر XCUITest واجهة المستخدم من خلال محاكاة الإجراءات. تعمل الاختبارات في عملية منفصلة عن التطبيق وتتفاعل معه عبر واجهة برمجة تطبيقات إمكانية الوصول — مما يضمن العزل والموثوقية.

مزايا النهج الأصلي

لا يتطلب XCUITest تثبيت خوادم طرف ثالث (على عكس Appium) أو مكتبات إضافية للتفاعل مع الجهاز. كل ما هو مطلوب مضمن بالفعل في Xcode. وهذا يضمن أفضل توافق مع إصدارات iOS الجديدة والوصول الفوري إلى الإيماءات وعناصر التحكم الجديدة.

هندسة XCUITest وXCTest

تستند بنية XCUITest على فئتين رئيسيتين: XCUIApplication — التطبيق قيد الاختبار الذي تم تشغيله، وXCUIElement — عنصر الواجهة. يدير مشغل اختبار XCTest دورة حياة الاختبارات: setUp وطرق الاختبار وtearDown. يعمل XCUITest كعملية منفصلة تتحكم في التطبيق عبر جسر إمكانية الوصول.

التسلسل الهرمي للعناصر

يتم تمثيل كل عنصر واجهة مستخدم بكائن XCUIElement يحتوي على طرق للاستعلام عن الحالة (exists, isHittable, label, value) والإجراءات (tap, pressForDuration, swipeUp, typeText). يتم تنظيم العناصر في تسلسل هرمي من خلال سلاسل الاستعلام: app.buttons[].staticTexts[].tables[]. وهذا يسمح بالعثور المرن على أي عنصر على الشاشة.

إمكانية الوصول والمحددات

يستخدم XCUITest سمات إمكانية الوصول لتحديد العناصر: accessibilityIdentifier — معرّف برمجي، وaccessibilityLabel — وصف لـ VoiceOver. يُوصى بتعيين accessibilityIdentifier في كود التطبيق — مما يجعل الاختبارات مستقرة بغض النظر عن الترجمة والتخطيط.

كتابة اختبارات واجهة المستخدم باستخدام 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 اختبار السيناريوهات المعقدة: إيماءات اللمس المتعدد والإشعارات الفورية والروابط العميقة وSFSafariViewController والتفاعل بين التطبيقات. يمكن أيضاً اختبار نوايا Siri من خلال XCUITest باستخدام محاكاة Siri Remote.

اختبار الإيماءات

يدعم XCUITest جميع الإيماءات الشائعة: النقر والنقر المزدوج والضغط مع الاستمرار والتمرير لأعلى/أسفل/يسار/يمين والقرص والتدوير والنقر بإصبعين. للسيناريوهات المعقدة، يُستخدم XCUIGesture بإحداثيات ومدة مخصصة. وهذا يسمح باختبار الإيماءات المخصصة مثل الرسم أو السحب والإفلات.

اعتراض طلبات الشبكة

بدءاً من Xcode 12، يدعم XCUITest اعتراض طلبات الشبكة من خلال XCTestExpectation وURLProtocol. وهذا يسمح باختبار التطبيق في وضع عدم الاتصال أو باستجابات خادم محاكاة دون تعديل كود التطبيق.

XCUITest في CI/CD

يتم تشغيل XCUITest في بيئات CI من خلال xcodebuild مع علامة test. للتشغيل المتوازي على عدة محاكيات، يُستخدم xcodebuild -testPlan مع تكوين التنفيذ المتوازي في مخطط Xcode. GitHub Actions وBitrise وJenkins لديها دعم مدمج لـ XCUITest.

التكوين لـ CI

لـ CI، يجب تكوين توقيع الكود وملفات التزويد وتحديد الوجهة (محاكي أو جهاز). لا تتطلب اختبارات 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

اختبار إمكانية الوصول باستخدام XCUITest

يرتبط XCUITest ارتباطاً وثيقاً بواجهة برمجة تطبيقات إمكانية الوصول من Apple، حيث أن البحث عن العناصر يعتمد على سمات إمكانية الوصول. اختبار إمكانية الوصول ليس مجرد طريقة للعثور على العناصر، بل هو أيضاً طريقة للتحقق من إمكانية وصول التطبيق للأشخاص ذوي الإعاقة. يمكن لـ XCUITest التحقق من accessibilityLabel وtraits وhints.

التحقق من VoiceOver

VoiceOver هو قارئ الشاشة من Apple للمستخدمين ضعاف البصر. يتيح XCUITest التحقق من: accessibilityLabel — هل تم وصف العنصر بنص واضح، accessibilityTraits — هل يتطابق نوع العنصر (زر، عنوان، صورة)، وaccessibilityHint — هل يقدم تلميحاً عن نتيجة الإجراء. هذه الفحوصات إلزامية للنشر في App Store، ويقوم XCUITest بأتمتتها كجزء من تشغيلات الانحدار.

الفحص التلقائي لإمكانية الوصول

بدءاً من Xcode 15، يدعم XCUITest الفحص المدمج لإمكانية الوصول من خلال XCTAttachment بنوع accessibilityAudit. يبلغ الاختبار تلقائياً عن العناصر ذات التباين غير الكافي والصور غير المسماة والسمات غير الصحيحة. وهذا يحل محل مفتش إمكانية الوصول اليدوي.

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 قياس أداء واجهة المستخدم من خلال XCTOSSignpostMetric وXCUIApplication.metrics. يمكن قياس وقت تشغيل التطبيق وسرعة التنقل ووقت الاستجابة للإيماءات. يتم تشغيل اختبارات الأداء مع قياس خط الأساس وتفشل تلقائياً عند تجاوز الحد. وهذا يساعد في منع تراجع الأداء قبل وصوله إلى المستخدمين في إصدار الإصدار.

تكوين خط الأساس

خط الأساس (baseline) هو وقت التنفيذ المرجعي للاختبار. يتذكر Xcode خط الأساس لكل اختبار على طراز جهاز محدد وإصدار iOS معين. إذا تجاوز تشغيل جديد خط الأساس بنسبة مئوية محددة (افتراضياً 10%)، يعتبر الاختبار فاشلاً. لتحديث خط الأساس، يُستخدم أمر Edit Baseline في تقرير الاختبارات. من المهم إعادة حساب خط الأساس عند تحديث إصدار iOS أو تغيير طراز الجهاز لمزرعة CI.

مراقبة استقرار الاختبارات

لمراقبة استقرار اختبارات XCUITest، تُستخدم علامات: continueAfterFailure (هل تستمر الاختبارات بعد الفشل الأول) وخطط اختبار Xcode مع تكوينات إعادة المحاولة. يُوصى بتكوين إعادة التشغيل التلقائي للاختبارات الفاشلة (retry) — حتى 3 محاولات للاختبارات غير المستقرة المرتبطة بتوقيت الرسوم المتحركة أو تأخيرات الشبكة.

اختبار الإشعارات الفورية والروابط العميقة

يدعم XCUITest اختبار الإشعارات الفورية والروابط العميقة من خلال springboard وlaunchArguments. للإشعارات الفورية، يُستخدم XCUIApplication().launchArguments مع المعامل -UNUserNotificationCenter والإرسال عبر XCTest. يتم اختبار الروابط العميقة عبر فتح URL بمخطط مخصص — يعترض XCUITest حوار النظام ويتحقق مما إذا كان التطبيق قد فتح بالشاشة الصحيحة. لاختبار سيناريو الرد على الإشعار، يُستخدم XCUIApplication().springboard الذي يحاكي النقر على لافتة الإشعار في مركز إشعارات iOS. هذه السيناريوهات حاسمة للتطبيقات ذات الروابط العميقة وحملات الدفع، حيث يلزم التحقق من المعالجة الصحيحة للاستدعاءات الخارجية.

التكامل مع Instruments

للتنميط التفصيلي للأداء، يتكامل XCUITest مع Instruments. أثناء الاختبار، يمكن تشغيل تنميط Time Profiler أو Core Animation أو Leaks عبر XCTMetric. تُحفظ نتائج التنميط في التقرير وتكون متاحة للتحليل في Xcode. هذا مفيد بشكل خاص لتحسين وقت تشغيل التطبيق والتنقل بين الشاشات وأداء الرسوم المتحركة — وهي اختناقات نموذجية في تطبيقات iOS.

الأسئلة الشائعة

ما الفرق بين XCUITest وXCTest؟

XCTest هو الإطار العام لجميع أنواع اختبارات Apple، بما في ذلك اختبارات الوحدة واختبارات الأداء. XCUITest هو امتداد فوق XCTest لاختبار واجهة المستخدم يضيف فئات XCUIApplication وXCUIElement وXCUIElementQuery للتفاعل مع الواجهة.

هل يمكن استخدام XCUITest مع Objective-C؟

نعم، يدعم XCUITest كلاً من Swift وObjective-C. ومع ذلك، معظم أمثلة ووثائق Apple مكتوبة بلغة Swift. يمكن لمشاريع Objective-C استخدام XCUITest دون إعداد إضافي — الإطار متاح عبر @import XCTest.

كيف يجد XCUITest العناصر على الشاشة؟

يستخدم XCUITest واجهة برمجة تطبيقات إمكانية الوصول من Apple. يتم العثور على العناصر بواسطة accessibilityIdentifier وaccessibilityLabel والنوع (button وtextField وstaticText) أو الموضع في التسلسل الهرمي. كلما كانت سمات إمكانية الوصول أكثر دقة في كود التطبيق، كانت الاختبارات أكثر استقراراً.

هل يدعم XCUITest تسجيل الاختبارات؟

نعم، يتضمن Xcode مسجلاً مدمجاً لاختبارات واجهة المستخدم. عند تشغيل اختبار في وضع التسجيل، يلتقط Xcode جميع التفاعلات مع الواجهة وينشئ كود Swift. يمكن تحسين الكود المسجل: إضافة تحقق واستخراج إلى Page Objects ووضع معاملات.

كيف يتم تشغيل XCUITest على جهاز حقيقي؟

للتشغيل على جهاز حقيقي، يلزم: توصيل الجهاز بجهاز Mac وإضافته إلى Apple Developer Program وتكوين ملف التزويد وتوقيع التطبيق بشهادة تطوير وتحديد الجهاز كوجهة في xcodebuild.

الملخص

  • XCUITest هو إطار عمل Apple الأصلي لاختبار واجهة المستخدم لتطبيقات iOS وiPadOS وmacOS
  • التكامل مع Xcode يوفر تسجيل الاختبارات والتشغيل المتوازي والتقارير المدمجة
  • XCUIApplication وXCUIElement هما الفئتان الرئيسيتان للتفاعل مع التطبيق
  • سمات إمكانية الوصول تُستخدم كمحددات موثوقة ومستقرة عند تغييرات التخطيط
  • التوقعات تُنفذ من خلال XCTWaiter وNSPredicate — لا توجد مزامنة تلقائية
  • CI/CD مدعوم من خلال xcodebuild مع تشغيل متوازي على المحاكيات
  • السيناريوهات المتقدمة تشمل اللمس المتعدد وSiri Intents واعتراض طلبات الشبكة والروابط العميقة

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا