Kaspresso: إطار autotest الذي كنت تنتظره

كل من شارك أو شارك في عمليات الاختبار التلقائي لنظام Android يعرف ما هو الألم.
تتعب من حجم المهام والمشاكل حتى لا تساعد هذه الإجازة. الناس حتى استقال بسبب autotests.

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

يجتمع: Kaspresso - إطار autotest كنت تنتظر!



لاحظت على الفور أن هناك مقطعين فيديو عالي الجودة على الشبكة مخصصين لـ Kaspresso و AdbServer (مساعد لـ Kaspresso ، ولكن في الوقت نفسه ، مشروع قوي ومستقل):

1. ديمتري موفشان ، يوجين ماتسيوك - كيفية البدء في كتابة الاختبارات التلقائية وليس بالجنون
2. إيجور كورنيكوف - الشيء الوحيد الذي تحتاجه لاختبار واجهة المستخدم

يصفون بالتفصيل تاريخ إنشاء المكتبات: كيف انتقلنا من حل مشكلة إلى أخرى ، وما حدث في النهاية. أنا أوصي به بشدة.

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

لماذا نحن بحاجة إلى إطارنا الخاص؟


يسأل كل مطور يبدأ كتابة الاختبارات التلقائية أسئلة لا محالة:

  1. كيف تبدأ كتابة الاختبارات الذاتية؟
  2. ما الأدوات للاختيار؟
  3. ماذا تفعل إذا لم يكن هناك أداة ضرورية؟
  4. ما هي أفضل الممارسات؟

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

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

ماذا نريد من الاطار؟


دعونا تكشف توقعاتنا من الإطار قليلا.

قراءة جيدة


بشكل افتراضي ، تتوفر مكتبة Espresso فقط على نظام Android. بالطبع ، هناك Appium + Cucumber ، والذي يسمح لك نظريًا بكتابة اختبارات على منصتين في وقت واحد. لكن المجتمع يتحرك بثقة نحو الأداة الأولى. لن أصف جميع إيجابيات وسلبيات المكتبات المذكورة أعلاه: الشبكة مليئة بالمعلومات حول هذا الموضوع. هنا ، على سبيل المثال ، أحد الروابط الحديثة نسبيًا: Appium vs Espresso. ماذا تختار وكيف تستخدم؟

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

@Test fun espressoTest() { onView(allOf(allOf(withId(R.id.espresso), isDescendantOfA(withId(R.id.coffee_variates))), isDescendantOfA(withId(R.id.content)))) .check(matches(withEffectiveVisibility(View.VISIBLE))) } 

عليك أن تفكر في معرفة ذلك ، أليس كذلك؟

قدم لنا آلهة تايلاند وأستراليا مكتبة كاكاو ، والتي يمكنك من خلالها أن تفهم في لمحة ما يحدث في الاختبار الخاص بك. هنا هو نفس الرمز ، ولكن مع Kakao:

 @Test fun kakaoTest() { mainScreen { myView.isVisible() } } 

أفضل بكثير. لكن الآن تخيل أنك أتمتة حالة اختبار كاملة. كيف سيكون الرمز؟

 @RunWith(AndroidJUnit4::class) class OpenHomeScreenTest: TestCase() { @Test fun test() { MainScreen() { homeButton.click() } HomeScreen() { title { isVisible() hasAnyText() } } } } 

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

 @RunWith(AndroidJUnit4::class) class OpenHomeScreenTest: TestCase() { @Test fun test() { step(“1. Open Home screen”) { MainScreen() { homeButton.click() } } step(“2. Check Home title”) { HomeScreen() { title { isVisible() hasAnyText() } } } } } 

موافق ، يبدو مختلفًا تمامًا.

استقرار


فشل أي مكتبة لاختبارات واجهة المستخدم. يمكن تنفيذ الإجراء نفسه 50 مرة بنجاح ، وفي الاستراحة 51 دون سبب واضح. وعلى المدى 52 ، كل شيء على ما يرام مرة أخرى. ومثل هذه "التقليب" يمكن أن تفسد أعصابك بشكل لائق.

لقد فكرنا ، لماذا لا نحاول اعتراض كل تصرفات Kakao-Espresso ، وقمنا بالفعل بإضافة سلوك إضافي هناك يهدف إلى معالجة مثل هذه الأخطاء العشوائية.

