لقطات شاشة iOS تلقائية باستخدام XCTestplan و Xcode 11

هناك العديد من تطبيقات الهاتف المحمول في Raiffeisenbank التي يجب أن تعمل على مجموعة متنوعة من الأجهزة وأنظمة التشغيل ، لذلك نحاول أتمتة العمليات الروتينية في الاختبار. بدت لنا هذه المقالة مفيدة ، وقررنا ترجمتها. foto source: unsplash.com إذا كان تطبيقك متعدد اللغات وعالميًا ومصممًا للأجهزة المختلفة ، فيمكنك قضاء الكثير من الوقت في إنشاء لقطات شاشة لكل تكوين. تخيل أن لديك أربع لغات ، ودعم iPad و iPhone وتحتاج إلى حفظ 4 شاشات لكل منها - هذه 32 لقطة شاشة. يجب أن تكون العملية مؤتمتة حتى لا تضيع الوقت في كل مرة يتم فيها تحديث الواجهات.






تتيح لنا أداة XCTestPlan ، التي ظهرت في Xcode 11 ، إنشاء العديد من التكوينات للاختبارات. في الوقت الحاضر ، يتم استخدام التكوينات في الغالب لتحديد كيفية تشغيل الاختبارات ، بما في ذلك اختيار اللغة للتطبيق. في هذه المقالة ، ستتعلم كيفية استخدام XCTestPlan لأتمتة لقطات الشاشة.

قم بتشغيل XCTestplan


لنقم بإعداد هدف UITests منفصل لأتمتة إنشاء لقطات الشاشة ، وهو أمر مفيد بشكل خاص إذا كنت لا تخطط لتشغيل اختباراتك الرئيسية باستخدام هذه التكوينات. لإنشاء هدف جديد ، حدد ملف -> جديد -> الهدف وقم بإنشاء حزمة اختبار واجهة مستخدم جديدة . بعد ذلك ، تحتاج إلى إضافة خطة XCTestplan جديدة إلى هذا الهدف. للقيام بذلك ، يمكنك إما استخدام قائمة المنتجات -> خطة الاختبار -> خطة اختبار جديدة ، أو في محرر المخطط ، حدد تحويل لاستخدام خطط الاختبار . إذا قمت بذلك من خلال القائمة ، فأنت بحاجة إلى التأكد من وجود الهدف الجديد في علامة التبويب `اختبار`.

نظرًا لأننا نريد تهيئة إعدادات اللغة فقط ، فيمكننا ترك الإعدادات المشتركة دون تغيير وإضافة تكوين جديد لكل لغة ندعمها. هذا ما تبدو عليه إعدادات تطبيق يدعم اللغة الإنجليزية والألمانية والفرنسية:

صورة

هذا هو كل ما يلزم من إعداد وإطلاق XCTestplan.

أتمتة لقطة الشاشة


لن تختلف اختبارات واجهة المستخدم التي تنشئ لقطات الشاشة عمليا عن اختباراتك المعتادة إلا أنها ستنشئ مرفقات. يمكنك أيضًا إضافة اختبارات XCTAssert حتى تفشل الاختبارات إذا حدث خطأ ما.

نقطة أخرى مهمة: قد تحتاج إلى الانتظار للحصول على التوقعات في حالة عدم جاهزية واجهة المستخدم الخاصة بك في الوقت الذي يتم فيه التقاط لقطة الشاشة ( إظهار / إخفاء لوحة المفاتيح ، إكمال الرسوم المتحركة).

فيما يلي مثال على جميع طرق المساعدة:

func testScreenshots() {
    let app = XCUIApplication()
    let searchButton = app.buttons["search"]
    searchButton.tap()
    
    let keyboard = app.keyboards.firstMatch
    waitForExistence(of: keyboard)
    app.typeText("Cupertino")
    add(takePromoShot(name: "Search"))
    
    let firstResult = app.cells.firstMatch
    firstResult.tap()
    waitForDisappearance(of: keyboard)
    add(takePromoShot(name: "Result"))
}

func waitForExistence(of element: XCUIElement) {
    let predicate = NSPredicate(format: "exists == TRUE")
    expectation(for: predicate, evaluatedWith: element, handler: nil)
    waitForExpectations(timeout: 5.0, handler: nil)
}

func waitForDisappearance(of element: XCUIElement) {
    let predicate = NSPredicate(format: "exists == FALSE")
    expectation(for: predicate, evaluatedWith: element, handler: nil)
    waitForExpectations(timeout: 5.0, handler: nil)
}

