Advertisement
  1. Code
  2. Creative Coding

دليل المبتدئ الى اختبار الوحدة Unit Testing: ما الـ Unit Testing ؟

Scroll to top
Read Time: 10 min

() translation by (you can also view the original English article)

حسب خلفيتك, ربما قد تكون قد سمعت أو لم تسمع عن أي من المصطلحات الآتية كـ Unit Testing (اختبار الوحدة), تطوير test-driven (الاختبار الموجه), تطوير behavior-driven (السلوك الموجه) أو أي من الأنواع الأخري لأساليب أو منهجيات الاختبار. في كثير من الأحيان, فإن هذه المنهجيات يتم تطبيقها ضمن سياق الأنظمة و التطبيقات الأكبر, و بشكل أقل في المشاريع المبنية على الووردبريس WordPress (رغم أن تطبيقها يجعلها أفضل)

بصراحة, فإن مجتمع التطوير قد ينقسم قليلاً حول الإختبار التلقائي (automated testing) للبرامج - لديك البعض يرون أنه لا بد من اختبار 100% من الكود الخاص بك, البعض يرى أن 80% من اختبار الكود أمر كاف, البعض يرى أنه لا بد أن يكون 50%, و البعض مع 20% أو ما نحو ذلك. على أي حال, فإن هذا المقال ليس للنقاش بشأن مستوى الاختبار المطلوب في مشروعك أو بشأن اتخاذ موقف حول اختبار البرمجيات بشكل عام.

و لكن بدلاً من ذلك, نحن بصدد أخذ نظرة على ما هو المطلوب لتبدأ و تتعامل مع اختبار الوحدة Unit Testing لمشاريعك المبنية على بيئة تطوير الوورد بريس WordPress

ما اختبار الوحدة الـ Unit Testing ؟

قبيل البدء بإعداد البيئة أو كتابة أي أكواد, دعونا نعرف بالضبط ما الـ Unit Testing, و لماذا يستحق منا أن نستخدمه, و كيف نبدأ بدمجه في مشاريعنا بالفعل.

على المستوى المتقدم, منهجية الـ Unit Testing (اختبار الوحدة) تعني بإختبار الدوال functions أو المناطق - أو الوحدات - في الأكواد. و هذا يعطينا القدرة على التوثق من أن الدوال functions تعمل بالشكل المتوقع منها. هذا يعني أن أي دالة بناء على عدد من الادخالات inputs, نستطيع تحديد ما إذا كانت الدالة تعود بمخرجات outputs صحيحة أم لا, و يمكننا بعدها أن نتعامل بسلاسة مع الأخطاء التي تحدث أثناء التنفيذ بناء على مدخلات غير صالحة.

و في النهاية, هذا سوف يساعد في تحديد المشاكل في الخوازميات algorithms و/أو منطق الكود logic. و يساعدنا على تحسين جودة كود دالة معينة. و عندما تبدأ في كتابة المزيد من الإختبارات, سينتهي بك الأمر لإنشاء سلسلة من الإختبارات التي يمكنك تنفيذها في أي وقت أثناء التطوير لتستمر بالتأكد من جودة عملك.

ميزة ثانية لتقارب التطوير من وجهة نظر الـ Unit Testing و هي أنك ستكون على الأرجح قادر على كتابة أكواد قابلة للاختبار. و لأن الـ Unit Testing يتطلب أن يكون الكود الخاص بك قابل للإختبار بسهولة, فهذا يعني أن الكود الخاص بك لا بد أن يدعم هذه النوعية من التقييم. كما أنه يجب ان تمتلك عدد كبير من الدوال functions الصغيرة و المحددة عن عمليات مفردة لمجموعة بيانات, بدلاً من تلك الدوال الكبيرة التي تنفذ العديد من العمليات في نفس الدالة.

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

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

تخطيط الاضافة Plugin الخاصة بنا

واحدة من أفضل الطرق للبدء مع الـ Unit Testing هي أن ننفذه ضمن تطبيق عملي. و طوال هذه السلسلة المكونة من جزئين سنقوم ببناء إضافة Plugin بسيطة و كتابة الاختبارات لتشمل الوظيفة بأكلمها.

