7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Creative Coding

دليل المبتدئين لاختبار الوحدة: بناء البرنامج المساعد للتجارب 

Scroll to top
Read Time: 10 mins

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

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

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


منهجية اختبار الوحدة 

عندما يتعلق الأمر بالاختبار ، هناك طريقتان بوجه عام للقيام بذلك: 

  • اكتب اختباراتك ، ثم اكتب رمزًا لتجربة اختباراتك 
  • اكتب الكود ، ثم اكتب الاختبارات التي تمر 

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

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

مع أخذ ذلك في الاعتبار ، سوف نبني بهذه المنهجية البسيطة 

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

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


بناء البرنامج المساعد للتجارب 

عند هذه النقطة ، حان الوقت لبدء كتابة بعض التعليمات البرمجية ؛ ومع ذلك ، على عكس معظم المشاريع ، لن نقفز إلى الشفرة الخاصة بـ WordPress حتى الآن. بدلاً من ذلك ، سنقوم بإعارة صف اختبار الوحدة لدينا.  If you've structured your plugin's directory based on what we shared in the first post or how we've configured it on GitHub, then you should have a hello_reader_tests.php file located in your tests/wordpress-tests directory.  ليس عليك اتباع هذه المنظمة ، بالطبع ، ولكنها ستساعد في التقدم خلال المشروع. 

دعونا نمنع فئة اختبار الوحدة 

الآن ، حاول تشغيل الاختبار باستخدام المحطة باستخدام وحدة PHP.  بافتراض أنك تقوم بتشغيل وحدة PHP من تثبيت MAMP المحلي ، يجب أن تتمكن من إدخال: 

$ /Applications/MAMP/bin/php/php5.3.6/bin/phpunit  ./hello_reader_tests.php 

عند هذه النقطة ، سترى فشلاً 

Failing TestsFailing TestsFailing Tests

ذلك جيد!  هذا يعني أنه تم تثبيت PHPUnit وتشغيله وأن إطار اختبار WordPress جاهز للعمل.  فشل الاختبار ببساطة لأننا لم نكتب في الواقع أي اختبارات.  دعونا نبدأ في القيام بذلك. 

اختبارنا الأول 

أولاً ، دعنا نكتب اختبارًا للتأكد من تهيئة المكون الإضافي ، وإنشاء مثيل له ، والاستعداد للاختبار.  Recall earlier in the first article that we stored a reference to the instance of Hello Reader into the PHP $GLOBALS array.  هذه هي الطريقة التي سنتمكن من الوصول إلى هذا المثال باستخدام إطار الاختبار. لذلك دعونا نقوم بتحديث اختبار الوحدة لدينا لتبدو هكذا: 

لاحظ أنه من أجل المساحة ، سأترك تعليقات الكود ، لكن المكوّن الإضافي والفحص المعلق بالكامل سيكون متاحًا على GitHub.

أعلاه ، قمنا بإعداد مرجع إلى مثيل المكون الإضافي حتى نتمكن من الوصول إليه خلال اختبارات الوحدة الخاصة بنا.  We're using the setUp method to grab the reference to the plugin from $GLOBALS.  Note, however, that we've introduced another function calledtestPluginInitialization.  This function verifies that the reference we've setup in thesetUp method is not null. 

إذا أعدت إجراء الاختبارات ، فيجب أن تحصل الآن على اختبار ناجح ويجب أن تبدو الوحدة الطرفية كما يلي: 

Passing TestsPassing TestsPassing Tests

There is an important takeaway here: Note that the single function we've provided above has a clear purpose: to verify that the plugin has been properly initialized.  اسم وظيفتها واضح ويحتوي على بيان تأكيد واحد. هذه طريقة رائعة لتخطيط اختباراتنا المتبقية بشكل أساسي لأنها تجعل من السهل العثور على الأخطاء عند ظهورها.  فكر في الأمر بهذه الطريقة: إذا قمت بتضمين عدد من عبارات التوكيد المختلفة في وظيفة واحدة ، فسيكون من الصعب تحديد بيان التوكيد الذي فشل.

الوظيفة الأولى 

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

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

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

حاول الآن لتشغيل الاختبار.  لن يفجر الاختبار ، ولكن يجب أن ترى في الواقع إخفاقًا مع رسالة واضحة عن سبب فشل الاختبار: 

لذا ، تمشيا مع منهجيتنا ، نريد أن نجعل هذا الاختبار يمر.  In order to do so, we need to make sure that the post content contains the string of text – in this case, 'TEST CONTENT', in order to make it pass.  لذلك دعونا نحاول هذا.  قم بتحديث الوظيفة المقابلة في الملحق لإلحاق السلسلة قبل المحتوى: 

