مقدمة في اختبار تطبيقات PHP
الاختبار هو جزء لا يتجزأ من التطوير الاحترافي في PHP. فهو يسمح باكتشاف الأخطاء في المراحل المبكرة، ويبسط إعادة الهيكلة، ويزيد من استقرار الكود. في نظام PHP البيئي، توجد مجموعة قوية من الأدوات: من PHPUnit الكلاسيكي إلى الأطر الحديثة مثل Pest والأدوات المتخصصة لتحليل التغطية والاختبار الطفري.
في هذه المقالة، سنستعرض الأطر والأدوات الرئيسية التي ستساعدك في تنظيم اختبار عالي الجودة لمشاريع PHP.
PHPUnit — أساس الاختبار
PHPUnit هو المعيار الفعلي لاختبار الوحدة في PHP. وهو يدعم جميع الإمكانيات الحديثة: التأكيدات، الإعدادات المسبقة (setUp/tearDown)، مزودي البيانات، اختبار الاستثناءات، النماذج الوهمية (stubs) والمحاكاة (mocks).
التثبيت عبر Composer:
composer require --dev phpunit/phpunitمثال لاختبار بسيط لفئة آلة حاسبة:
<?phpuse PHPUnit\\Framework\\TestCase;
class CalculatorTest extends TestCase{ public function testAddition() { $calculator = new Calculator(); $this->assertEquals(4, $calculator->add(2, 2)); }
/** @dataProvider additionProvider */ public function testWithDataProvider($a, $b, $expected) { $calculator = new Calculator(); $this->assertEquals($expected, $calculator->add($a, $b)); }
public function additionProvider(): array { return [ [0, 0, 0], [1, 1, 2], [-1, 1, 0], ]; }}الإمكانيات الرئيسية لـ PHPUnit:
- التأكيدات: assertEquals, assertTrue, assertCount, assertInstanceOf وعشرات غيرها.
- الإعدادات المسبقة: طريقتي setUp() و tearDown() لإعداد البيئة وتنظيفها.
- مزودي البيانات: التعليق التوضيحي @dataProvider لتشغيل اختبار واحد بمجموعات بيانات مختلفة.
- اختبار الاستثناءات: expectException() و expectExceptionMessage().
- النماذج الوهمية والمحاكاة: createMock() و getMockBuilder() لعزل الكود المختبر.
Pest — أنيق وحديث
Pest هو إطار اختبار مبني فوق PHPUnit، لكنه يتميز ببناء جملة أكثر إيجازاً وتعبيراً. وهو مستوحى من Jest (JavaScript) ومناسب تماماً للمشاريع التي تهم فيها قابلية قراءة الاختبارات.
التثبيت:
composer require --dev pestphp/pestمثال لنفس الاختبار في Pest:
<?php
use function Pest\\Faker\\fake;
test('addition works correctly', function () { $calculator = new Calculator(); expect($calculator->add(2, 2))->toBe(4);});
dataset('numbers', [ [0, 0, 0], [1, 1, 2], [-1, 1, 0],]);
test('addition with data provider', function ($a, $b, $expected) { $calculator = new Calculator(); expect($calculator->add($a, $b))->toBe($expected);})->with('numbers');مزايا Pest:
- الحد الأدنى من الكود النمطي — لا حاجة لإنشاء فئات اختبار.
- دوال مدمجة expect(), test(), it() لوصف طبيعي باللغة.
- تسجيل تلقائي للاختبارات من الدوال العامة.
- دعم المجموعات المتداخلة (describe) والاختبارات المعمارية.
Codeception — للاختبار التكاملي و BDD
Codeception هو إطار شامل يجمع بين اختبارات الوحدة، والوظيفية، والتكاملية، والقبول. وهو شائع بشكل خاص عند اختبار تطبيقات الويب (Laravel, Symfony, Yii) وواجهات API.
التثبيت:
composer require --dev codeception/codeceptionمثال لاختبار قبول لتسجيل الدخول إلى موقع:
<?php$I = new AcceptanceTester($scenario);$I->amO