جد الكثير من المبتدئين استخدام
PHPUnit لاختبار Test الشيفرة المصدرية التي يكتبونها أمرا معقّدا للغاية؛ بدءًا من تثبيت مكتبات الاختبار وليس انتهاء بتشخيص أخطاء عملها. يسهّل
Laravel 5 الكثير من هذه التعقيدات إذ يأتي مضمّنا مبدئيّا بمكتبة
PHPUnit جاهزة للعمل.
phpunit-laravel-tests.png
يمكنك التأكّد من ذلك بالدخول إلى مجلّد المشروع ثم تنفيذ الأمر التالي:
vendor/bin/phpunit --version
قد تظهر لك مشكلة في اعتمادات Composer إلا أنه يمكن تجاوزها بتنفيذ الأمر على النحو التالي:
vendor/phpunit/phpunit/phpunit --version
تظهر بعد تنفيذ الأمر المناسب النتيجة التالية (قد يختلف رقم الإصدار لديك):
PHPUnit 4.8.24 by Sebastian Bergmann and contributors.
استخدم الأمر الصحيح من بين الأمريْن أعلاه في بقية هذا الدرس.
يأتي
Laravel مبدئيّا بمثال لاختبار؛ سننظر في هذا المثال لنرى كيف تعمل اختبارات PHPUnit. افتح الملف ExampleTest.php الموجود في المجلّد tests المتفرّع عن مجلّد المشروع:
<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions ;
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$this->visit('/')
->see('Laravel 5');
}
}
يمكننا تجربة الاختبار بتنفيذ الأمر التالي الذي ينفّذ جميع الاختبارات الموجودة في الملف tests المذكور أعلاه:
vendor/bin/phpunit
يبحث الاختبار أعلاه عن سلسلة المحارف
Laravel 5 في الصفحة الرئيسية للمشروع التي يشير إليها المسار /. إن كان مشروع
Laravel الذي تعمل عليه جديدا فسيظهر سطران كالتالي:
Time: 118 ms, Memory: 12.00Mb
OK (1 test, 1 assertion)
يخبر السطر الأول بالوقت الذي استغرقه الاختبار وحجم الذاكرة المستخدمة لتنفيذه. أما السطر الثاني فيُظهر عدد الاختبارات وعدد التأكيدات Assertions ونتيجتها. لدينا اختبار واحد (ExampleTest) وتأكيد واحد (الصفحة الرئيسية تحوي سلسلة المحارف
Laravel 5). بما أن نتيجة الاختبار إيجابية فإن السطر الأخير يظهر باللّون الأخضر.
فلنجرّب إخفاق الاختبار. نستبدل
Laravel 6 بـ
Laravel 5 في ملف الاختبار ثم نعيد تنفيذ الأمر:
vendor/bin/phpunit
ستظهر الكثير من المُخرجات تحوي الرسائل التالية إضافة لشفرة الصفحة الرئيسية التي نختبرها:
Time: 115 ms, Memory: 12.00Mb
There was 1 failure:
Couldn't find [Laravel 6] on the page. Check content above.
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
يخبر السطر الأول بالمدة التي استغرقها الاختبار والحجم الذي أخذه في الذاكرة، بينما يشرح السّطر الثالث سبب الإخفاق وهو عدم القدرة على إيجاد سلسلة المحارف
Laravel 6 في الصفحة. يلخّص السّطر الأخير نتيجة الأمر التي تظهر باللون الأحمر دلالة على إخفاق الاختبارات.
إن حصل خطأ في الشفرة المصدرية للاختبار نفسه (نسيت مثلا ; في نهاية تعليمة) فلن يُنفَّذ الاختبار وستظهر رسالة بما حدث.
اختبار استمارة Form تسجيل مستخدم
يقضي المطوّرون المبتدئون الكثير من الوقت
لاختبار الاستمارات على تطبيقاتهم، إلا أن
Laravel يجعل الأمر في منتهى السهولة. سنجرّب في هذه الفقرة اختبار استمارة لتسجيل مستخدم جديد في التطبيق.
سنستعين بأداة Artisan لإنشاء أساسيات الاستيثاق (عروض Views التسجيل، الدخول وإعادة تعيين كلمة السر بالإضافة إلى المتحكّمات Controllers والمسارات Routes الضرورية):
php artisan make:auth
ينشئ الأمر السابق عرضا على المسار register/ به استمارة لتسجيل مستخدم جديد. سنستخدم
PHPUnit لاختبار هذه الاستمارة. نستعين بأداة Artisan من جديد لإنشاء ملف للاختبار:
php artisan make:test RegistrationTest
ملحوظة: تأكّد من إعداد قاعدة البيانات في مشروعك.
ينشئ الأمر ملفا باسم RegistrationTest.php في المجلّد tests. نفتح الملف ونعدّله على النحو التالي:
<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions ;
class RegistrationTest extends TestCase
{
use DatabaseTransactions;
public function testNewUserRegistration()
{
$this->visit('/register')
->type('bob', 'name')
->type('hello1@in.com', 'email')
->type('hello1', 'password')
->type('hello1', 'password_confirmation')
->press('Register')
->seePageIs('/');
}
}
لاحظ أن الشفرة تطلُب زيارة المسار register/، إدخال المعطيات المذكورة في الاستمارة باستخدام الدالة type، الضغط على الزّر Register ثم النظر في النتيجة هل هي المسار /. تأخذ الدالة type معطيين، الأول قيمة حقل الاستمارة والثاني اسم الحقل. يجب أن تكون أسماء المعطيات في الدالة موافقة لحقول الاستمارة. في حالتنا توجد أربعة حقول في الاستمارة.
نستخدم الطّابع DatabaseTransactions Trait في الاختبار. يمكّننا هذا الطّابع من إلغاء إدراج تسجيلات جديدة في قاعدة البيانات حتى لا نملأها من غير جدوى. كما نستخدم الطّابع DatabaseMigrations للتراجع عن التهجيرات Migrations وبالتالي حذف الجدول من قاعدة البيانات. الطابع الثالث المستخدم في الاختبار هو طابع WithoutMiddleware الذي يسمح بتخطّي بعض إجراءات الحماية لأغراض الاختبار.
يمكننا الآن تنفيذ الاختبار كما يلي:
vendor/bin/phpunit tests/RegistrationTest.php
النتيجة:
Time: 401 ms, Memory: 16.50Mb
OK (1 test, 5 assertions)
يمكنك قراءة المزيد عن الاختبارات على موقع PHPUnit؛ فقط تذكّر أن الصنف الذي نمدّده في
Laravel هو TestCase بدلا من PHPUnit_Framework_TestCase في
تطبيقات PHP أخرى.