لماذا اختبار PHP ليس مخيفًا بل مفيدًا؟
\n\nتخيل: لقد كتبت سكربت PHP، وهو يعمل. أنت سعيد. بعد أسبوع، تحتاج لإضافة وظيفة جديدة. تغير بضعة أسطر — وفجأة كل شيء يتعطل. هل هذا مألوف؟ إذا كان الأمر كذلك، فأنت بحاجة ماسة للتعرف على اختبار PHP. إنه ليس سحرًا، بل مجرد مجموعة أدوات تنقذ مشروعك من الفوضى.
\n\nكثير من المطورين المبتدئين يخافون من الاختبارات. يبدو الأمر صعبًا ومملًا ويستغرق وقتًا. في الحقيقة، اختبار الوحدة PHP هو مثل التأمين: تدفع القليل الآن لئلا تخسر كل شيء لاحقًا. في هذا المقال، سنشرح من أين تبدأ اختبار PHP كمبتدئ، وما الأدوات التي تستخدمها، وكيف تكتب أول اختبار دون أن تصاب بالجنون.
\n\nما هو الاختبار ولماذا تحتاجه؟
\n\nاختبار الكود هو عملية التحقق من أن برنامجك يفعل بالضبط ما تتوقعه منه. بدلاً من فتح المتصفح يدويًا والنقر على الروابط في كل مرة، تكتب سكربتات خاصة (اختبارات) تقوم بذلك نيابة عنك.
\n\nالفوائد الرئيسية:
\n- \n
- الثقة في الكود. تعرف بالتأكيد أنه بعد التغييرات لن يتعطل شيء. \n
- توفير الوقت. الفحص التلقائي أسرع من الفحص اليدوي. \n
- توثيق. الاختبارات تظهر كيف يجب أن يعمل كودك. \n
- تبسيط إعادة الهيكلة. يمكنك إعادة كتابة الكود بثقة إذا نجحت الاختبارات. \n
الأداة الأكثر شيوعًا لـ اختبار PHP هي PHPUnit. إنها المعيار الفعلي في عالم PHP. معها سنعمل.
\n\nتثبيت PHPUnit: طريقتان بسيطتان
\n\nقبل كتابة الاختبارات، تحتاج إلى تثبيت PHPUnit. هناك طريقتان رئيسيتان.
\n\nالطريقة 1: Composer (موصى بها)
\n\nإذا كنت تستخدم Composer بالفعل (ويجب أن تستخدمه، فهو مدير التبعيات لـ PHP)، فالأمر بسيط. افتح الطرفية في جذر مشروعك ونفّذ:
\n\ncomposer require --dev phpunit/phpunit ^10\n\nالعلامة --dev تعني أن PHPUnit سيتم تثبيته للتطوير فقط، ولن ينتقل إلى الخادم الإنتاجي.
الطريقة 2: أرشيف PHAR
\n\nإذا لم يكن Comporter خيارك المناسب، يمكنك تنزيل PHPUnit كملف واحد:
\n\nwget https://phar.phpunit.de/phpunit.phar\nchmod +x phpunit.phar\nsudo mv phpunit.phar /usr/local/bin/phpunit\n\nبعد ذلك، يجب أن يعرض الأمر phpunit --version الإصدار.
أول اختبار: نكتبه ونشغله
\n\nالآن الجزء الممتع. لننشئ كلاسًا بسيطًا ونكتب له اختبارًا. لنفترض أن لدينا دالة تجمع رقمين.
\n\nالخطوة 1: الكود المراد اختباره
\n\nأنشئ ملف src/Calculator.php:
<?php\n\nnamespace App;\n\nclass Calculator\n{\n public function add(float $a, float $b): float\n {\n return $a + $b;\n }\n}\n\nالخطوة 2: اختبار لهذا الكلاس
\n\nPHPUnit يتبع اتفاقية: تُخزَّن الاختبارات في مجلد tests/، واسم ملف الاختبار يطابق اسم الكلاس مع اللاحقة Test. أنشئ tests/CalculatorTest.php:
<?php\n\nnamespace Tests;\n\nuse App\\Calculator;\nuse PHPUnit\\Framework\\TestCase;\n\nclass CalculatorTest extends TestCase\n{\n public function testAdd()\n {\n $calculator = new Calculator();\n $result = $calculator->add(2, 3);\n $this->assertEquals(5, $result);\n }\n}\n\nماذا يحدث هنا؟
\n- \n
- نحن نرث من
TestCase— الكلاس الأساسي لـ PHPUnit. \n - الطريقة
testAddهي اختبارنا. PHPUnit يشغل تلقائيًا جميع الطرق التي تبدأ بـtest. \n $this->assertEquals()هو assert (تأكيد). يتحقق من أن النتيجة تساوي القيمة المتوقعة.