ما هو BDD ولماذا سينقذ مشروعك؟
\n\nهل سبق لك أن وجدت نفسك في موقف حيث يقول المطورون: "المنطق يعمل بشكل مثالي"، ويرد العميل: "لكن هذا ليس ما طلبته على الإطلاق!"؟ مألوف؟ هنا يظهر BDD (التطوير القائم على السلوك) على المسرح — التطوير من خلال السلوك.
\n\nBDD على Java ليس مجرد مصطلح عصري. إنها منهجية تزيل الحدود بين متطلبات العمل والكود. بدلاً من كتابة اختبارات تقنية جافة (كما في TDD)، تكتب سيناريوهات بلغة بشرية مفهومة. ونعم، حتى مديرك الذي يعتقد أن "Java جزيرة" يمكنه قراءتها.
\n\nكيف يختلف BDD عن TDD؟ (تنبيه: ليسا نفس الشيء)
\n\nكثيرون يخلطون بين TDD (التطوير القائم على الاختبار) وBDD. دعنا نوضح الأمور:
\n\n- \n
- TDD: تكتب اختباراً يفشل، ثم تكتب كوداً ليجتاز الاختبار. التركيز على التنفيذ التقني. \n
- BDD: تصف أولاً سلوك النظام بمصطلحات المستخدم. "عندما يضغط المستخدم على الزر، يقوم النظام بكذا". التركيز على قيمة الأعمال. \n
يستخدم BDD لغة Gherkin — لغة سيناريوهات بكلمات مفتاحية مثل Given وWhen وThen. تبدو كالتالي:
Feature: تسجيل الدخول إلى الحساب الشخصي\n Scenario: تسجيل دخول ناجح ببيانات صحيحة\n Given المستخدم موجود على صفحة تسجيل الدخول\n When يقوم المستخدم بإدخال اسم المستخدم "admin" وكلمة المرور "12345"\n Then يرى المستخدم رسالة "مرحباً بك!"\n\n\nأوافقك الرأي، هذا يُقرأ كتعليمات وليس كوثيقة تقنية. هذه هي قوة التطوير السلوكي على Java.
\n\nأدوات BDD في Java: اختر الإطار المناسب
\n\nفي عالم Java، هناك لاعبان رئيسيان لـ BDD: Cucumber وJBehave. دعنا نقارن بينهما.
\n\nCucumber لـ Java: ملك BDD
\n\nCucumber هو الإطار الأكثر شهرة. يدعم Gherkin مباشرة، ويتكامل مع JUnit وTestNG، وله مجتمع ضخم. إذا كنت مبتدئاً في BDD Java، ابدأ بـ Cucumber.
\n\nJBehave: قديم لكن موثوق
\n\nJBehave هو "جد" BDD. أقل شهرة، لكنه لا يزال مستخدماً في المشاريع القديمة (legacy). الفرق الرئيسي: تُكتب السيناريوهات في ملفات نصية، وترتبط الخطوات عبر التعليقات التوضيحية @Given و@When و@Then.
شخصياً، أوصي بـ Cucumber — لديه وثائق أفضل وأمثلة أكثر. لكن إذا كنت تعمل على مشروع قديم، فإن JBehave مقبول أيضاً.
\n\nكتابة أول اختبار BDD على Java: دليل خطوة بخطوة
\n\nدعنا ننتقل من النظرية إلى التطبيق. سننشئ مشروعاً بسيطاً باستخدام Maven وCucumber. مهمتك هي فهم الهيكل، وليس مجرد نسخ الكود.
\n\nالخطوة 1: إضافة التبعيات
\n\nأضف التبعيات التالية إلى ملف pom.xml:
<dependency>\n <groupId>io.cucumber</groupId>\n <artifactId>cucumber-java</artifactId>\n <version>7.18.0</version>\n <scope>test</scope>\n</dependency>\n<dependency>\n <groupId>io.cucumber</groupId>\n <artifactId>cucumber-junit-platform-engine</artifactId>\n <version>7.18.0</version>\n <scope>test</scope>\n</dependency>\n\n\nالخطوة 2: إنشاء ملف feature
\n\nفي المجلد src/test/resources، أنشئ ملفاً باسم login.feature:
Feature: تسجيل دخول المستخدم\n كمستخدم مسجل\n أريد تسجيل الدخول إلى النظام\n للحصول على الوصول إلى الحساب الشخصي\n\n Scenario: تسجيل دخول ناجح\n Given المستخدم فتح صفحة تسجيل الدخول\n When يقوم المستخدم بإدخال اسم المستخدم "te