4.5 · اختبارات آلية مع بي.إتش.بي.يونيت (PHPUnit)

المستوى 4 · أطر العمل وواجهات API (Frameworks & API)

4.5اختبارات آلية مع بي.إتش.بي.يونيت (PHPUnit)

الهدف: جعل الكود موثوقا باختبارات آلية (بي.إتش.بي.يونيت (PHPUnit) وتأكيدات ومستويات) : ثقة وعدم انحدار وتصميم أفضل — ما يفصل نموذجا عن تطبيق احترافي.
الوقت المقدّر: 11 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • الاختبارات = كود يختبر الكود : بي.إتش.بي.يونيت (عبر Composer) وتأكيدات (assertEquals وassertTrue…) تفشل إذا كان الحقيقي ≠ المتوقع.
  • 3 مستويات : وحدية (دالة معزولة) وتكامل (مع القاعدة) ووظيفية (كمستخدم) — يشغلها كلها ./vendor/bin/phpunit.
  • منعكس رياد : اختبار منطق العمل الحرج أولا، وإعادة التشغيل بعد كل تعديل — عدم الانحدار الذي يحرر.

حالة مصغرة متواصلة — رياد يثبت أسعاره قبل التخفيضات

عشية التخفيضات، يخشى رياد أن يكسر تخفيض أسعاره في قسنطينة : يكتب أول اختبار بي.إتش.بي.يونيت على prixTTC، ويضيف الحالات الحدية (صفر ومعدل صفري وسلة فارغة)، ثم يعيد تشغيل السلسلة كلها بعد كل تعديل. وعندما يعدل زميل الحساب، يتحول الاختبار إلى الأحمر قبل النشر. آخر محطة في الخيط الرابط : من نموذج «يشتغل» إلى تطبيق احترافي يبرهن.

آخر حلقة من حالة 4.1-4.4 — يقفل رياد المستوى : الهيكلة والتجهيز والعرض والجعل موثوقا.

1. بي.إتش.بي.يونيت والتأكيدات

الاختبار باليد مضن وغير كامل وغير قابل للتكرار : نكتب كودا يختبر الكود، قابلا لإعادة التشغيل متى شئنا. في PHP، المرجع هو بي.إتش.بي.يونيت (PHPUnit) (يثبت عبر Composer، ويُشغَّل بـ ./vendor/bin/phpunit). يتحقق الاختبار من أن مدخلا يعطي المخرج المتوقع عبر تأكيدات — assertEquals($attendu, $resultat) وassertTrue(...) وassertNull(...) — تفشل إذا اختلفت الحقيقة. اختبارات منظمة في أصناف وطرق، تُنفَّذ جماعيا مع تقرير ناجح/فاشل. ثلاثة مستويات : وحدية (دالة/صنف معزول) وتكامل (أجزاء متعددة، مثلا مع القاعدة) ووظيفية/شاملة (كمستخدم).

2. الفوائد و TDD

الفوائد : الثقة (نعرف، لا نظن)، وعدم الانحدار — الأكبر — (إعادة التشغيل بعد كل تعديل تنبه فورا إذا كسر تعديل ما كان يشتغل)، والتوثيق (سلوك متوقع، قابل للتنفيذ ومحدث)، وتصميم أفضل (الكود القابل للاختبار مقطع أفضل)، وكشف مبكر (في التطوير، لا في الإنتاج). يدمج لارافيل وسيمفوني بي.إتش.بي.يونيت مع أدوات مخصصة (قواعد اختبار وطلبات HTTP محاكاة). ويكتب TDD الاختبارات قبل الكود (الاختبار يعرف المتوقع، والكود يحققه) — انضباط يحسن التصميم. يبدأ رياد صغيرا : المنطق الحرج أولا، لا 100 % فورا.

خطأ شائع في الفهم: «الاختبار مضيعة وقت : إنه يشتغل، تحققت باليد». لا. يغطي التحقق اليدوي حالات قليلة، اليوم فقط — وكل تعديل مستقبلي قد يكسر بصمت ما كان يشتغل. تُعاد الاختبارات في ثوان وتنبه فورا : عدم الانحدار هذا هو ما يسمح بإعادة الهيكلة دون خوف. «يشتغل» دون اختبارات يعني «يشتغل حاليا».
حلقة ثقة بي.إتش.بي.يونيت اكتب ← شغل ← عدل ← أعد التشغيل اكتب اختبار : مدخل ←مخرج متوقعشغل ./vendor/bin/phpunit،تقريرعدل تعديل أوإعادة هيكلةأعد التشغيل أخضر = عدمانحدار مُبرهَن
اكتب ← شغل ← عدل ← أعد التشغيل
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) يكتب رياد اختبار بي.إتش.بي.يونيت على منطقه الحرج : مدخل معطى ومخرج متوقع في تأكيد. 2) يشغل السلسلة ويلاحظ التقرير. 3) يعدل كوده بثقة. 4) يعيد التشغيل : أخضر، لا كسر — أحمر، انحدار ممسوك قبل الإنتاج. الدرس : البرهنة بدل الظن.

