دليل المبتدئ الى اختبار الوحدة Unit Testing: ما الـ Unit Testing ؟
() 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 |
الآن, حاول تشغيل الاختبارات مجدداً, و سترى أمراً مشابهاً لما في الصورة التالية



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