لماذا لا يعمل الكود إذا قال العمل "كل شيء صحيح"؟
\n\nهل سبق لك أن واجهت موقفًا: يؤكد المدير أن المهمة قد حُلّت، واجتازت الاختبارات بنجاح، ولكن المستخدم لا يزال غير راضٍ؟ كلاسيكي. المشكلة ليست في الكود — المشكلة في التواصل. نحن نتحدث بلغات مختلفة: العمل يتعامل مع السيناريوهات، بينما المطورون يتعاملون مع الدوال والفئات. هنا يأتي دور BDD (التطوير القائم على السلوك) — التطوير من خلال السلوك. ونعم، يعمل هذا بشكل رائع على PHP.
\n\nفي هذه المقالة، سنفهم كيف يساعد BDD على PHP في تحويل "الرغبات" الغامضة إلى اختبارات واضحة يفهمها كل من المدير والمبرمج. ستتعرف على الفرق بين BDD و TDD العادي، وكيفية كتابة السيناريوهات بلغة Gherkin، وما هي الأدوات (Behat, PHPSpec) التي تبسط الحياة حقًا.
\n\nما هو BDD بكلمات بسيطة؟
\n\nBDD (التطوير القائم على السلوك) هو تطور لـ TDD. إذا كان TDD يركز على "كيفية اختبار الكود"، فإن BDD يجيب على السؤال "ماذا يجب أن يفعل الكود ليكون العمل سعيدًا".
\n\nتخيل أنك تكتب متجرًا إلكترونيًا. بدلاً من اختبار مجرد مثل "يجب أن تقلل الدالة applyDiscount() السعر"، تكتب سيناريو:
\n\n- \n
- بافتراض: في سلة التسوق منتج بقيمة 1000 روبل \n
- عندما: يدخل المستخدم الكود الترويجي "SALE10" \n
- حينئذ: تصبح تكلفة السلة 900 روبل \n
هذا السيناريو يقرأه أي شخص — من المسوق إلى قائد الفريق. لا سحر، فقط سلوك النظام.
\n\nBDD vs TDD: ما الفرق؟
\n\nكثيرون يخلطون بين هذين المفهومين. دعنا نضع النقاط على الحروف:
\n\n- \n
- TDD — نكتب اختبارًا، ثم الكود، ثم نعيد الهيكلة. الاختبارات يكتبها المطور للمطور. \n
- BDD — نكتب أولاً سيناريو السلوك بلغة طبيعية، ثم نؤتمته. تُكتب السيناريوهات في حوار مع العمل. \n
BDD لا يلغي TDD، بل يكمله. ما زلت تكتب اختبارات الوحدة، ولكن الآن لديك "توثيق حي" على شكل سيناريوهات.
\n\nأدوات BDD لـ PHP: اختر سلاحك
\n\nتقدم بيئة PHP أداتين رئيسيتين لـ التطوير القائم على السلوك: Behat و PHPSpec. تحل كل منهما مهامًا مختلفة.
\n\nBehat — الجندي العالمي
\n\nBehat هو إطار عمل للاختبارات القبولية. يعمل بلغة Gherkin (تلك "بافتراض-عندما-حينئذ"). Behat مثالي لاختبارات التكامل، واختبار API، وواجهات الويب، ومنطق الأعمال عالي المستوى.
\n\nPHPSpec — مجهر المطور
\n\nPHPSpec هو أداة لتحديد مواصفات الفئات. إنه أقرب إلى TDD، ولكن بفلسفة BDD: تصف سلوك الكائن، وليس دواخله. PHPSpec مناسب تمامًا لاختبار الوحدة لمنطق المجال.
\n\nفي هذه المقالة، سنركز على Behat، لأنه يوضح بشكل أفضل التطوير القائم على السلوك في PHP.
\n\nكتابة أول سيناريو BDD على PHP مع Behat
\n\nلننشئ مثالًا حقيقيًا. لنفترض أننا نطور نظام ولاء. يحصل العميل على خصم 10% إذا تجاوزت قيمة الطلب 5000 روبل.
\n\nالخطوة 1: تثبيت Behat
\n\ncomposer require --dev behat/behat\n\nثم نقوم بتهيئة المشروع:
\n\nvendor/bin/behat --init\n\nسيكون الهيكل كالتالي:
\n\nfeatures/\n bootstrap/\n FeatureContext.php\n discount.feature\n\nالخطوة 2: كتابة ملف feature بلغة Gherkin
\n\nننشئ ملف features/discount.feature:
Feature: حساب الخصم للعملاء المخلصين\n As a مدير مبيعات\n I want to تقديم خصم 10% على الطلبات من 5000 روبل\n So that تحفيز المشتريات الكبيرة\n\n Scenario: الطلب يتجاوز حد الخصم\n Given في سلة التسوق منتجات بقيمة 6000 روبل\n When أطلب التكلفة الإجمالية\n Then يجب أن تكون التكلفة الإجمالية