🔎 مثال ملموس — 🔎 مثال ملموس — أول اختبار لسعر TTC

أول اختبار لرياد، بالواجهات الحقيقية لبي.إتش.بي.يونيت :

prixTTC(100, 0.20) ← المتوقع 120.0 (assertEquals)
prixTTC(0, 0.20) ← المتوقع 0 (حالة حدية)
التشغيل ← ./vendor/bin/phpunit ← OK (2 tests, 2 assertions)
تعديل ← إعادة التشغيل ← أخضر = لا كسر

القراءة : مدخل واحد ومتوقع واحد وتأكيد واحد — ثم الحلقة.

الدرس : الحالات الحدية تمسك الأخطاء التي يفوتها العرض.

مفردات القسم

الاختبارات الآلية / بي.إتش.بي.يونيت (PHPUnit)
كود يختبر كودكم (قابل لإعادة التشغيل متى شئتم) بدلا من التحقق باليد. بي.إتش.بي.يونيت هو معيار PHP (عبر Composer).

مثال بسيط: يشغل رياد ./vendor/bin/phpunit ويحصل على تقريره في ثوان.

ما ليس كذلك: تحقق يدوي وحيد في المتصفح.

رد فعل: كل سلوك حرج يستحق اختباره.

التأكيدات
تحققات الاختبار : assertEquals(المتوقع، النتيجة) و assertTrue و assertNull… — تفشل إذا كان الحقيقي ≠ المتوقع.

مثال بسيط: يؤكد رياد assertEquals(120, prixTTC(100, 0.20)).

ما ليس كذلك: echo « يبدو جيدا » دون مقارنة صارمة.

رد فعل: المتوقع أولا، والحقيقي بعده، ورسالة واضحة.

مستويات الاختبارات
وحدية (معزول) وتكامل (أجزاء متعددة، مثلا مع القاعدة) ووظيفية/شاملة (كمستخدم).

مثال بسيط: يختبر رياد prixTTC وحديا، والطلب مع قاعدته تكاملا.

ما ليس كذلك: اختبار كبير واحد يخلط كل شيء.

رد فعل: هرم : كثير وحدية، وقليل شاملة.

فوائد الاختبارات
ثقة وعدم انحدار (كشف ما يكسره تعديل) وتوثيق وتصميم أفضل وكشف مبكر.

مثال بسيط: سلسلة رياد تمسك تخفيضا مكسورا قبل التخفيضات.

ما ليس كذلك: اكتشاف الكسر بتذكرة زبون في الإنتاج.

رد فعل: سلسلة خضراء مطلوبة قبل كل تسليم.

TDD (التطوير بالاختبارات)
كتابة الاختبارات قبل الكود (الاختبار يعرف المتوقع، والكود يحققه) ؛ وانضباط يحسن التصميم.

مثال بسيط: يكتب رياد اختبار التخفيض قبل الدالة، ثم يبرمج حتى الأخضر.

ما ليس كذلك: برمجة عشوائية ثم اختبار «للتحقق» بعدها.

رد فعل: أحمر ← أخضر ← إعادة هيكلة : دورة TDD.

في التطبيق — عمليا — جعل الكود موثوقا بالاختبارات

  1. ثبتوا بي.إتش.بي.يونيت (عبر Composer) واكتبوا أول اختبار وحدي لدالة (مدخل ← متوقع، assertEquals…).
  2. شغلوا بـ ./vendor/bin/phpunit، واقرؤوا التقرير ؛ وأضيفوا حالات حدية ومدخلات غير صالحة.
  3. اكتبوا اختبار تكامل (وظيفة + قاعدة) ؛ وتحت إطار عمل، استعملوا أدوات الاختبار المدمجة.
  4. أعيدوا التشغيل بعد كل تعديل (عدم انحدار) وجربوا TDD (اختبار قبل الكود).
تجعلون كودكم موثوقا باختبارات آلية (بي.إتش.بي.يونيت وتأكيدات ومستويات) : ثقة وعدم انحدار وتصميم أفضل — العتبة الاحترافية.

نص جاهز للقول — إعلان السلسلة الخضراء (30 ثانية)

« هذا رياد : حساباتنا الحرجة مغطاة ببي.إتش.بي.يونيت — وحدية وحالات حدية وتكامل قاعدة. كل تعديل يعيد تشغيل السلسلة : خضراء، نسلّم ؛ حمراء، نصحح قبل الإنتاج. »

