مفارقة المختبر: تغطية 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
بالنسبة لمطور 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\nXdebug: المخضرم ذو الإمكانيات الواسعة
\n\nXdebug هو أشهر مصحح أخطاء وملف تعريف للأداء في PHP. يمكنه جمع بيانات تغطية الكود. التثبيت قياسي:
\n\n# التثبيت عبر pecl\npecl install xdebug\n\n# أو عبر Docker\nRUN pecl install xdebug && docker-php-ext-enable xdebug\n\n\nفي ملف php.ini يجب تفعيل وضع التغطية:
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\nPCOV: سريع وخفيف الوزن
\n\nPCOV (PHP Code Coverage) هو بديل لـ Xdebug، صُمم خصيصاً لجمع التغطية. لا يبطئ التنفيذ لأنه لا يحتوي على مصحح أخطاء.
\n\npecl install pcov\n\n# التفعيل في php.ini\nextension=pcov.so\npcov.enabled=1\n\n\nتشغيل