BDD على C#: عندما تتحدث الاختبارات بلغة الأعمال
\n\nتخيل: أنت مطور C#. يأتيك مدير المنتج ويقول: «اجعل بحيث بعد دفع الطلب، يتلقى المستخدم بريدًا إلكترونيًا، ولكن فقط إذا كان المبلغ أكبر من 1000 روبل». تومئ برأسك، وتذهب إلى الكود، وتكتب المنطق، وتغطيه باختبارات الوحدة. بعد أسبوع، تظهر النتيجة. ينظر مدير المنتج، ويتجهم، ويقول: «كنت أقصد شيئًا آخر».
\n\nمألوف؟ هذه هي مشكلة الفجوة الكلاسيكية بين الأعمال والتطوير. وهذا بالضبط ما يحله BDD على C# — التطوير القائم على السلوك.
\n\nفي هذه المقالة، سنشرح ما هو BDD، وكيف يختلف عن TDD، والأهم من ذلك — كيفية دمج BDD في مشروع C# باستخدام SpecFlow و xUnit. سترى أمثلة حقيقية للكود، وستتعلم كتابة سيناريوهات بلغة Gherkin وتحويلها إلى اختبارات آلية. هيا بنا!
\n\nما هو BDD ولماذا هو مطلوب؟
\n\nBDD (التطوير القائم على السلوك) هي منهجية تطوير يتم فيها وصف متطلبات النظام من خلال سلوك المستخدم. بدلاً من المواصفات الفنية الجافة، تكتب سيناريوهات بلغة طبيعية يفهمها كل من الأعمال والمطور.
\n\nالفكرة الأساسية لـ BDD: «لا تتحقق من أن الكود يعمل. تحقق من أن النظام يتصرف كما تتوقع الأعمال».
\n\nعلى عكس TDD (التطوير القائم على الاختبار)، حيث تكتب أولاً اختبار وحدة ثم الكود، يركز BDD على سيناريوهات الاستخدام. اختبارات BDD ليست اختبارًا لدالة أو فئة، بل اختبارًا لسيناريو مستخدم كامل.
\n\nركائز BDD الثلاث
\n- \n
- لغة موحدة — جميع المشاركين في المشروع (مدير المنتج، المحلل، المختبر، المطور) يتحدثون بلغة واحدة. عادةً ما تكون Gherkin. \n
- السيناريوهات — يتم وصف كل عنصر وظيفي من خلال Given-When-Then (معطى-عندما-حينئذ). \n
- الأتمتة — تتحول السيناريوهات إلى اختبارات آلية يتم تشغيلها كجزء من CI/CD. \n
الآن دعنا نرى كيف يبدو هذا في كود C#.
\n\nأدوات BDD على C#
\n\nلتطبيق BDD في بيئة .NET، هناك أداتان رئيسيتان:
\n\n- \n
- SpecFlow — إطار BDD الأكثر شيوعًا لـ C#. يقوم بتحليل سيناريوهات Gherkin وربطها بالكود. \n
- xUnit / NUnit / MSTest — مشغلات اختبار تنفذ اختبارات BDD. \n
سنستخدم SpecFlow + xUnit. التثبيت بسيط — عبر NuGet:
\n\ndotnet add package SpecFlow\ndotnet add package SpecFlow.xUnit\ndotnet add package xunit\ndotnet add package xunit.runner.visualstudio\n\nبعد التثبيت، أنشئ مجلدًا باسم Features في المشروع — حيث ستتواجد ملفات .feature الخاصة بك مع السيناريوهات.
كتابة أول سيناريو BDD بلغة Gherkin
\n\nGherkin هي لغة وصف السلوك. تستخدم الكلمات المفتاحية: Feature، Scenario، Given، When، Then، And، But.
دعنا نصف سيناريو بسيط: يحاول المستخدم دفع طلب، وإذا كان المبلغ أكبر من 1000 روبل، يتلقى بريدًا إلكترونيًا.
\n\nأنشئ ملفًا باسم Payment.feature في مجلد Features:
Feature: إشعار الدفع\n كعميل\n أرغب في تلقي بريد إلكتروني بعد الدفع\n حتى يكون لدي تأكيد على مشترياتي\n\nScenario: الدفع الناجح الذي يتجاوز 1000 روبل يرسل إشعارًا\n Given عميل برصيد 5000 روبل\n When يقوم العميل بدفع طلب بقيمة 1500 روبل\n Then يجب أن يتلقى العميل إشعارًا عبر البريد الإلكتروني\n\nScenario: الدفع الذي يقل عن 1000 روبل لا يرسل إشعارًا\n Given عميل برصيد 5000 روبل\n When يقوم العميل بدفع طلب بقيمة 500 روبل\n Then يجب ألا يتلقى العميل أي إشعار عبر البريد الإلكتروني\n\nلاحظ: هنا