هكذا ولد الإصدار 2.1 من مكتبة Kakao ، مما يسمح لك بالاندماج في جميع مكالمات Espresso.

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

على وجه التحديد ، كجزء من المعركة ضد الاختبارات غير المستقرة - إذا أخفقت بعض تصرفاتك ، فستحاول Kaspresso:

  • Doskrollit. ربما وجهة نظرك هي ببساطة غير مرئية على الشاشة.
  • إزالة الحوار النظام الذي يمكن أن يأتي من الله يعرف أين.
  • كرر مكالمة مكسورة لمدة ثانيتين.

من خلال هذه الخطوات ، نحل المشكلة تمامًا من خلال الاختبارات غير المستقرة!

تسجيل


واحدة من المشاكل الرئيسية التي تصاحب الاختبارات التلقائية هي عدم وجود تسجيل واضح ، وهذا لا يكفي بشكل خاص عند تعطل الاختبار. الجلوس وتساءل ماذا وكيف سقطت هنا.

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

دعنا نلقي نظرة على مثال:





بشكل افتراضي ، يقوم Kaspresso بتسجيل جميع أفعالك ، ويحدد كل خطوة من الاختبار ، ويعرض وقت التنفيذ ، إلخ.

Adb الكامل في اختبارات اسبرسو


في البداية ، لا يتوفر adb في اختبارات Espresso. نعم ، هناك قذيفة بنك التنمية الآسيوي ، ولكن هناك وظائف أقل بكثير مما كانت عليه في بنك التنمية الآسيوي الكامل. ولكن هناك الكثير من الأشياء التي يمكن أن تأتي في متناول اليد في الاختبارات.

لقد أنشأنا مكتبة AdbServer منفصلة والتي ستعود adb الكامل إلى الاختبارات الخاصة بك! تفاصيل الفيديو أعلاه كيف قاتلنا وما مررنا به ( واحد واثنان ).

العمل مع نظام التشغيل أندرويد


تفاصيل الاختبارات في Kaspersky Lab هي أنه يتعين علينا العمل كثيرًا مع OS Android: إعداد بعض الإعدادات ، وتحميل الملفات إلى النظام ، إلخ. كل هذا دفعنا إلى توحيد جميع أعمالنا مع النظام ، وإنشاء مجموعة من الواجهات الواضحة ، يمكن الوصول إليها من خلال نقطة دخول واحدة من فئة الجهاز .

ما هي هذه الواجهات وماذا يفعلون؟ اسمحوا لي أن أقدم لكم شريحتين من عرض إيغور كتوضيح:









الوثائق هنا .

تحت الغطاء ، يتم استخدام AdbServer و UiAutomator بشكل رئيسي.
ولكن! إذا لم تكن راضيًا فجأة عن تنفيذ واجهة ، فيمكنك ضبط التنفيذ من خلال Configurator.

لقطة شاشة لـ DocLoc (التوثيق والتعريب)


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

كل هذا يسمح لك بإخراج Kaspresso من الصندوق. اقرأ المزيد في الوثائق .

العمارة وأفضل الممارسات


كانت إحدى المهام الرئيسية لـ Kaspresso إنشاء مثل هذا dsl الذي سيدفعك إلى هندسة الاختبار الصحيحة وكتابتها الصحيحة.

تم كسر العديد من النسخ حول هذا الموضوع ، لأنك ، للأسف ، لن تجد مثل هذه القواعد في أي مكان. أكثر ما يمكنك العثور عليه هو مقالات حول كائن الصفحة .

لذلك ، لم ندخر جهداً وأبرزنا هذه المشكلات في الوثائق وفي الفيديو مرة واحدة وفي الفيديو الثاني .
بالإضافة إلى ذلك ، كتبت ساشا بلينوف مقالة ممتازة حول Kotlin DSL والاختبارات الأنيقة . يتم توفير dsl الموصوفة في المقال من قبل Kaspresso.

مرة أخرى في Mobius ، اقترحنا خيارًا حول كيفية تسريع تأثير الاختبارات الذاتية ودمجها بسرعة في PullRequest ، متجاوزًا مشاكل البنية التحتية التي لا مفر منها. نتحدث عن هذا بمزيد من التفصيل هنا .

كيفية الاتصال وتكوين Kaspresso إذا كان لديك بالفعل العديد من الاختبارات


سحر الرئيسي هو أنه إذا كان لديك بالفعل العديد من الاختبارات المكتوبة في Kakao وتريد تطبيق Kaspresso ، فإنك لا تحتاج إلى إعادة كتابة أي شيء! فقط ارث فئات الاختبار الخاصة بك من فئة TestCase الخاصة. وهذا كل شيء!

كان:

 @RunWith(AndroidJUnit4::class) class OpenHomeScreenTest { private val mainScreen = MainScreen() private val homeScreen = HomeScreen() @get:Rule val activityTestRule = ActivityTestRule(MainActivity::class.java, true, false) @Test fun test() { ... } } 

أصبح:

 @RunWith(AndroidJUnit4::class) class OpenHomeScreenTest : TestCase() { private val mainScreen = MainScreen() private val homeScreen = HomeScreen() @get:Rule val activityTestRule = ActivityTestRule(MainActivity::class.java, true, false) @Test fun test() { ... } } 

وإذا كنت لا تحب الميراث ، استخدم فئة TestRule مماثلة.

كما ذكرنا من قبل ، Kaspresso هو إطار مرن وقابل للتخصيص للغاية. تتوفر جميع الإعدادات من خلال فئة Kaspresso التي تحمل الاسم نفسه.

الإعداد الافتراضي هو الافتراضي. إذا كنت ترغب في تخصيص شيء ما ، فسيبدو مثل هذا:

 @RunWith(AndroidJUnit4::class) class OpenHomeScreenTest : TestCase( Kaspresso.Builder.default().apply { viewBehaviorInterceptors.add(MyInterceptor()) flakySafetyParams.timeoutMs = 1_000 } ) { private val mainScreen = MainScreen() private val homeScreen = HomeScreen() @get:Rule val activityTestRule = ActivityTestRule(MainActivity::class.java, true, false) @Test fun test() { ... } } 

هذا هو ، Kaspresso.Builder متاح من خلال منشئ TestCase ، حيث يمكنك تعيين جميع الإعدادات التي تحتاج إليها. تتم كتابة تفاصيل حول المكون في الوثائق .

خطط فورية


في المستقبل القريب جدًا ، نخطط لإضافة الأشياء التالية:

عرض خطوات الاختبار في Allure (مرحبًا يا رفاق من HeadHunter)


من خلال اعتراض خاص ، نقوم بإعداد البيانات لماراثون . هذا يتيح لنا أن نرى تقارير جاذبية من الطبيعة التالية:



التفاصيل في العلاقات العامة رقم 4

PS PR موجود بالفعل في الإصدار 1.0.1 ، والآن نحن نستعد للعلاقات العامة المقابلة في الماراثون .
PSS. هناك فكرة لإرفاق جزء معين من السجل بكل خطوة ، وإضافة لقطة شاشة إلى الخطوة "الساقطة".

اختبار البرامج النصية الترقية


غالبًا ما يكون من الضروري التحقق من صحة ترقيات التطبيق. نعم ، يمكن نقل بعض الفحوصات إلى اختبارات الوحدة. لكننا نود أن نكون هادئين للتطبيق بأكمله ككل.

لسوء الحظ ، من المستحيل القيام بذلك على Espresso ، لأنه إذا قمنا بإعادة تثبيت apk الذي تم اختباره ، فسيفشل الاختبار. يمكنك محاولة الخداع بطريقة أو بأخرى مع العداء ، لكن من الصعب بالنسبة لي أن أتخيل كيف ستبدو هذه التحسينات ومدى ثباتها.
لذلك ، في Kaspresso ، نعد حلاً لهذه المشكلة ، استنادًا إلى UiAutomator. ومع ذلك ، في الجزء العلوي ، سيكون لديك كل نفس dsl المألوف ، والذي يشبه إلى حد بعيد Kakao وبنفس الدعم للتداخل.

روابط مفيدة


Kaspresso
AdbServer
الدردشة ، والتي سنكون سعداء دائما للرد على جميع أسئلتك

شكر


شكر خاص لكل من شارك في تطوير المشروع.
كان من الصعب جدا ، ولكن لعنة بارد!





بدلا من الاستنتاج


نعتقد أن Kaspresso و AdbServer ستجعل حياتك أفضل.
نرحب بتعليقاتكم وتوصياتكم و Yishuyam و PulRequest!
ولا تنسى أن تضع علامة النجمة ، من فضلك!

PS وفي النهاية استطلاع صغير =)

Source: https://habr.com/ru/post/ar467617/


All Articles