أولاً, لنبدأ ببناء المشروع: سنقوم ببناء إضافة Plugin بسيطة تكون وظيفتها أن تضيف رسالة بسيطة في أعلى كل تدوينة post و تقوم بالترحيب بالمستخدم بناء على كيفية وصوله لتدوينة معينة. الفكرة شبيهة جداً بالإضافة Welcome Reader و لكن لن تتضمن أغلب وظائفها - نحن ببساطة نقوم ببناء نموذج توضيحي مصغر لتعلم مدخلات و مخرجات الاختبار.

على أي حال: هذا ما سوف تقوم به الإضافة Plugin

  • إذا ما وصل المستخدم الى الموقع من خلال جوجل Google, سنرحب به برسالة مميزة
  • إذا ما وصل المستخدم الى الموقع من خلال تويتر Twitter, سنرحب به برسالة مميزة
  • حالات آخرى, لن نقوم بعرض أية رسائل

المهمة واضحة بشكل كاف, أليس كذلك ؟. هذا أيضاً سيمنحنا الفكرة الأساسية لكيفية أضافة رسائل مخصصة للخدمات الأخرى و توسيع قدرات اختبار الـ Unit Testing الخاص بنا و ما يجب أن يقوم به كذلك.

إعداد البيئة

لتتمكن من تطبيق إختبار الـ Unit Testing على الكود, لا بد لنا من مكتبة خارجية من نوع الطرف-الثالث third-party و التي سنضمنها في مشروعنا, و هي ستقوم بتنفيذ الاختبارات التي سنكتبها. في هذه السلسلة سنقوم بإستخدام PHPUnit. يمكنك الحصول على نسخة من هنا.

بعد ذلك, نحتاج لإعداد بيئة التطوير الخاصة بنا, تطوير الإضافة Plugin و تضمين including المكتبات libraries المهمة لاختبار الكود الخاص بنا. هذا المقال يفترض أنك بالفعل لديك ووردبريس WordPress منصب و يعمل.

حسناً, دعونا نقم بإعداد مجلد الاضافة Plugin directory :

  • في مجلد /wp-content/Plugins قم بإنشاء مجلد بعنوان Hello-Reader
  • في مجلد Hello-Reader قم بإنشاء ملف بعنوان Plugin.php و مجلد بعنوان tests
  • سنقوم بإداراج الاضافة Plugin و التأكد من أن الووردبريس WordPress يرى مشروعنا بشكل صحيح
  • سنقوم باستيراد مكتبات الاختبار Unit Testing لنتمكن من البدء في كتابة اختباراتنا

هذا هو الكود الأساسي لتعريف الاضافة التي سنقوم بإنشائها:

1
2
/*

3
Plugin Name: Hello Reader

4
Plugin URI: http://github.com/tommcfarlin/Hello-Reader

5
Description: A simple Plugin used to help demonstrate Unit Testing in the context of WordPress.

6
Version: 1.0

7
Author: Tom McFarlin

8
Author URI: http://tom.mcfarl.in

9
Author Email: tom@tommcfarlin.com

10
License:

11


12
  Copyright 2012 Tom McFarlin (tom@tommcfarlin.com)

13


14
  This program is free software; you can redistribute it and/or modify

15
  it under the terms of the GNU General Public License, version 2, as 

16
  published by the Free Software Foundation.

17


18
  This program is distributed in the hope that it will be useful,

19
  but WITHOUT ANY WARRANTY; without even the implied warranty of

20
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

21
  GNU General Public License for more details.

22


23
  You should have received a copy of the GNU General Public License

24
  along with this program; if not, write to the Free Software

25
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

26
  

27
*/
28
// Only create an instance of the Plugin if it doesn't already exists in GLOBALS

29
if( ! array_key_exists( 'hello-reader', $GLOBALS ) ) { 
30
31
  class Hello_Reader {
32
		 
33
		function __construct() {
34
			
35
		} // end constructor

36
	  
37
	} // end class

38
	
39
	// Store a reference to the Plugin in GLOBALS so that our unit tests can access it

40
	$GLOBALS['hello-reader'] = new Hello_Reader();
41
	
42
} // end if

في هذه النقطة, لا بد لك من التوجه الى قسم الإضافات Plugins في لوحة التحكم الخاصة بالووردبريس WordPress و سترى عنصر باسم Hello Reader . هذه الإضافة لا تقوم بعمل شئ حتى الآن - سنقوم بشرح هذا الكود, و لماذا قمنا باستدانة Leveraging المصفوفة ِArray $GLOBALS في المقال القادم.