func takePromoShot(name: String) -> XCTAttachment {
    let lang = Locale.preferredLanguages[0]
    let screenshot = XCUIScreen.main.screenshot()
    let attachment = XCTAttachment(screenshot: screenshot)
    attachment.lifetime = .keepAlways
    attachment.name = "\(lang)-\(name)"
    return attachment
}

انتبه لأحدث ميزة. يأخذ اسم اللقطة ويضيف معرف اللغة ويأخذ لقطة شاشة ويعيد XCTAttachment بقيمة معلمة .keepAlways . هذا مهم لأنه بشكل افتراضي ، يتم حذف لقطات الشاشة التي تم التقاطها أثناء الاختبارات إذا نجحت الاختبارات. يعد Lifiteme معلمة مهمة لأنه يضمن حفظ لقطة الشاشة بعد اكتمال الاختبار. أثناء اختبارات واجهة المستخدم ، يتم أخذ لقطات الشاشة باستمرار. وهي مفيدة جدًا عندما تحتاج إلى تحديد سبب ومتى سقط الاختبار ؛ ولكن بشكل افتراضي ، سيتم حذف لقطات الشاشة إذا نجحت الاختبارات. وبالتالي ، عندما ينجح testScreenshots () ، سيكون لديك فقط لقطات الشاشة الضرورية.

شريط الحالة المعتاد


يفضل معظم المطورين رؤية شريط الحالة في الوقت المناسب وإشارة كاملة للشبكة وتفاصيل أخرى على لقطات الشاشة الخاصة بهم. في Xcode 11 ، أصبح هذا أسهل. هناك أداة مساعدة xcrun simctl status_bar ، والتي تسمح لك بتحديد هذه الإعدادات. يمكن إضافة ذلك على أنه مرحلة البناء :

xcrun simctl status_bar booted override --time 9:41 --operatorName ' ' --cellularMode active --cellularBar 4 --wifiBars 3 --batteryState charged

بعد هذا الأمر ، سيبدو شريط الحالة كما هو الحال في المواد التسويقية لشركة Apple. لسوء الحظ ، لن يعمل الفريق على جهاز حقيقي ، فقط في جهاز محاكاة. وتجدر الإشارة أيضًا إلى أنه يجب تشغيل جهاز المحاكاة الذي تستخدمه قبل بدء الاختبارات لجمع لقطات الشاشة.

جمع لقطات الشاشة الناتجة


الآن يمكننا تشغيل اختبارات واجهة المستخدم لدينا. عندما يمر ، سنرى النتائج في Report Navigator في Xcode. ستكون هناك أيضًا اختبارات تحتوي على إجراءات مجمعة حسب تكوينات اللغة. يتم تمييز الإجراءات التي تحتوي على مرفقات بمشبك ورق. يمكن فتح الصور نفسها في QuickLook .

صورة

يمكن أن يستغرق جمع كل الصور الناتجة بشكل منفصل الكثير من الوقت ، خاصة إذا كان تطبيقك يدعم العديد من اللغات. لسوء الحظ ، لا تظهر هذه المرفقات بصيغة png أو jpg بين نتائج الاختبار (تغيير آخر في Xcode 11). ولكن يمكنك تحليل نتائج الاختبار والعثور على JSON الذي يشير إلى المرفقات الحقيقية ويجمعها. يمكن القيام بذلك باستخدام الأداة المساعدة xcparse.. يتم تثبيته باستخدام Homebrew ويتم تشغيله بواسطة الأمر:

xcparse screenshots /path/to/Test.xcresult /path/to/outputDirectory

ستقوم العلامات الإضافية بتجميع الملفات حسب الجهاز أو نظام التشغيل أو التكوين. تحتوي أسماء ملفاتنا على معرف لغة ، لذلك يمكنك ببساطة فرزها بالاسم.

استنتاج


لقد سمح لنا النهج الموصوف بالفعل بتوفير الوقت الكافي ، خاصة في الحالات التي كان هناك فيها متطلبات لدعم الجهاز بدقة جديدة أو تم تحديث الواجهة بشكل كبير. في WWDC20 ، أود أن أرى اختيار الأجهزة كجزء من تكوين XCTestplan ، ولكن في الوقت الحالي ، عليك أن تختار يدويًا أو تستخدم برنامجًا نصيًا يجمع لقطات الشاشة الضرورية في AppStore.

All Articles