ما هو Quick/Nimble ولماذا تحتاجهما؟
Quick و Nimble هما مكتبتان متكاملتان للغة Swift، مصممتان لكتابة الاختبارات بأسلوب التطوير القائم على السلوك (BDD). BDD هي منهجية تطوير تركز على سلوك التطبيق من وجهة نظر المستخدم، وليس على التفاصيل التقنية للتنفيذ. بدلاً من العبارات الجافة مثل XCTAssertEqual(a, b)، تصف ما يجب أن يحدث: "عندما يضغط المستخدم على الزر، يجب أن يعرض التطبيق رسالة ترحيب".
Quick هو إطار عمل لوصف سيناريوهات الاختبار. يوفر لغة خاصة بالمجال (DSL) تسمح بتنظيم الاختبارات في هيكل هرمي: describe (وصف السياق)، context (توضيح الشروط)، و it (اختبار محدد). هذا يجعل الاختبارات قابلة للقراءة والفهم حتى لأعضاء الفريق غير التقنيين (المديرين، المحللين).
Nimble هي مكتبة لكتابة المطابقات (assertions). بدلاً من XCTAssert القياسية، تستخدم تراكيب تعبيرية: expect(value).to(equal(expected))، expect(array).to(contain(element)). توفر Nimble عشرات المطابقات المدمجة وتسمح بإنشاء مطابقات مخصصة بسهولة.
لماذا تحتاج هذا؟
- قابلية القراءة: تبدو اختبارات BDD وكأنها مواصفات. يمكنك عرضها على العميل للتأكد من فهم المتطلبات بشكل صحيح.
- التنظيم: يساعد الهيكل الهرمي
describe/context/itفي تنظيم الاختبارات منطقياً، وتجنب "كود السباغيتي". - مطابقات تعبيرية: تجعل Nimble التأكيدات أكثر وضوحاً وغنى بالمعلومات. تصبح أخطاء الاختبار مفهومة فوراً.
- سهولة التصحيح: عند فشل الاختبار، لا ترى فقط "متوقع 5، تم الحصول على 3"، بل السياق الكامل: "عندما يدخل المستخدم كلمة مرور خاطئة، يجب أن يعرض النظام خطأ".
تثبيت Quick/Nimble
يتم تثبيت Quick و Nimble عبر CocoaPods أو Swift Package Manager (SPM). سنستعرض كلا الطريقتين.
التثبيت عبر CocoaPods
إذا كنت لا تستخدم CocoaPods بعد، قم بتثبيته:
sudo gem install cocoapods
في جذر مشروعك، أنشئ ملف Podfile وأضف إليه:
target 'YourAppName' do
# التبعيات العادية (إن وجدت)
use_frameworks!
target 'YourAppNameTests' do
inherit! :search_paths
pod 'Quick'
pod 'Nimble'
end
end
ثم نفذ:
pod install
بعد ذلك، افتح ملف .xcworkspace.
التثبيت عبر Swift Package Manager (SPM)
في Xcode: File → Add Packages... وأدخل عنوان المستودع:
https://github.com/Quick/Quick.git
https://github.com/Quick/Nimble.git
اختر أحدث إصدار ثابت وأضف الحزم إلى هدف الاختبار الخاص بك (YourAppNameTests).
بداية سريعة: أول اختبار
لننشئ كلاساً بسيطاً Calculator ونختبره.
الكاس المراد اختباره
// Calculator.swift
import Foundation
class Calculator {
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
func subtract(_ a: Int, _ b: Int) -> Int {
return a - b
}
func multiply(_ a: Int, _ b: Int) -> Int {
return a * b
}
}
الاختبار باستخدام Quick و Nimble
// CalculatorSpec.swift
import Quick
import Nimble
@testable import YourAppName // استبدل باسم تطبيقك
class CalculatorSpec: QuickSpec {
override func spec() {
describe("Calculator") {
var calculator: Calculator!
beforeEach {
calculator = Calculator(