BDD على PHP: كيفية كتابة كود يفهمه حتى المدير

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

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

ابدأ الدورة

عندما يتحدث الكود لغة الأعمال: التعرف على BDD



تخيل موقفًا: لقد كتبت وحدة دفع مثالية من وجهة نظر الكود. جميع الطرق تعمل، يتم معالجة الاستثناءات، وتغطية اختبارات الوحدة 99%. تفتح الشمبانيا، ولكن يأتي المدير ويقول: "لماذا يتم خصم الأموال قبل تأكيد الطلب؟". وتدرك أن الخلل ليس في الكود، بل في فهم المهمة.



مألوف؟ لهذه الحالات بالتحديد يوجد BDD (التطوير الموجه بالسلوك) — تطوير يقوده السلوك. إنها ليست مجرد منهجية أخرى، بل جسر بين "أريد أن يعمل" و"كيفية تنفيذه على PHP". إذا كنت قد سئمت من إعادة كتابة المنطق بعد كل توضيح للمتطلبات، فهذه المقالة لك.



في هذا المحتوى، سنشرح كيفية تطبيق BDD على PHP باستخدام إطار العمل Behat، وسنكتب اختبارات حقيقية، وسنفهم لماذا يجعل ذلك الكود أنظف والتواصل أكثر شفافية.



ما هو BDD وكيف يختلف عن TDD؟



كثيرون يخلطون بين التطوير الموجه بالسلوك و TDD العادي (التطوير الموجه بالاختبارات). وفي الحقيقة، هما متشابهان ظاهريًا: في كليهما تُكتب الاختبارات أولاً. لكن الفرق في التركيز.



  • TDD — يدور حول "كيف نتحقق من أن الدالة ترجع رقمًا صحيحًا". تُكتب الاختبارات بلغة المبرمج: assert، equals، mock.
  • BDD — يدور حول "كيف يتصرف النظام في حالة عمل محددة". تُكتب السيناريوهات بلغة طبيعية، شبه بشرية.


الفكرة الأساسية لـ BDD في PHP هي استخدام لغة موحدة للتواصل. المطورون، المختبرون، والمديرون يقرؤون نفس السيناريو. وإذا كان مكتوبًا فيه "يضيف المستخدم منتجًا إلى سلة التسوق دون تسجيل دخول"، فإن الجميع يفهمون ذلك بنفس الطريقة.



الأدوات: Behat و Gherkin



في عالم PHP، الأداة الرئيسية لـ BDD هي Behat. إنه إطار عمل يقوم بتحليل السيناريوهات بلغة Gherkin وتحويلها إلى اختبارات قابلة للتنفيذ. Gherkin هي لغة إنجليزية (أو عربية) بسيطة مع كلمات مفتاحية: Feature، Scenario، Given، When، Then.



لنقم بتثبيت Behat في مشروع PHP الخاص بك:



composer require --dev behat/behat behat/mink-extension behat/mink-goutte-driver


بعد التثبيت، نقوم بتهيئة المشروع:



vendor/bin/behat --init


سيكون الهيكل كالتالي:



features/  bootstrap/    FeatureContext.php  your_feature.featurebehat.yml


كتابة أول سيناريو BDD على PHP



لنفترض أن لدينا متجرًا إلكترونيًا. متطلب العمل: "يمكن للمستخدم المسجل إضافة منتج إلى سلة التسوق ورؤية المجموع الإجمالي". لننشئ ملف features/cart.feature:



Feature: سلة المشتري  كمستخدم مسجل  أريد إضافة منتجات إلى سلة التسوق  لكي أرى التكلفة الإجمالية

Scenario: إضافة منتج واحد Given أدخل إلى الموقع كمستخدم "ivan@example.com" And في صفحة الكتالوج يوجد منتج "لابتوب" بسعر 50000 روبل When أضغط على "أضف إلى السلة" للمنتج "لابتوب" Then أرى رسالة "تمت إضافة المنتج" And المجموع الإجمالي للسلة يساوي 50000 روبل


لاحظ: يمكن لأي مدير قراءة هذا السيناريو دون معرفة PHP. لكن بالنسبة لـ Behat، فهو اختبار قابل للتنفيذ.



تنفيذ الخطوات (Step Definitions)



الآن نحتاج إلى "تعليم" Behat كيفية فهم هذه الخطوات. افتح features/bootstrap/FeatureContext.php:



<?php

use Behat\\Behat\\Context\\Context;use Behat\\Gherkin\\Node\\PyStringNode;use Behat\\Gherkin\\Node\\TableNode;

class FeatureContext implements Context{ private $currentUser; private $cart = []; private $products = [];

/** * @Given أدخل إلى الموقع كمستخدم

المدونات

توصيات الكتب