أخيراً, لنقم بتنصيب إطار العمل الخاص بالاختبار testing framework لنستطيع من كتابة اختباراتنا. أولاً, نحتاج الى تنصيب الـ PHPUnit و من بعدها سنقوم بتنصيب إطار العمل المدعو الـ WordPress Tests.

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

تنصيب PHPUnit

PHPUnit هو عبارة عن حزمة إطار عمل framework خاص بإختبارت الـ Unit Testing و موجه تحديداً للـ PHP. الـ WordPress Tests و إطار العمل framework و الذين سنقوم باستخدامهما لكتابة اختبارات الووردبريس WordPress تعتمدان علي الـ PHPUnit. لسوء الحظ, فإن التنصيب يختلف بناء على منصتك platform. أنا حالياً أستخدم Mac OS X Lion مع MAMP Pro و PHP 5.3.6. إذا كنت تعمل على منصة مختلفة, يمكنك أن تتوجه الى هذا الدليل أو شاركنا خطواتك في التعليقات.

أولاً, قم بفتح نافذة الأوامر terminal و قم بتحديث الـ PEAR (هذه ستكون وسيلتنا لتنصيب الـ PHPUnit)

$ cd /Applications/MAMP/bin/php/php5.3.6/bin $ sudo ./pear upgrade pear

ثانياً, قم بإرشاد الـ PEAR لاستخدام مستودعات الملفات repositories التي سنحددها من خلال نافذة الأوامر عبر

$ sudo /Applications/MAMP/bin/php/php5.3.6/bin/pear config-set auto_discover 1

بعد ذلك, قم بتنصيب حزمة الـ PEAR بكتابة الأمر التالي

$ sudo /Applications/MAMP/bin/php/php5.3.6/bin/pear install pear.phpunit.de/PHPUnit

و بذلك تكون قد نصبت الـ PHPUnit بالفعل ضمن الـ MAMP الموجود لديك. لتتأكد من انه قد تم تنصيبه بالفعل, قم يتنفيذ الأمر التالي في نافذة الأوامر terminal

$ /Applications/MAMP/bin/php/php5.3.6/bin/phpunit --version

بعدها من المفترض ان تظهر لك هذه الرسالة:

PHPUnit 3.6.11 by Sebastian Bergmann.

ملحوظة: ربما يحدث و تظهر لك رسالة خطأ على نافذة الأوامر تتضمن كلمة "()unserialize", إذن هناك تعارض بين إعدادت الـ PEAR الموجودة و نسختك الحالية من الـ PEAR. لحل هذه المشكلة, قم بكتابة هذا الأمر (ببساطة يقوم الأمر بإعادة تسمية الملف الذي من المفترض أن تقوم بإستعادته لاحقاً):

$ /Applications/MAMP/bin/php/php5.3.6/conf/pear.conf /Applications/MAMP/bin/php/php5.3.6/conf/pear.conf.old

تنصيب الـ WordPress Tests

حالياً, لدينا الـ PHPUnit منصب و يعمل بنجاح, و ها قد جاء الوقت لتنصيب إطار عمل WordPress Testing Framework. يمكنك أن تحصل عليه من GitHub. إذا كنت جيد مع عملية نسخ المستودع cloning the repository إذن يمكنك أن تقوم بذلك, و إذا لم تستطع ذلك, ببساطة قم بتحميل الملف المضغوط للمشروع, و من ثم قم بفك ضغطه في مجلد test الذي سنقوم بإنشائه لاحقاً في هذا المقال.

و قبل تنفيذ الإختبار بالفعل, نريد إنشاء ملف إعدادات config لتنفيد اختبارات الووردبريس WordPress. أنه أمر مشابه لتحرير ملف الـ wp-config.php عند تنصيب ووربريس WordPress جديد, و لكننا نقوم بإنشائه هنا لإختبار قاعدة بيانات. في التالي, قمت بوضع أكواد ملف الإعدادات config الخاصة بي و قمت بإضافة التعليقات. سأحرص على أن أضيف هذا أيضاً في مشروع الـ GitHub الخاص بهذا المقال.

1
2
/* Path to the WordPress codebase in relation to the location of these tests. Since they are included with our Plugin, we refer to a few directories above. */
3
define( 'ABSPATH', '../../../../../' );
4
5
/* The name of the database for running the tests. Make sure this is a database just for testing as it's created and trashed during tests. */
6
define( 'DB_NAME', 'throwaway' );
7
8
/* The usual credentials for a local database. */
9
define( 'DB_USER', 'root' );
10
define( 'DB_PASSWORD', '' );
11
define( 'DB_HOST', 'localhost' );
12
define( 'DB_CHARSET', 'utf8' );
13
define( 'DB_COLLATE', '' );
14
15
define( 'WPLANG', '' );
16
define( 'WP_DEBUG', true );
17
define( 'WP_DEBUG_DISPLAY', true );
18
19
define( 'WP_TESTS_DOMAIN', 'localhost' );
20
define( 'WP_TESTS_EMAIL', 'tom@tommcfarlin.com' );
21
define( 'WP_TESTS_TITLE', 'Test Blog' );
22
23
/* Not worried about testing networks or subdomains, so setting to false. */
24
define( 'WP_TESTS_NETWORK_TITLE', 'Test Network' );
25
define( 'WP_TESTS_SUBDOMAIN_INSTALL', false );
26
$base = '/';
27
28
/* Cron tries to make an HTTP request to the blog, which always fails, because tests are run in CLI mode only */
29
define( 'DISABLE_WP_CRON', true );
30
31
/* Also not interested in testing multisite for this project, so setting to false. */
32
define( 'WP_ALLOW_MULTISITE', false );
33
if ( WP_ALLOW_MULTISITE ) {
34
	define( 'WP_TESTS_BLOGS', 'first,second,third,fourth' );
35
}
36
if ( WP_ALLOW_MULTISITE && !defined('WP_INSTALLING') ) {
37
	define( 'SUBDOMAIN_INSTALL', WP_TESTS_SUBDOMAIN_INSTALL );
38
	define( 'MULTISITE', true );
39
	define( 'DOMAIN_CURRENT_SITE', WP_TESTS_DOMAIN );
40
	define( 'PATH_CURRENT_SITE', '/' );
41
	define( 'SITE_ID_CURRENT_SITE', 1);
42
	define( 'BLOG_ID_CURRENT_SITE', 1);
43
}
44
45
$table_prefix  = 'wp_';

للتحقق من أنك قمت بتنصيب الاختبارات بشكل ناجح, يمكنك تنفيذ الأمر التالي من نافذة الأوامر terminal الخاصة بك:

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

لو حدث و ظهر لك خطأ, فهذا لأن اختبارات الووردبريس WordPress تحاول أن تستخدم socket الى قاعدة البيانات MySQL بخلاف الذي يستخدمه الـ MAMP نفسه. و لإصلاح الأمر, نحتاج لإنشاء رابط رمزي symbolic link من الـ socket الخاص بالـ MAMP الى مسار الملفات على القرص disk الذي تستخدمه اختبارات الـ unit testing بالفعل. قم بكتابة الأمر التالي عبر نافذة الأوامر terminal:

1
2
$ sudo mkdir /var/mysql
3
$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock
4
$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

الآن, حاول تشغيل الاختبارات مجدداً, و سترى أمراً مشابهاً لما في الصورة التالية

Passing TestsPassing TestsPassing Tests

مجدداً, المجهود الذي ستستغرقه ربما يختلف بناء على المنصة platform التي تعمل عليها, لذا لا تتحرج من مشاركة خبراتك في التعليقات أو حتى شاركها في ملف الاستخدام README الموجود على الـ GitHub بحيث يمكن أن تكون كمصدر مساعد للأخرين.

الى الآن, نحن مستعددون لكتابة الاضافة Plugin و اختبارات الـ unit testing الخاصة بنا. الأكواد بالأعلي تم إضافتها الى الـ GitHub و سأقوم بالبناء عليها كلما تقدمنا بالعمل خلال المقال القادم من هذه السلسلة. و في هذه الأثناء, تأكد أنك قمت بإعداد بيئة العمل و أنك مستعد لبدء التطوير. في المقال القادم, سنقوم بالفعل بكتابة الإختبارات, بناء الاضافة Plugin الخاصة بنا, و ملاحظة المشروع بالكامل و هو يتم انجازه من البداية حتى النهاية.

المصادر

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.