XCUITest هو إطار عمل من Apple لاختبار واجهة المستخدم لتطبيقات iOS وiPadOS وmacOS، مدمج مباشرة في XCTest وXcode. يسمح بمحاكاة إجراءات المستخدم: النقرات وإدخال النص والتمرير والسحب والإيماءات — مع الوصول إلى الحالة الداخلية لعناصر الواجهة. وفقاً لـ Apple Developer Documentation, 2025، XCUIApplication هي نقطة الدخول لجميع اختبارات واجهة المستخدم وتوفر الوصول إلى تسلسل هرمي لعناصر الشاشة.
الخلاصة
XCUITest هو إطار عمل لاختبار واجهة المستخدم أصدرته Apple في Xcode 7 (2015). حل محل UI Automation (UIA) وأصبح الأداة القياسية لاختبار الواجهة الآلي على منصات Apple. XCUITest مدمج بالكامل في XCTest — إطار الاختبار الموحد من Apple.
على عكس اختبارات الوحدة التي تتحقق من المنطق على مستوى الفئات والطرق، يختبر XCUITest واجهة المستخدم من خلال محاكاة الإجراءات. تعمل الاختبارات في عملية منفصلة عن التطبيق وتتفاعل معه عبر واجهة برمجة تطبيقات إمكانية الوصول — مما يضمن العزل والموثوقية.
لا يتطلب XCUITest تثبيت خوادم طرف ثالث (على عكس Appium) أو مكتبات إضافية للتفاعل مع الجهاز. كل ما هو مطلوب مضمن بالفعل في Xcode. وهذا يضمن أفضل توافق مع إصدارات iOS الجديدة والوصول الفوري إلى الإيماءات وعناصر التحكم الجديدة.
تستند بنية 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 بلغة 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 اختبار السيناريوهات المعقدة: إيماءات اللمس المتعدد والإشعارات الفورية والروابط العميقة وSFSafariViewController والتفاعل بين التطبيقات. يمكن أيضاً اختبار نوايا Siri من خلال XCUITest باستخدام محاكاة Siri Remote.
يدعم XCUITest جميع الإيماءات الشائعة: النقر والنقر المزدوج والضغط مع الاستمرار والتمرير لأعلى/أسفل/يسار/يمين والقرص والتدوير والنقر بإصبعين. للسيناريوهات المعقدة، يُستخدم XCUIGesture بإحداثيات ومدة مخصصة. وهذا يسمح باختبار الإيماءات المخصصة مثل الرسم أو السحب والإفلات.
بدءاً من Xcode 12، يدعم XCUITest اعتراض طلبات الشبكة من خلال XCTestExpectation وURLProtocol. وهذا يسمح باختبار التطبيق في وضع عدم الاتصال أو باستجابات خادم محاكاة دون تعديل كود التطبيق.
يتم تشغيل XCUITest في بيئات CI من خلال xcodebuild مع علامة test. للتشغيل المتوازي على عدة محاكيات، يُستخدم xcodebuild -testPlan مع تكوين التنفيذ المتوازي في مخطط Xcode. GitHub Actions وBitrise وJenkins لديها دعم مدمج لـ XCUITest.
لـ CI، يجب تكوين توقيع الكود وملفات التزويد وتحديد الوجهة (محاكي أو جهاز). لا تتطلب اختبارات 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 ارتباطاً وثيقاً بواجهة برمجة تطبيقات إمكانية الوصول من Apple، حيث أن البحث عن العناصر يعتمد على سمات إمكانية الوصول. اختبار إمكانية الوصول ليس مجرد طريقة للعثور على العناصر، بل هو أيضاً طريقة للتحقق من إمكانية وصول التطبيق للأشخاص ذوي الإعاقة. يمكن لـ XCUITest التحقق من accessibilityLabel وtraits وhints.
VoiceOver هو قارئ الشاشة من Apple للمستخدمين ضعاف البصر. يتيح XCUITest التحقق من: accessibilityLabel — هل تم وصف العنصر بنص واضح، accessibilityTraits — هل يتطابق نوع العنصر (زر، عنوان، صورة)، وaccessibilityHint — هل يقدم تلميحاً عن نتيجة الإجراء. هذه الفحوصات إلزامية للنشر في App Store، ويقوم XCUITest بأتمتتها كجزء من تشغيلات الانحدار.
بدءاً من Xcode 15، يدعم XCUITest الفحص المدمج لإمكانية الوصول من خلال XCTAttachment بنوع accessibilityAudit. يبلغ الاختبار تلقائياً عن العناصر ذات التباين غير الكافي والصور غير المسماة والسمات غير الصحيحة. وهذا يحل محل مفتش إمكانية الوصول اليدوي.
// تدقيق إمكانية الوصول في 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 قياس أداء واجهة المستخدم من خلال 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. هذه السيناريوهات حاسمة للتطبيقات ذات الروابط العميقة وحملات الدفع، حيث يلزم التحقق من المعالجة الصحيحة للاستدعاءات الخارجية.
للتنميط التفصيلي للأداء، يتكامل XCUITest مع Instruments. أثناء الاختبار، يمكن تشغيل تنميط Time Profiler أو Core Animation أو Leaks عبر XCTMetric. تُحفظ نتائج التنميط في التقرير وتكون متاحة للتحليل في Xcode. هذا مفيد بشكل خاص لتحسين وقت تشغيل التطبيق والتنقل بين الشاشات وأداء الرسوم المتحركة — وهي اختناقات نموذجية في تطبيقات iOS.
الأسئلة الشائعة
XCTest هو الإطار العام لجميع أنواع اختبارات Apple، بما في ذلك اختبارات الوحدة واختبارات الأداء. XCUITest هو امتداد فوق XCTest لاختبار واجهة المستخدم يضيف فئات XCUIApplication وXCUIElement وXCUIElementQuery للتفاعل مع الواجهة.
نعم، يدعم XCUITest كلاً من Swift وObjective-C. ومع ذلك، معظم أمثلة ووثائق Apple مكتوبة بلغة Swift. يمكن لمشاريع Objective-C استخدام XCUITest دون إعداد إضافي — الإطار متاح عبر @import XCTest.
يستخدم XCUITest واجهة برمجة تطبيقات إمكانية الوصول من Apple. يتم العثور على العناصر بواسطة accessibilityIdentifier وaccessibilityLabel والنوع (button وtextField وstaticText) أو الموضع في التسلسل الهرمي. كلما كانت سمات إمكانية الوصول أكثر دقة في كود التطبيق، كانت الاختبارات أكثر استقراراً.
نعم، يتضمن Xcode مسجلاً مدمجاً لاختبارات واجهة المستخدم. عند تشغيل اختبار في وضع التسجيل، يلتقط Xcode جميع التفاعلات مع الواجهة وينشئ كود Swift. يمكن تحسين الكود المسجل: إضافة تحقق واستخراج إلى Page Objects ووضع معاملات.
للتشغيل على جهاز حقيقي، يلزم: توصيل الجهاز بجهاز Mac وإضافته إلى Apple Developer Program وتكوين ملف التزويد وتوقيع التطبيق بشهادة تطوير وتحديد الجهاز كوجهة في xcodebuild.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا