RSS

اختبار وتوثيق برامج PHP

05 أبريل

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

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

سأتناول في مقالتي هذه شقين آخرين يساهمان في تعزيز مظاهر وسلوكيات الاحتراف لديك، وهما الاختبار والتوثيق. حيث سأعتمد مقاربة استخدم فيها لغة PHP وما يتوفر لها من أدوات مستفيدا مما كسبته من خبرة عملية في إطار مشروع  PHP واللغة العربية (http://www.ar-php.org) كمثال، على الرغم من أن المفاهيم المطروحة في هذه المقالة يمكن تعميمها على أغلب اللغات البرمجية ومعظم المشاريع.


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

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

إطار عمل PHPUnit لبناء الاختبارات المؤتمتة:

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

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

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

إن برنامج  PHPUnit هو فرد من عائلة مكتبة PEAR، فإن لم يكن متوفر على المخدم الذي تستخدمه لعملية التطوير، فكل ما عليك القيام به هو طلب تنصيبه ببساطة  من خلال تنفيذ التعليمتين التاليتين في سطر الأوامر:

pear channel-discover pear.phpunit.de

pear install phpunit/PHPUnit

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

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

لاحظ بداية أن الاختبار ذاته عبارة عن برنامج يحفظ في ملف مستقل مع تضمين كل من إطار عمل  PHPUnit والملف الذي يتضمن الصنف المراد اختباره، أما ملف الاختبار ذاته فيتضمن صنفا أساسيا يحتوى كافة الحالات التي يراد إختبارها على شكل طرائق تتبع له، وهو يرث من صنف PHPUnit_Framework_TestCase الذي يقدمه إطار عمل  PHPUnit، كما أن تسميته مشتقة من اسم الصنف الأصلي بعد إضافة Test إلى بدايتها. تمنحنا الطريقة ()setUp الفرصة في ضبط الإعدادات الأولية قبل بدء عملية الاختبار حيث تنفذ قبل أي من حالات الاختبار التي تتلوها في هذا الصنف، كما أن الطريقة teardown() فتنفذ عند إنتهاء كافة حالات الاختبار وتستخدم لإعادة تحرير المصادر وما إلى ذلك، فيما تمتاز تسمية كافة حالات الاختبار بأنها تبدأ حصرا بالكلمة test على أن يتلوها ما يوضح طبيعة حالة الاختبار هذه، وكل من حالات الاختبار هذه (أو لنقل الطرائق) تتضمن الطريقة الموروثة assertEquals لإتمام عملية الفحص عقب تهيئة الدخل وتمريره للحصول على الخرج ومقارنته بما يتوقع الحصول عليه.

إن تنفيذ عملية الاختبار تتم ببساطة من خلال سطر الأوامر من خلال تنفيذ الأمر:

phpunit testName

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

يوضح الشكل التالي حالة تنفيذ اختبار نموذجي صحيح بالكامل:

يوضح الشكل التالي حالة تنفيذ ذات الاختبار مع وجود أخطاء (الخطأ الأول سببه ظهور الحرف E عوض الحرف A فيما الخطأ الثاني سببه إعادة متحول منطقي غير مطابق لما هو متوقع):

برنامج phpDocumentor لتوثيق الشيفرة البرمجية آليا:

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

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

يوضح المثال السابق حالة نموذجية لتعليق يسبق إحدى الطرائق الواردة في مشروع PHP واللغة العربية يوضح فيه بنية مقطع التعليق الذي يجب أن يبدأ بسطر **/ وينتهي بسطر /* على أن تسبق كل سطر من أسطر مقطع التعليق رمز النجمة *

يمكن أن يتألف مقطع التعليق من سطر أول يمثل شرحا مقتضبا أو عنوانا يصف ما يتلوه من كينونة برمجية سواء كانت تابعا أو متحولا أو صنفا الخ… يمكن أن يتلو هذا العنوان شرح أطول وأكثر تفصيلا على أن يفصل بينهما سطر فارغ (دون أن ننسى رمز النجمة الملزم في كل أسطر مقطع التعليق حتى ولو كان فارغا)، يمكن لهذا الشرح المطول أن يقسم على عدة فقرات على أن يفصل بين كل منها سطر فارغ وحينها يعامل مضمون تلك الفقرات على أنه نص صرف خال من التنسيق، إلا أنه من الممكن استخدام بعض معرفات HTML ضمن فقرات الشرح المطول هذا مثل <b> و <i> و <ul> و <ol> و <li> و <br> و <p> شريطة أن يتم استخدامها من بداية الشرح المطول لتكون هذه البداية على الشكل التالي  <p> *، طبعا لن تظهر هذه التنسيقات بالهيئة المتوقعة منها إلا حينما يتم تصديرها لاحقا إلى صيغ أخرى مثل ملفات التوثيق بصيغة HTML أو CHM أو حتى PDF (وهو الدور المنوط ببرنامج  phpDocumentor).

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

* @param type [$varname] description

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

* @return type description

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

@copyright, @link, @author, @package

يوضح الشكل التالي مثالا آخر عن طريقة الاستخدام مع التوابع أو الطرائق:

إن توافر هذه الصيغ من التعليقات داخل شيفرتك المصدرية يجعل عملية التوليد الآلي للتوثيق سهلة المنال وبسيطة، فكل ما عليك القيام به هو استدعاء برنامج phpDocumentor من خلال سطر الأوامر (تذكر أن برنامج  phpDocumentor هو في نهاية المطاف مكتوب بلغة PHP ذاتها، لذا على مسار مفسر لغة PHP أن يكون معرفا في بيئة مخدم التطوير لديك)، طبعا عليك تمرير مجموعة من الوسائط التي تحدد للبرنامج الملف أو المجلد الذي يتضمن الشيفرة المصدرية المراد توثيقها (f- يتلوه اسم الملف مع المسار المؤدي إليه أو d- يتلوه المسار المؤدي إلى المجلد الذي يتضمن برنامجك)، كذلك عليك تحديد صيغة الخرج التي تريد لملفات التوثيق أن تظهر بها (o- يتلوها التنسيق المرغوب)، فمثلا يمكنك استخدام HTML:Smarty:PHP لتحصل على توثيق HTML بصيغة تماثل ما هو مستخدم في الموقع الرسمي للغة PHP، أو يمكنك استخدام PDF:default:default للحصول على ذلك التوثيق كملف PDF، أو حتى يمكنك طلب التنسيق CHM:default:default لتولد لاحقا ملف توثيق بصيغة CHM. هناك أيضا الكثير من الوسطاء المفيدة الأخرى التي يمكن تمريرها إلى تعليمة سطر الأوامر للتحكم بخصائص التوثيق الناتج (مثلا t- لتحديد المجلد الذي ستوضع فيه ملفات التوثيق الناتجة، أو ti- التي يتلوها العنوان الأساس الذي نريد له أن يظهر في ترويسة كل صفحة من صفحات التوثيق).

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

pear install  phpDocumentor

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

 

الأوسمة: , ,

5 responses to “اختبار وتوثيق برامج PHP

  1. المهندس شادي عقيل

    5 أبريل 2010 at 2:21 مساءً

    الله يعطيك العافية أخ خالد وإلى مزيد من المقالات القيمة وشكرا لجودك

     
  2. جمال

    8 أبريل 2010 at 1:13 صباحًا

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

     
    • Khaled Al-Sham'aa

      8 أبريل 2010 at 6:48 صباحًا

      شكرا على الإطراء، وعذرا على عدم وضع رابطي البرنامجين ضمن المقالة على الرغم من كونهما سيظهران كأول نتيجة عند البحث بدلالة إسميهما، على كل حال المواقع الرسمي لبرنامج الاختبار المؤتمت PHPUnit هو:
      http://www.phpunit.de

      في حين أن الموقع الرسمي لبرنامج phpDocumenter للتوثيق هو:
      http://www.phpdoc.org

       
  3. احمد

    10 أبريل 2010 at 2:01 صباحًا

    موضوع أكثر من ممتاز
    ولو أن phpunit يحتاج إلي تفصيل أكثر
    شكرا جزيلا

     
    • Khaled Al-Sham'aa

      11 أبريل 2010 at 6:53 صباحًا

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

       

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s

 
%d مدونون معجبون بهذه: