Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK

اختبار واجهات المستخدم Android مع Espresso

by
Difficulty:IntermediateLength:LongLanguages:

Arabic (العربية/عربي) translation by Muhammad Hakim Almadani (you can also view the original English article)

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

اسبرسو إطار اختبار لكتابة اختبارات UI في الروبوت. ووفقا لمستندات رسمية، يمكنك:

استخدام اسبرسو لكتابة مختصرة وجميلة، وواجهة المستخدم الروبوت موثوق بها الاختبارات.

1-لماذا استخدام اسبرسو؟

واحدة من المشاكل مع الاختبار اليدوي أنه يمكن أن تستغرق وقتاً طويلاً ومملاً لأداء. على سبيل المثال، لاختبار شاشة تسجيل دخول (يدوياً) في تطبيق الروبوت، سيكون لديك للقيام بما يلي:

  1. بدء تشغيل التطبيق.
  2. الانتقال إلى شاشة تسجيل الدخول.
  3. تأكيد إذا usernameEditText وpasswordEditText مرئية.
  4. اكتب اسم المستخدم وكلمة المرور في مجاله.
  5. تأكيد أيضا مرئياً على زر تسجيل الدخول ومن ثم انقر على زر تسجيل الدخول هذا.
  6. تحقق إذا كان يتم عرض وجهات نظر صحيحة عند ذلك تسجيل الدخول ناجحة أو فاشلة.

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

بعض المزايا للاختبار الآلي وتشمل ما يلي:

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

في هذا البرنامج التعليمي، سوف نتعلم عن اسبرسو إدماجه في مشروع "استوديو الروبوت". سوف نكتب اختبارات UI لشاشة تسجيل دخول ومن RecyclerView، وسوف نتعلم عن اختبار النوايا.

نوعية ليست فعل، عادة. — Pablo Picasso

2-الشروط اللازمة

ليتمكن من متابعة هذا البرنامج التعليمي، سوف تحتاج إلى:

  • فهم أساسي "الروبوت واجهات برمجة التطبيقات" الأساسية وKotlin
  • 3.1.3 Android Studio أو أعلى
  • Kotlin plugin 1.2.51 أو أعلى

يمكن الاطلاع على مشروع عينة (في كوتلين) لهذا البرنامج التعليمي على الريبو GitHub لدينا حتى تتمكن بسهولة من متابعة على طول.

3. إنشاء مشروع استوديو الروبوت

إطلاق النار حتى 3 استوديو الروبوت الخاص بك وإنشاء مشروع جديد بنشاط فارغة تسمى MainActivity. تأكد من التحقق من الدعم Include Kotlin support.

Create Android Project dialog

4. قم بإعداد اسبرسو وAndroidJUnitRunner

بعد إنشاء مشروع جديد، تأكد من إضافة التبعيات التالية من "مكتبة دعم اختبار الروبوت" في الخاص بك build.gradle (على الرغم من أن الفعل أدرجها "استوديو الروبوت" بالنسبة لنا). في هذا البرنامج التعليمي، ونحن نستخدم اسبرسو أحدث إصدار مكتبة 3.0.2 (حتى وقت كتابة هذا التقرير).

وأدرجنا أيضا عداء الأجهزة AndroidJUnitRunner:

Instrumentation أجهزة التي تدير JUnit3 و JUnit4 ضد حزمة الروبوت (تطبيق).

علما أن Instrumentation ببساطة فئة أساسية لتنفيذ التعليمات البرمجية للتطبيق الأجهزة.

إيقاف تشغيل الرسوم المتحركة

مزامنة اسبرسو، التي لا تعرف كيفية الانتظار للرسوم متحركة للانتهاء، يمكن أن يؤدي إلى فشل بعض الاختبارات – إذا كنت تسمح للرسوم المتحركة على جهاز الاختبار الخاص بك. لإيقاف تشغيل الرسوم المتحركة على جهاز الاختبار الخاص بك، انتقل إلى Setting > Developer Options وإيقاف جميع الخيارات التالية ضمن المقطع "رسم":

  • حجم إطار الرسوم المتحركة
  • مقياس الحركة الانتقالية
  • مقياس مدة الرسوم المتحركة

