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

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

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

ابدأ الدورة

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

تطوير PHP ليس مجرد كتابة كود "يعمل". في تطوير الويب الحديث، الاستقرار والقدرة على التنبؤ بالتطبيق يصبحان في المقدمة. بدون اختبار، أي تغيير في الكود يخاطر بتعطيل وظائف تعمل بالفعل، ويصبح البحث عن الأخطاء يدويًا "مطاردة لا نهائية للأخطاء". وهنا يأتي دور الاختبار.

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



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

اختبارات الوحدة (Unit tests) هي أسرع وأكثر مستويات الاختبار عزلة. هدفها هو التحقق من عمل "وحدة" واحدة (فئة، طريقة، أو دالة) بمعزل عن التبعيات الخارجية: قاعدة البيانات، نظام الملفات، API.



الأدوات المستخدمة في PHP

الإطار الأكثر شيوعًا هو PHPUnit. البديل الأكثر حداثة هو Pest، الذي يقدم بناء جملة أكثر إيجازًا.



مثال على اختبار وحدة باستخدام PHPUnit

لنفترض أن لدينا فئة آلة حاسبة بسيطة:

<?php// src/Calculator.phpclass Calculator{    public function add(int $a, int $b): int    {        return $a + $b;    }

public function divide(int $a, int $b): float { if ($b === 0) { throw new \\InvalidArgumentException('Division by zero'); } return $a / $b; }}

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

<?php// tests/Unit/CalculatorTest.phpuse PHPUnit\\Framework\\TestCase;

class CalculatorTest extends TestCase{ private Calculator $calculator;

protected function setUp(): void { $this->calculator = new Calculator(); }

public function testAddReturnsCorrectSum(): void { $result = $this->calculator->add(2, 3); $this->assertEquals(5, $result); }

public function testDivideThrowsExceptionOnZero(): void { $this->expectException(\\InvalidArgumentException::class); $this->calculator->divide(10, 0); }}

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

  • العزلة: يتم استبدال جميع التبعيات الخارجية (قاعدة البيانات، API) بـ mock (نماذج وهمية) أو stub (بدائل).
  • السرعة: يتم تنفيذها في أجزاء من الثانية (ملي ثانية).
  • تتحقق من سيناريو واحد محدد (تأكيد واحد لكل اختبار هو ممارسة جيدة).

التشغيل: ./vendor/bin/phpunit tests/Unit



اختبارات التكامل: التحقق من التفاعل

اختبارات التكامل (Integration tests) ترتفع بمستوى أعلى. تتحقق من كيفية عمل الأجزاء المختلفة من النظام معًا: فئة مع قاعدة البيانات، وحدة تحكم مع نموذج، خدمة مع API خارجي (حقيقي أو محاكى).



متى نحتاج إلى اختبارات التكامل؟

  • التحقق من صحة استعلامات SQL.
  • التحقق من صحة الاتصال بين طبقات التطبيق (مثل Repository + Entity).
  • اختبار الوسائط (middleware) أو الأحداث (events).


مثال: اختبار مستودع (Repository) مع قاعدة بيانات حقيقية

لاختبارات التكامل، غالبًا ما تُستخدم قاعدة بيانات اختبارية (SQLite في الذاكرة أو معاملات في PostgreSQL). لنلقِ نظرة على مثال باستخدام PHPUnit وخاصية (trait) لإعادة تعيين قاعدة البيانات:

<?php// tests/Integration/UserRepositoryTest.phpuse PHPUnit\\Framework\\TestCase;

class UserRepositoryTest extends TestCase{ private PDO $pdo; private UserRepository $repository;

protected function setUp(): void { // إنشاء SQLite في الذاكرة للعزل $this->pdo = new PDO('sqlite::memory:'); $this->pdo->exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)');

المدونات

توصيات الكتب