تغطية الكود بالاختبارات في PHP: المقاييس والأدوات والحيل

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

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

ابدأ الدورة

مفارقة المختبر: تغطية 100% ليست حلاً سحرياً

\n\n

ينقسم المطورون إلى معسكرين: من يكتب الاختبارات "للمظهر" ومن يطارد نسبة 100% من تغطية الكود. الحقيقة، كالعادة، في المنتصف. في هذا المقال، سنشرح ما هي تغطية الكود بالاختبارات في PHP، وما المقاييس المهمة حقاً، وأيها قد يكون مضللاً. ستتعلم كيف تستخدم PHPUnit وXdebug وInfection لتحويل الاختبارات من روتين ممل إلى أداة قوية لمراقبة الجودة.

\n\n

دعنا نتفق فوراً: المقال ليس عن "كيف تكتب اختباراً"، بل عن كيف تفهم أن اختباراتك تعمل فعلاً. سنتحدث بلغة الأرقام والمقاييس والأمثلة الواقعية. إذا كنت تكتب بلغة PHP وتريد أن يظل كودك متماسكاً عند أول تعديل، فأنت في المكان الصحيح.

\n\n

ما هي تغطية الكود (Code Coverage) بالضبط؟

\n\n

تغطية الكود هي مقياس يوضح النسبة المئوية للكود المصدري الذي يتم تنفيذه أثناء تشغيل الاختبارات. يبدو الأمر بسيطاً، لكن خلف هذا الرقم تكمن مستويات مختلفة من التحليل:

\n\n
    \n
  • تغطية الأسطر (Line Coverage) — المقياس الأساسي. كم عدد أسطر الكود التي "لمستها" الاختبارات.
  • \n
  • تغطية الفروع (Branch Coverage) — تتحقق مما إذا تم تنفيذ جميع الفروع الممكنة للشروط (if/else, switch).
  • \n
  • تغطية المسارات (Path Coverage) — المقياس الأكثر تعقيداً. يتحقق من جميع مسارات تنفيذ الكود الممكنة.
  • \n
  • تغطية الدوال/الطرق — كم دالة تم استدعاؤها مرة واحدة على الأقل.
  • \n
\n\n

بالنسبة لمطور PHP، المعيار الذهبي هو تغطية الأسطر + الفروع. لكن تذكر: 80% من تغطية الأسطر قد تخفي 40% من الفروع غير المختبرة. قد يكون الكود "منفذاً"، لكن المنطق لم يُختبر.

\n\n

لماذا تغطية 100% فخ؟

\n\n

تخيل دالة تعالج المدفوعات:

\n\n
<?php\n\nfunction processPayment(float $amount, string $currency): bool {\n    if ($amount <= 0) {\n        throw new InvalidArgumentException('يجب أن يكون المبلغ موجباً');\n    }\n    \n    $rate = getRate($currency); // API خارجي\n    $converted = $amount * $rate;\n    \n    if ($converted > 10000) {\n        return false; // يتطلب تأكيداً\n    }\n    \n    return saveTransaction($converted); // كتابة في قاعدة البيانات\n}\n
\n\n

اختبار يتحقق فقط من السيناريو الناجح (مبلغ > 0، عملة USD، تحويل < 10000) سيعطيك 100% من تغطية الأسطر. لكنه لن يختبر الاستثناء ولا حالة الدفعة الكبيرة. الخلاصة: عدد الأسطر المغطاة لا يساوي جودة الاختبارات.

\n\n

أدوات قياس التغطية في PHP

\n\n

يقدم نظام PHP البيئي عدة أدوات قوية. سنستعرض ثلاث أدوات رئيسية: Xdebug وPCOV وPHPUnit مع دعم التغطية المدمج.

\n\n

Xdebug: المخضرم ذو الإمكانيات الواسعة

\n\n

Xdebug هو أشهر مصحح أخطاء وملف تعريف للأداء في PHP. يمكنه جمع بيانات تغطية الكود. التثبيت قياسي:

\n\n
# التثبيت عبر pecl\npecl install xdebug\n\n# أو عبر Docker\nRUN pecl install xdebug && docker-php-ext-enable xdebug\n
\n\n

في ملف php.ini يجب تفعيل وضع التغطية:

\n\n
xdebug.mode=coverage\n
\n\n

التشغيل مع PHPUnit:

\n\n
./vendor/bin/phpunit --coverage-html ./reports/coverage\n
\n\n

مزايا Xdebug: الدقة، دعم الفروع، التكامل مع CI/CD. العيوب: يبطئ تنفيذ الاختبارات بمقدار 3-5 مرات. بالنسبة للمشاريع الكبيرة، هذا أمر بالغ الأهمية.

\n\n

PCOV: سريع وخفيف الوزن

\n\n

PCOV (PHP Code Coverage) هو بديل لـ Xdebug، صُمم خصيصاً لجمع التغطية. لا يبطئ التنفيذ لأنه لا يحتوي على مصحح أخطاء.

\n\n
pecl install pcov\n\n# التفعيل في php.ini\nextension=pcov.so\npcov.enabled=1\n
\n\n

تشغيل

المدونات

توصيات الكتب