5-كتابة الاختبار الأول الخاص بك في اسبرسو

أولاً، نحن تبدأ التجارب على شاشة تسجيل دخول. هنا كيف يبدأ تدفق الدخول: يقوم المستخدم بتشغيل التطبيق، وتظهر الشاشة الأولى يحتوي على زر تسجيل دخول واحد. عند النقر فوق هذا الزر تسجيل Login، فإنه يفتح الشاشة LoginActivity. تحتوي هذه الشاشة على EditText اثنين فقط (حقول اسم المستخدم وكلمة المرور) وزر Submit.

هنا ما يبدو تخطيط AinActivity لنا مثل:

MainActivity layout

هنا ما يبدو تخطيط LoginActivity لنا مثل:

دعونا الآن كتابة اختبار للصف MainActivity. انتقل إلى الفئة الخاصة بك MainActivity، حرك المؤشر إلى اسم MainActivity، واضغط Shift-Control-T. حدد ...Create New Test في القائمة المنبثقة.

Create new test dialog

اضغط الزر موافق، وآخر يظهر الحوار. اختر الدليل androidTest وانقر على زر موافق مرة أخرى. لاحظ أنه نظراً لأننا نكتب على اختبار أجهزة (اختبارات محددة الروبوت SDK)، حالات الاختبار الموجودة في المجلد androidTest/java.