ومرة أخرى ، أعدنا الاختبار فقط لنرى أنه فشل.  If you notice our test, this is because it's looking to see of our content equals the 'TEST CONTENT' string.  بدلاً من ذلك ، نحتاج إلى التأكد من أن السلسلة تبدأ على المحتوى.  هذا يعني أننا بحاجة إلى تحديث الاختبار.  Luckily, PHPUnit has an assertContains function.  لذلك دعنا نقوم بتحديث الكود الخاص بنا لاستخدامه: 

مرة أخرى ، أعد تشغيل الاختبار ويجب أن ترى أن الاختبار الآن يمر.  رائع!  نحتاج الآن إلى كتابة رسائل مخصصة للأشخاص القادمين من Twitter والأشخاص القادمين من Google. 

الترحيب بزوار تويتر لدينا 

هناك عدد من الطرق المختلفة التي يمكننا التحقق منها لمعرفة كيفية وصول المستخدم إلى صفحة معينة.  في بعض الأحيان يمكننا التحقق من القيم في صفيف $ _GET ، وأحيانًا يمكننا استجواب مصفوفة _SERVER $ ، أو أحيانًا يمكننا التحقق من جلسة المستخدم.  لأغراض هذا المثال ، سنبحث عن "twitter.com"  to be found in the $_SERVER['HTTP_REQUEST'].  أقول هذا فقط لكي تتمكنوا من المتابعة مع ما نقوم به في الكود. 

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

في المكوّن الإضافي: 

في الاختبار: 

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

يجب أن ينتج عن إعادة الاختبار الآن اختبار اجتياز الاختبار.   لكن انتظر - يجب أن نكون مكتملين.  دعونا نتأكد من أننا تشغيل اختبار للتحقق من أن تفشل هذه الوظيفة عندما المرجع  هو ليس من التغريد.

Notice that we've updated the HTTP_REFERER and we've changed assertTrue to assertFalse.  السماح بكل شيء آخر صحيح ، قم بتشغيل الاختبارات ويجب أن تمر. 

تكرار نفسه لجوجل 

سيتطلب تقديم رسالة مخصصة لـ Google الشيء نفسه الذي فعلناه مع Twitter ، أي ،احتيال HTTP_REFERER وإرجاع true أو false لوظيفة المساعد.  لذلك ، من أجل تجنب سبر زائد ، سأبقي هذا القسم موجزا قدر الإمكان.  يجب اتباع نفس الخطوات بالنسبة لتويتر. 

أولاً ، نحن نعالج وظيفة المساعد في المكون الإضافي: 

ثم نعطيه الاختبار: 

سيؤدي إجراء الاختبار كما هو الآن إلى حدوث إخفاق.  لذا ، دعنا ننفذ الدالةis_from_google () : 

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

وأخيرا ، قم بتشغيل الاختبارات الخاصة بك.  السماح بكل شيء آخر صحيح ، يجب أن يكون لديك ستة اختبارات ناجحة. 

سحب كل شيء معا 

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

  • عندما يأتي المستخدم من Twitter ، سنقول "مرحبًا من Twitter!" 
  • عندما يأتي المستخدم من Google ، سنقول "مرحبًا بك من Google!" 
  • عندما يأتي المستخدم من أي مكان آخر ، لن نقوم بإضافة أي شيء. 

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

أولاً ، سنقوم بإضافة اختبار يتحقق من رسالة ترحيب Twitter. 

في المكون الإضافي ، سنقلل add_welcome_message إلى هذا: 

وسنضيف اختبار Twitter ، أولاً: 

في هذه المرحلة ، هذه قبعة قديمة ، صحيح؟  تشغيله ، سيفشل الاختبار. تنفيذadd_welcome_message لتبدو هكذا : 

تشغيله مرة أخرى ، وسوف تمر.  التالي هو اختبار Google: 

قم بتشغيل الاختبار ، فهل فشلت ، ثم قم بتحديث add_welcome_message في البرنامج المساعد ليحتوي على فحص باستخدام وظيفة المساعد التي كتبناها في وقت سابق: 

في هذه المرحلة ، يجب أن يكون لديك ملحق وظيفي بالكامل يحتوي على سبعة اختبارات وحدة ناجحة! 


الاستنتاج

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

وأخيرًا ، يمكنك العثور على هذا المكون الإضافي واختبارات WordPress واختبارات وحدة Hello Reader التي تم التعليق عليها بالكامل على GitHub . 

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
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.