اختبار PHP: الوحدة، التكامل، e2e — دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا نحتاج إلى اختبار تطبيقات PHP؟

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



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



اختبار الوحدة (Unit Testing): التحقق من المكونات المعزولة

اختبارات الوحدة (Unit Tests) هي أدنى وأسرع مستوى من الاختبارات. هدفها هو التحقق من عمل دالة أو طريقة معينة في عزلة تامة عن التبعيات الخارجية (قواعد البيانات، نظام الملفات، طلبات HTTP).



أدوات اختبار الوحدة في PHP

  • PHPUnit — المعيار الفعلي. قوي، مرن، ومدعوم من معظم الأطر.
  • Pest — بديل حديث بتركيبة أكثر إيجازًا. مثالي للمبتدئين والفرق التي تقدر سهولة القراءة.


مثال باستخدام PHPUnit

لنفترض أن لدينا كلاسًا بسيطًا لحساب الخصم:

<?phpclass DiscountCalculator{    public function calculate(float $price, float $percent): float    {        if ($percent < 0 || $percent > 100) {            throw new \\InvalidArgumentException('نسبة الخصم يجب أن تكون بين 0 و 100');        }        return $price - ($price * $percent / 100);    }}?>


سيبدو اختبار هذا الكلاس كالتالي:

<?phpuse PHPUnit\\Framework\\TestCase;

class DiscountCalculatorTest extends TestCase{ public function testCalculateWithValidDiscount(): void { $calculator = new DiscountCalculator(); $result = $calculator->calculate(1000, 20); $this->assertEquals(800.0, $result); }

public function testCalculateWithZeroPercent(): void { $calculator = new DiscountCalculator(); $result = $calculator->calculate(500, 0); $this->assertEquals(500.0, $result); }

public function testCalculateThrowsExceptionForInvalidPercent(): void { $this->expectException(\\InvalidArgumentException::class); $calculator = new DiscountCalculator(); $calculator->calculate(100, 150); }}?>


المبادئ الأساسية لاختبارات الوحدة:

  • اختبار واحد = تحقق واحد (assert واحد).
  • يجب ألا تعتمد الاختبارات على بعضها البعض.
  • استخدم الكائنات الوهمية (mocks) لعزل الخدمات الخارجية. على سبيل المثال، باستخدام createMock() في PHPUnit.
  • قم بتغطية الحالات الحدودية: null، سلاسل فارغة، قيم سالبة.


اختبار التكامل (Integration Testing): التحقق من تفاعل المكونات

تتحقق اختبارات التكامل من كيفية عمل أجزاء مختلفة من التطبيق معًا: الكلاسات، قواعد البيانات، الخدمات الخارجية. على عكس اختبارات الوحدة، نستخدم هنا تبعيات حقيقية (أو شبه حقيقية).



متى تكتب اختبارات التكامل؟

  • التحقق من التفاعل مع قاعدة البيانات (ORM، الاستعلامات).
  • العمل مع نظام الملفات (رفع/قراءة الملفات).
  • التفاعل مع واجهات برمجة التطبيقات الخارجية (عبر النماذج الاختبارية).
  • التحقق من صحة عمل المستودعات (Repositories) وطبقة الخدمات.


مثال باستخدام PHP مع PDO (بدون إطار عمل)

<?phpuse PHPUnit\\Framework\\TestCase;

class User

المدونات

توصيات الكتب