الآن، بنجاح إنشاء "استوديو الروبوت" فئة اختبار لنا. فوق اسم الفئة، يشمل هذا الشرح: (RunWith (AndroidJUnit4::class@.

ويعني هذا الشرح أن كافة الاختبارات في هذه الفئة هي الاختبارات الخاصة بالروبوت.

أنشطة الاختبار

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

علما أن الشرح @Rule يعني أن هذا قاعدة اختبار JUnit4. يتم تشغيل JUnit4 اختبار قواعد قبل وبعد كل أسلوب اختبار (المشروح مع @Test). في السيناريو الخاص بنا، نحن نريد لإطلاق MainActivity قبل كل أسلوب اختبار وتدميره بعد.

وأدرجنا أيضا @JvmField كوتلين التعليق التوضيحي. هذا ببساطة يرشد برنامج التحويل البرمجي لا تولد حاصل وواضعي للملكية، وبدلاً من ذلك فضح أنه كحقل جافا بسيط.

فيما يلي الخطوات الرئيسية الثلاث في كتابة إجراء اختبار اسبرسو:

  • ننظر للقطعة (مثل الزر أو TextView) الذي تريد اختباره.
  • إجراء واحد أو أكثر من الإجراءات على تلك القطعة.
  • التحقق من صحة أو تحقق لمعرفة ما إذا كانت تلك القطعة الآن في دولة معينة.

يمكن تطبيق الأنواع التالية من شروح للأساليب المستخدمة داخل فئة اختبار.

  • @BeforeClass: وهذا يشير إلى أن يجب أن تنفذ أسلوب ثابت يتم تطبيق هذا الشرح لمرة واحدة وقبل كافة الاختبارات في الفئة. وهذا يمكن استخدام، على سبيل المثال، إعداد اتصال بقاعدة بيانات.
  • @Before: يشير إلى أن الأسلوب أرفقت هذا الشرح يجب أن تنفذ قبل كل أسلوب اختبار في الفئة.
  • @Test: وتشير إلى أنه يجب تشغيل الأسلوب هذا الشرح يتم إرفاقه كحالة اختبار.
  • @After: وتشير إلى أنه يجب تشغيل الأسلوب هذا الشرح يتم إرفاقه بعد كل أسلوب اختبار.
  • @AfterClass: وتشير إلى أنه يجب تشغيل الأسلوب أرفقت هذا الشرح بعد أن تم تشغيل كافة أساليب الاختبار في الفئة. هنا، نحن عادة إغلاق الموارد التي تم فتحها في @BeforeClass.

العثور ()onView "باستخدام طريقة View"

في ملف التخطيط MainActivity لدينا، لدينا فقط القطعة واحدة — على زر تسجيل Login. دعونا اختبار سيناريو حيث سوف تجد هذا الزر مستخدم وانقر فوقه.

للبحث عن القطع في اسبرسو، نجعل استخدام أسلوب ثابت ()onView (بدلاً من ()findViewById). نوع المعلمة ونحن توريد إلى ()onView هو المنظر. علما بأن Matcher API لا يأتي من "الاستراحة الروبوت" لكن بدلاً من ذلك من المشروع هامكريست. Hamcrest Project على المنظر المكتبة من داخل المكتبة اسبرسو ونجحنا عبر جرادلي.

سيؤدي ((onView (withId (R.id.btn_login إلى عرض ViewInteraction من أجل طريقة View له معرف R.id.btn_login. في المثال أعلاه ، استخدمنا ()withId  للبحث عن عنصر واجهة مستخدم ذي معرف معين. المطابقة الأخرى التي يمكننا استخدامها هي:

  • ()withText: إرجاع المنظر الذي يطابق TextView استناداً إلى قيمة خاصية النص.
  • ()withHint: إرجاع المنظر الذي يطابق TextView استناداً إلى قيمة الخاصية تلميح.
  • ()withTagKey: إرجاع المنظر الذي يطابق View استناداً إلى مفاتيح العلامة.
  • withTagValue(): إرجاع المنظر الذي يطابق View استناداً إلى قيم الخصائص العلامة.

أولاً، دعونا اختبار لمعرفة إذا كان فعلا هو عرض الزر على الشاشة.

هنا، فقط نؤكد إذا كان الزر مع معرف معين (R.id.btn_login) مرئية للمستخدم، حيث أننا استخدم الأسلوب check() لتأكيد إذا رأي الكامنة وView دولة معينة — في هذه الحالة، إذا كان مرئياً.

ترجع طريقة ()matches الاستاتيكية إلى ViewAssertion العام الذي يؤكد وجود طريقة عرض في التسلسل الهرمي لطريقة العرض ومطابقتها بمطابقة العرض المحددة. يتم إرجاع ذلك المطابق مناظر معينة بواسطة استدعاء isDisplayed (). كما اقترح باسم الأسلوب، هو isDisplayed() المنظر الذي يتطابق مع وجهات View التي يتم عرضها حاليا على الشاشة للمستخدم. على سبيل المثال، إذا كنا نريد للتحقق من تمكين زر، ونحن ببساطة تمرير isEnabled() matches().

ماتشيرس رأي شعبية أخرى ونحن يمكن أن تنتقل إلى الأسلوب matches():

  • hasFocus(): إرجاع المنظر الذي يتطابق مع وجهات View التي تركز حاليا.
  • isChecked(): إرجاع المنظر الذي يقبل إذا وفقط إذا الرأي هو CompoundButton (أو نوع فرعي من)، وهي في الحالة المحددة. على العكس من هذا الأسلوب هو isNotChecked().
  • isSelected(): إرجاع المنظر الذي يتطابق مع وجهات View التي تم تحديدها.

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

MainActivityTest class

الصيحة! اجتاز الاختبار!

Android Studio test result toolbar

تنفيذ إجراءات على طريقة العرض

كائن ViewInteraction التي يتم إرجاعها بواسطة استدعاء onView()، ونحن يمكن محاكاة الإجراءات التي يمكن لمستخدم إنجازها على القطعة. على سبيل المثال، نحن محاكاة إجراء انقر ببساطة استدعاء الأسلوب click () ثابت داخل الفئة ViewActions. هذا يؤدي إلى إرجاع كائن ViewActions بالنسبة لنا.

وتقول الوثائق أن ViewAction:

مسؤولة عن تنفيذ تفاعل على عنصر عرض معين.

ونحن إجراء حدث النقر ب perform() الاستدعاء الأول. هذا الأسلوب يقوم بتنفيذ الإجراءات معينة في طريقة العرض المحددة بالمنظر طريقة العرض الحالية. علما بأن نحن يمكن أن تمر عمل واحد أو قائمة بالإجراءات (أعدم في النظام). وهنا، نحن أعطاه click (). الإجراءات الأخرى الممكنة:

  • typeText() تقليد كتابة نص في EditText.
  • clearText() لمحاكاة النص المقاصة في EditText.
  • doubleClick() لمحاكاة النقر نقراً مزدوجاً فوق طريقة View.
  • longClick() تقليد طويل في النقر فوق طريقة View.
  • scrollTo() لمحاكاة التمريرScrollView إلى طريقة View معينة تظهر.
  • swipeLeft() لمحاكاة الضرب من اليمين إلى اليسار عبر مركز العمودي لطريقة View.

يمكن الاطلاع على العديد من عمليات المحاكاة أكثر داخل الفئة ViewActions clas.

التحقق من صحة مع تأكيدات عرض

دعونا إكمال الاختبار، للتحقق من أنه يتم عرض الشاشة LoginActivity عندما يتم النقر فوق الزر تسجيل Login. على الرغم من أننا رأينا بالفعل كيفية استخدام check() على ViewInteraction، دعونا استخدامها مرة أخرى، يمر ViewAssertion آخر.

داخل ملف تخطيط LoginActivity، وبصرف النظر عن EditText وزر، ولدينا أيضا TextView مع R.id.tv_login معرف. حتى نقوم ببساطة بتحقق للتأكد من أن TextView مرئية للمستخدم.

الآن يمكنك تشغيل الاختبار مرة أخرى!

Android Studio test result toolbar

يجب أن تجتاز الاختبارات الخاصة بك بنجاح إذا اتبعت جميع الخطوات بشكل صحيح.

هنا ما حدث أثناء عملية تنفيذ تجاربنا:

  1. بدأت MainActivity استخدام الحقل activityRule.
  2. تم التحقق مما إذا كان زر تسجيل الدخول (R.id.btn_login) مرئيًا (isDisplayed ()) للمستخدم.
  3. محاكاة عمل انقر فوق (click()) على هذا الزر.
  4. التحقق من إذا LoginActivity كان تظهر للمستخدم بالتحقق من إذا كان مرئياً TextView مع معرف R.id.tv_login في LoginActivity.

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

6-اختبار الشاشة LoginActivity

هنا هو أن LoginActivity.kt:

في التعليمات البرمجية أعلاه، هو إذا كان اسم المستخدم الذي تم إدخاله هو "تشيكي" وكلمة المرور "كلمة المرور"، ثم تسجيل الدخول بنجاح. لأي مدخلات أخرى، فشل. الآن دعنا نكتب على اختبار اسبرسو لهذا!

اذهب إلى LoginActivity.kt، حرك المؤشر إلى اسم LoginActivity، واضغط Shift-Control-T.  حدد ....Ceate News Test في القائمة المنبثقة. اتبع نفس العملية كما فعلنا ل MainActivity.kt، وانقر فوق الزر موافق.

هذه فئة اختبار مشابهة جداً لأن أول واحد. إذا أننا تشغيل الاختبار، يتم فتح شاشة LoginActivity لدينا. يتم كتابة اسم المستخدم وكلمة المرور في الحقول R.id.et_username و R.id.et_password على التوالي. بعد ذلك، اسبرسو سوف انقر على زر الإرسال (R.id.btn_submit). أنها ستنتظر حتى يمكن العثور على طريقة View باستخدام معرف R.id.tv_login مع نص القراءة النجاح.

7-اختبار RecyclerView

RecyclerViewActions هو الفئة التي تعرض مجموعة من APIs للعمل على RecyclerView. RecyclerViewActions هو جزء من قطعة أثرية منفصلة داخل القطع الأثرية التي espresso-contrib ، والتي يجب إضافتها أيضًا إلى build.gradle:

علما بأن هذه القطع الأثرية كما يحتوي API لواجهة مستخدم اختبار درج الملاحة من خلال DrawerActions وDrawerMatchers.

بالنقر فوق عنصر في أي موضع في RecyclerView، ونحن استدعاء actionOnItemAtPosition(). علينا أن نعطي من نوع عنصر. وفي حالتنا، هو البند فئة ViewHolder داخل RandomAdapter لدينا. يأخذ هذا الأسلوب أيضا في اثنين من المعالم؛ الأول هو الموقف، والثاني هو العمل (ViewActions.click()).

RecyclerViewActions الأخرى التي يمكن القيام بها:

  • actionOnHolderItem(): يقوم ViewAction في طريقة view يقابل viewHolderMatcher. وهذا يسمح لنا بحيث تتطابق مع أنه حسب ما ورد داخل فيViewHolder بدلاً من الموقف.
  • scrollToPosition(): إرجاع ViewAction الذي يمرر RecyclerView إلى موضع.

التالي (بمجرد "إضافة ملاحظة شاشة" يتم فتح)، سوف ندخل لدينا نص المذكرة وحفظ الملاحظة. لا نحتاج إلى الانتظار لشاشة جديدة لفتح – اسبرسو سيتم القيام بذلك تلقائياً بالنسبة لنا. أنه ينتظر حتى يمكن العثور على طريقة عرض باستخدام معرف R.id.add_note_title.

8-اختبار النوايا

اسبرسو يجعل استخدام قطعة أثرية أخرى تسمى espresso-intents لاختبار النوايا. هذه القطع الأثرية هو مجرد امتداد اسبرسو يركز على التحقق من الصحة والاستهزاء من النوايا. دعونا ننظر على سبيل مثال.

أولاً، علينا أن سحب المكتبة espresso-intents في مشروعنا.

ويمتد IntentsTestRule ولي ActivityTestRule، حيث كلا لديهم سلوكيات مشابهة. هنا ما تقول الوثيقة:

هذه الفئة هي امتداد ActivityTestRule، الذي يهيئ اسبرسو النوايا قبل كل اختبار المشروح مع Test والنشرات اسبرسو-المقاصد بعد كل اختبار تشغيل. سيتم إنهاء هذا النشاط بعد كل اختبار، ويمكن استخدام هذه القاعدة بنفس الطريقة ActivityTestRule.

الميزة التفريق الرئيسي أن لديها وظائف إضافية لاختبار startActivity() و startActivityForResult() مع يسخر وكعوب الروتين.

نحن الآن ذاهبون لاختبار سيناريو حيث سوف انقر فوق مستخدم على زر (R.id.btn_select_contact) على الشاشة لاختيار جهة اتصال من قائمة جهات الاتصال بالهاتف.

هنا نحن نستخدم intending() من مكتبة espresso-intents إعداد كعب روتين مع استجابة صورية لطلبنا ACTION_PICK. هنا ما يحدث في PickContactActivity.kt عندما ينقر المستخدم فوق الزر مع معرف R.id.btn_select_contact لاختيار جهة اتصال.

intending() يأخذ في Matcher الذي يتوافق مع المقاصد التي ينبغي توفير استجابة stubbed. وبعبارة أخرى، يعرف Matcher الذي طلب كنت مهتما في لالاستئصال. وفي حالتنا، نبذل استخدام hasAction() (أسلوب مساعد في InterMatchers) للعثور على طلبنا ACTION_PICK. ونحن ثم استدعاء respondWith()، الذي يحدد النتيجة ل onActivityResult(). وفي حالتنا، قد النتيجة Activity.RESULT_OK، محاكاة للمستخدم اختيار جهة اتصال من القائمة.

نحن محاكاة ثم النقر فوق الزر تحديد جهة الاتصال، التي تدعو إلى startActivityForResult(). علما بأنه أرسل لنا كعب الاستجابة صورية ل onActivityResult().

أخيرا، علينا استخدام الأسلوب المساعد intended() لمجرد التحقق من صحة أن وجهت دعوات إلى startActivity() و startActivityForResult() مع الحق في المعلومات.

الاستنتاج

في هذا البرنامج التعليمي، تعلمت كيف يمكن بسهولة استخدام إطار اختبار اسبرسو في مشروع "استوديو الروبوت" الخاص بك لأتمتة سير العمل اختبار الخاص بك.

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

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.