يُقال قبل كل تسليم ؛ واعرضوا السلسلة الخضراء.

نموذج نسخ-لصق — اختبار بي.إتش.بي.يونيت (كود مُختبَر)

assertEquals(120.0, prixTTC(100, 0.20));
    }
    public function testCasLimites(): void {
        $this->assertEquals(0.0, prixTTC(0, 0.20));
        $this->assertEquals(100.0, prixTTC(100, 0.0));
        $this->assertTrue(prixTTC(50, 0.20) > 50);
    }
}
// للتشغيل : ./vendor/bin/phpunit PrixTest.php

خطوة أولى

اختبار واحد على الحساب الحرج : قيمة فورية وعادة مثبتة.

منطق معرض للخطر

مثل رياد : حسابات وقواعد عمل وحالات حدية وغير صالحة — حيث تكلف الأخطاء غاليا.

تحت إطار عمل

قواعد اختبار وطلبات HTTP محاكاة من لارافيل/سيمفوني للتكامل.

فريق يكبر

سلسلة خضراء مطلوبة قبل الدمج : يصبح عدم الانحدار طقسا جماعيا.

حذر: تثبت الاختبارات المُختبَر، لا كل شيء : لا تعرضوا أبدا أسرارا في الاختبارات (عينات وهمية و.env.testing خارج Git) وحافظوا على البيانات الشخصية خارج ألعاب الاختبار. محتوى تعليمي، وأمثلة ببيانات وهمية.

✓ ممارسات جيدة

  • اختبار المنطق الحرج أولوية.
  • إعادة التشغيل بعد كل تعديل.
  • تجربة TDD على دالة صغيرة.

✗ أخطاء شائعة

  • الظن أن «يشتغل» يغني عن الاختبار.
  • استهداف 100 % تغطية فورا.
  • الاختبار باليد فقط، مرة واحدة.

النقاط الأساسية

  • اختبارات آلية (بي.إتش.بي.يونيت، معيار PHP) : كود يختبر الكود. تأكيدات (assertEquals…) إذا كان الحقيقي ≠ المتوقع.
  • المستويات : وحدية (معزول) وتكامل (مع قاعدة) ووظيفية (كمستخدم).
  • الفوائد : ثقة وعدم انحدار (إعادة التشغيل بعد كل تغيير — الأكبر) وتوثيق وتصميم.
  • تدمج أطر العمل بي.إتش.بي.يونيت. TDD = اختبارات قبل الكود. ضروري في الإنتاج — يفصل النموذج عن التطبيق الاحترافي.

تحدي 48 ساعة — طبّق غدا

اكتبوا اختباري بي.إتش.بي.يونيت على دالتكم الأكثر حرجا (حالة عادية + حالة حدية) وأعيدوا التشغيل بعد تعديل واحد.

قائمة الخروج من القسم
  • أستطيع شرح بي.إتش.بي.يونيت والتأكيدات والمستويات.
  • أعرف تشغيل السلسلة وقراءة التقرير.
  • عندي اختباران أخضران على منطقي الحرج.
تقييم ذاتي 1-5 : هل منطقي الحرج مغطى ؟هل أعدت تشغيل السلسلة بعد آخر تعديل ؟

أسئلة شائعة

تبدو الاختبارات مضيعة وقت عندما «صار يشتغل» : لماذا نختبر ؟

لأن «يشتغل» لا يساوي إلا الحالات المتحقق منها باليد، اليوم. وغدا، كل تعديل قد يسبب انحدارا صامتا — ودون اختبارات، يجب إعادة التحقق من كل شيء باليد، وهو ما لا نفعله أبدا. تجلب الاختبارات ثقة (نعرف) وعدم انحدار (تنبيه فوري) وتوثيقا حيا للسلوك وتصميما أفضل (القابل للاختبار مقطع أفضل) وكشفا مبكرا — أرخص بما لا يقاس منه في الإنتاج.

كيف نبدأ دون غرق — ماذا نختبر أولوية ؟

تدريجيا، لا 100 % فورا : منطق العمل الحرج (حسابات وقواعد — حيث يكلف الخطأ غاليا) والكود المعقد/المعرض للخطر أو الذي ينكسر غالبا والحالات الحدية والمدخلات غير الصالحة (صفر ومتطرفات وفارغات — حيث تختبئ الأخطاء) والكود المعاد استعماله (ينتشر فيه الخطأ في كل مكان). أقل أولوية في البدء : البديهي (واصلات) والإظهار الخالص. الطريقة : رتب-نفذ-أكد — جهز ونفذ وتحقق.

تحقّق من فهمك

ما الفائدة الكبرى للاختبارات الآلية ؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 4أسئلة جديدة وأصعب للتحقق من مكتسباتك