iOS-Testing-Automation-Framework
روبوتات (robots)، ولوكيترات (locators) ذاتية الإصلاح (self-healing)، وفروقات screenshot، وتدقيقات إمكانية الوصول (accessibility audits)، وتقارير CI لـ XCUITest.
الترخيص: MIT
حزمة Swift بلا اعتماديات لاختبارات UI واختبارات الوحدة (unit tests) في تطبيقات iOS وmacOS. في XCUITest تضيف روبوتات، وعمليات بحث (lookups) تنجو من تغيير اسم accessibility identifier، وتدقيق إمكانية وصول، ومقارنة screenshot بصورة فرق (difference image)، وتقارير JUnit وMarkdown لـ CI. في أي test target، سواء Swift Testing أو XCTest، تضيف لقطات (snapshots) SwiftUI، وانتظارات polling، وretries، وspies، وبيانات اختبار مزروعة (seeded). القواعد التي تقف خلف هذه المساعدات (helpers) هي Swift صِرف ومغطّاة بـ unit tests؛ طبقة XCUITest تُختبَر عبر اختبارات UI لتطبيق مثال على محاكي iPhone.
الميزات
- روبوتات: صنف (class) واحد لكل شاشة، تنتظر إجراءاتها (actions) حتى يصبح العنصر hittable، وتظهر كخطوات مُسمَّاة في تقرير اختبار Xcode، وتُسجِّل الفشل عند سطر الاختبار
- عمليات بحث ذاتية الإصلاح: Locator وLocatorHealer يعودان إلى label أو placeholder أو أقرب identifier تشابهًا، ويسجّلان الإصلاح في HealingLog، ويرفضان التخمين بين تطابقين متساويين في الجودة
- تدقيق إمكانية وصول بخمس قواعد (labels مفقودة، صور بلا label، مناطق لمس أقل من 44 × 44 pt، labels تكرر نوع العنصر، identifiers مكرّرة)، ويمكن دمجه مع performAccessibilityAudit() من Apple
- مقارنة screenshot وSwiftUI snapshot مع ملفات baseline من نوع PNG، بهامش تفاوت (tolerance) ومناطق مُتجاهَلة وصورة فرق؛ baseline المفقود يُسجَّل والاختبار يفشل
- junit.xml وملخّص job بصيغة Markdown يُعاد كتابتهما بعد كل اختبار، مع إخفاء الأسرار المسجَّلة وأنماط بيانات الاعتماد (credentials)، إضافة إلى FlakinessAnalyzer لنتائج عدة تشغيلات CI
- typeSecret يلصق كلمات المرور بدل كتابتها، لذا لا تظهر أبدًا في عناوين activity الخاصة بـ XCTest نفسه؛ CI يبحث في result bundle عن كلمات مرور الاختبار
- مساعدات اختبار الوحدة: Wait.until، وRetryPolicy، وSpy وThrowingSpy، وFixtures مزروعة، وBenchmark
- بلا اعتماديات وبلا import لـ Swift Testing، لذا يُمكن ربط الحزمة في UI test bundles؛ 118 اختبار Swift Testing، و9 اختبارات UI في تطبيق المثال AutomationShowcase، وكتالوج DocC بأربع مقالات
البدء السريع
1import XCTest2import iOSTestingAutomationFramework3 4final class CounterRobot: Robot {5 var label: XCUIElement { app.staticTexts["counter.label"] }6 var button: XCUIElement { app.buttons["counter.button"] }7}8 9final class CounterUITests: XCTestCase {10 @MainActor11 func testTappingCounts() {12 let app = XCUIApplication()13 app.launch()14 15 let counter = app.on(CounterRobot.self)16 counter17 .tap(counter.button)18 .tap(counter.button)19 .assertLabel(of: counter.label, equals: "Tapped 2 times")20 }21}التثبيت
Xcode (File › Add Package Dependencies…)
1https://github.com/muhittincamdali/iOS-Testing-Automation-Framework.gitSwift Package Manager
1dependencies: [2 .package(url: "https://github.com/muhittincamdali/iOS-Testing-Automation-Framework.git", from: "2.0.0")3],4targets: [5 .testTarget(name: "YourAppTests", dependencies: [6 .product(name: "iOSTestingAutomationFramework", package: "iOS-Testing-Automation-Framework")7 ])8]لقطات الشاشة


الجدول الزمني
فُتح المستودع كـ framework لأتمتة الاختبار (test automation)؛ معظم الأسبوع التالي ذهب إلى الدوكيومنتيشن
صدر v1.0.0 بقائمة ميزات مستندة إلى README، بعد عمل على README وقالب issue وCI/CD بدأ في 28 يناير؛ استمرت تغييرات README والدوكيومنتيشن حتى 5 فبراير
استُبدلت المصادر بكود placeholder: محرّك visual regression لا يقارن شيئًا، ومدقِّق إمكانية وصول يطبع فقط، وtest target لم يعد يُترجَم (compile)
v2.0.0: أُعيد البناء على Swift 6 بقواعد مُختبَرة خلف كل مساعد UI، وتطبيق مثال باختبارات UI على CI، وDocC، ودمج الأجزاء المفيدة من iOSTestingTools