لماذا لا تنقذ الاختبارات العادية، وما هو BDD
كل مطور iOS واجه موقفًا: كتبت مئات اختبارات الوحدة، التغطية 90%، ولكن في العرض التوضيحي التالي يقول المدير: "لماذا لا يحدث شيء عند الضغط على هذا الزر؟". تنظر إلى الكود - كل شيء يعمل. المشكلة أن اختبارات الوحدة تختبر الكود، وليس سلوك النظام. هنا يأتي دور BDD (التطوير القائم على السلوك) - منهجية تزيل الحدود بين الاختبار "التقني" و"منطق الأعمال".
BDD على Swift ليس مجرد مصطلح عصري. إنها طريقة لكتابة اختبارات بحيث لا يستطيع قراءتها المطور فقط، بل أيضًا المحلل، المختبر، أو حتى العميل. في هذه المقالة، سنشرح كيفية دمج التطوير القائم على السلوك في مشروع iOS الخاص بك باستخدام أطر العمل Quick و Nimble، وسنعرض أمثلة حية على Swift.
ما هو BDD بكلمات بسيطة
تخيل أنك لا تكتب اختبارات، بل سيناريو لفيلم. في السيناريو هناك شخصيات (مستخدم، نظام)، أحداث (ضغط زر، إرسال طلب) ونتيجة متوقعة (ظهور تنبيه، تحديث واجهة المستخدم). BDD هو هذا "السيناريو" لتطبيقك.
الفكرة الأساسية: يجب أن تصف الاختبارات سلوك النظام من وجهة نظر المستخدم. بدلاً من "الطريقة saveUser() ترجع true" تكتب "عندما يدخل المستخدم بريدًا إلكترونيًا صحيحًا ويضغط على 'حفظ'، يعرض النظام رسالة 'تم بنجاح'".
كيف يختلف BDD عن TDD
كثيرون يخلطون بين BDD و TDD (التطوير القائم على الاختبار). الفرق بسيط:
- TDD - نكتب اختبارًا، ثم كودًا، ثم إعادة هيكلة. التركيز على صحة التنفيذ.
- BDD - نكتب سيناريو سلوك، ثم كودًا ينفذ هذا السلوك. التركيز على القيمة للمستخدم.
BDD هو تطور لـ TDD. إذا كان TDD يجيب على سؤال "هل يعمل الكود بشكل صحيح؟"، فإن BDD يجيب على "هل يفعل الكود ما يحتاجه العمل؟".
أدوات BDD على Swift
في عالم Swift، هناك "ركيزتان" رئيسيتان للتطوير القائم على السلوك:
- Quick - إطار عمل لكتابة الاختبارات بأسلوب BDD. يحل محل XCTest القياسي ويوفر صياغة describe/context/it.
- Nimble - مكتبة "المطابقات" (التحقق). بدلاً من XCTAssertEqual تكتب expect(value).to(equal(5)) - وهذا يُقرأ كجملة إنجليزية.
تعمل هذه الأدوات معًا بشكل ممتاز وتسمح بكتابة اختبارات تبدو كمواصفات.
تثبيت Quick و Nimble عبر Swift Package Manager
أضف التبعيات إلى ملف Package.swift أو عبر Xcode: File → Add Packages → أدخل رابط مستودع Quick: https://github.com/Quick/Quick.git و Nimble: https://github.com/Quick/Nimble.git.
مثال لملف Package.swift:
// swift-tools-version:5.9import PackageDescription
let package = Package( name: "MyApp", dependencies: [ .package(url: "https://github.com/Quick/Quick.git", from: "7.0.0"), .package(url: "https://github.com/Quick/Nimble.git", from: "13.0.0"), ], targets: [ .target(name: "MyApp"), .testTarget( name: "MyAppTests", dependencies: ["MyApp", "Quick", "Nimble"] ) ])كتابة أول اختبار BDD على Swift
لنفترض أن لدينا خدمة LoginService بسيطة تتحقق من اسم المستخدم وكلمة المرور. بدلاً من كتابة XCTest ممل، سننشئ اختبارًا بأسلوب BDD.
كود الخدمة (للسياق)
class LoginService { func authenticate(username: String, password: String) -> Result<User, LoginError> { guard !username.isEmpty else { return .failure(.emptyUsername) } guard !password.isEmpty else { return .failure(.emptyPassword) } guard pas