تحليل القيم الحدودية - شرح أكثر

مقال مجاني 15 دقيقة

مقدمة

خليني أسألك سؤال: ما القاسم المشترك بين عمرك عندما تريد أن تفتح حساب Netflix، والمبلغ المطلوب حتى تحصل على خصم، وعدد الحروف المسموحة بكلمة المرور؟

الجواب: كلهم عندهم حدود!

وهذه الحدود، يا صديقي، هي أكتر الأماكن الذي تصبح فيها الـ Bugs! ليش؟ لأنه المبرمجين بشر مثلنا، وأحياناً بيخطئوا بكتابة > بدل >= أو العكس. وهذه الأخطاء الصغيرة ممكن تسبب مشاكل كبيرة!

الأهداف التعليمية

بنهاية هذا الدرس ستكون قادراً على:

  • فهم ما معنى Boundary Value Analysis وليش هو مهم
  • تطبيق الطريقة التقليدية لـ BVA على أمثلة واقعية
  • التشكيك بالتعريف التقليدي وفهم محدودياته
  • استخدام استراتيجيات متقدمة لاكتشاف الحدود المخفية
  • التفكير خارج الصندوق عند اختبار الحدود

الجزء الأول: التعريف التقليدي لـ BVA

ما هو Boundary Value Analysis؟

تحليل القيم الحدودية هو تقنية اختبار تركز على القيم التي موجودة على الحدود وحواليها. الفكرة بسيطة: معظم الأخطاء تصبح عند حواف المدخلات مش بالنص.

تخيل معي إنك عم تختبر موقع يعطي خصم 10% لأي طلب أكتر من 100 دينار. الحد هون هو 100 دينار. القيم الحدودية هي:

  • 99 دينار (قبل الحد بـ 1)
  • 100 دينار (على الحد بالضبط)
  • 101 دينار (بعد الحد بـ 1)

مثال واقعي: التحقق من العمر على Netflix

Netflix تسمح للأطفال فوق 13 سنة يعملوا حساب بدون موافقة ولي الأمر. خلينا نشوف كيف نطبق BVA:

الحد الأدنى: 13 سنة

القيمة النوع النتيجة المتوقعة
12 قبل الحد رفض - يطلب موافقة ولي الأمر
13 على الحد قبول ✅
14 بعد الحد قبول ✅

الحد الأقصى: 120 سنة (مثلاً)

القيمة النوع النتيجة المتوقعة
119 قبل الحد قبول ✅
120 على الحد قبول ✅
121 بعد الحد رفض - عمر غير منطقي

مثال ثاني: خصومات Amazon

موقع يعطي خصومات حسب المبلغ:

  • أقل من 50 دينار: لا يوجد خصم
  • من 50 لـ 99 دينار: خصم 5%
  • من 100 لـ 199 دينار: خصم 10%
  • 200 دينار فأكثر: خصم 15%

حالات الاختبار:

المبلغ (دينار) الخصم المتوقع
49 0%
50 5%
51 5%
99 5%
100 10%
101 10%
199 10%
200 15%
201 15%

العلاقة مع ECP (Equivalence Class Partitioning)

BVA و ECP صحاب! عندما تقسم البيانات لمجموعات متساوية (ECP)، BVA بيجي يقلك: "خد قيمة من كل مجموعة، لكن ركز على القيم على الحدود!"

مثلاً بمثال الخصومات:

  • ECP: أقل من 50، بين 50-99، بين 100-199، 200 فأكتر
  • BVA: اختبر 49، 50، 51، 99، 100، 101، 199، 200، 201
نصيحة
استخدم BVA و ECP مع بعض! ECP يعطيك المجموعات، و BVA يعطيك أهم القيم لتختبرها من كل مجموعة.

الجزء الثاني: كن متشككاً! ما المشكلة مع التعريف التقليدي؟

هسا خليني أحكيلك سر: التعريف التقليدي لـ BVA ناقص!

الفولكلور التقليدي يحكيلك: "اختبر واحد أقل، على الحد، واحد أكتر - وخلصت!"

لكن الواقع أعقد من هيك بكتير!

المشكلة الأولى: أخطاء التقريب (Rounding Errors)

تخيل موقع يعطي خصم لأي طلب أكتر من $10.25. إنت اختبرت:

  • $10.24 ❌ (لا يوجد خصم)
  • $10.25 ✅ (خصم)
  • $10.26 ✅ (خصم)

كل شي تمام، صح؟ غلط!

ما لو كان في Bug بالتقريب؟ ما لو $10.2499999 يتعامل معها النظام على إنها $10.25؟ أو العكس؟

هذا النوع من الأخطاء ممكن يصير مع:

  • الأسعار والعملات
  • النسب المئوية
  • القياسات الفيزيائية
  • الأوقات والتواريخ

المشكلة الثانية: الحدود المخفية (Hidden Boundaries)

مش كل الحدود موجودة بالمواصفات! في حدود مخفية ما أحد حكالك عنها.

مثلاً، فيسبوك بيسمحلك تكتب بوست. ما الحد الأقصى للحروف؟

المواصفات تتحدث: "63,206 حرف"

لكن في حدود أخرى مخفية:

  • حد الميموري المتاح
  • حد سرعة الإنترنت
  • حد معالجة السيرفر
  • حد عرض الشاشة

ماذا يصير لو كتبت 63,206 حرف كلهم إيموجي؟ الإيموجي ياخد مساحة أكبر بالميموري! ممكن يصير Crash!

المشكلة الثالثة: الحدود المتحركة (Moving Boundaries)

في أنظمة، الحدود مش ثابتة!

مثال واقعي من Instagram:

  • بالبداية: ممكن تحمّل 10 صور بالبوست
  • عندما تصير Verified: ممكن تحمّل 20 صورة
  • عندما يكون عندك مليون متابع: القواعد ممكن تتغير!

الحدود هون ديناميكية وتعتمد على سياق المستخدم!

المشكلة الرابعة: الحدود من المواصفات ≠ الحدود الحقيقية

المواصفات تتحدث واحد، والكود يفعل شي ثاني!

المواصفة: "العمر من 18 لـ 65 سنة"

الكود الفعلي:

if (age > 17 && age < 66) {
  // قبول
}

إنت اختبرت 17، 18، 19 ظناً منك إنه الحد هو 18. لكن الحد الحقيقي بالكود هو 17.0001!

تحذير
لا تثق بالمواصفات عمياً! المواصفات ممكن تكون قديمة، ناقصة، أو غلط. الحدود الحقيقية موجودة بالكود، مش بالورق!

الجزء الثالث: طريقة أفضل للتفكير بـ Boundaries!

هسا بعد أن شككنا بالتقليدي، خلينا نشوف طريقة أفضل وأذكى للتعامل مع الحدود!

1. افتراض المحيط (The Perimeter Assumption)

الفكرة التقليدية تتحدث: "لو الأمور أوكي عند الأطراف، غالباً ستكون أوكي جوا"

تخيل قلعة محاطة بسور. لو حطيت جنود على السور كله، ستحمي القلعة. لكن ما لو العدو أصلاً جوا القلعة؟

مثال: موقع يقبل أرقام من 1 لـ 100. إنت اختبرت:

  • 0 ❌
  • 1 ✅
  • 100 ✅
  • 101 ❌

تمام! لكن ما لو في Bug عند الرقم 50؟ أو 33؟ أو -999؟

الدرس المستفاد: اختبار الحدود غير كافٍ! لازم تختبر قيم من جوا، وقيم بعيدة كثير عن الحدود!

2. Heuristics مهمة للاكتشاف

بدل لا تلتزم بـ "واحد أقل، على الحد، واحد أكتر"، استخدم Heuristics ذكية!

أ) Confusable Data - البيانات القريبة من الحد

Low Bridge Heuristic (استعارة الجسر المنخفض):

تخيل شاحنة ارتفاعها 4 متر عم تمر تحت جسر ارتفاعه 4.1 متر. هل ستمر؟ نظرياً: نعم. لكن عملياً:

  • ما لو الشاحنة محملة قليلاً زيادة؟ (4.05 متر)
  • ما لو الطريق فيها مطب قبل الجسر؟ (الشاحنة بترتفع قليلاً)
  • ما لو الإطارات منفوخة زيادة؟
  • ما لو السائق ما مشى بالنص بالضبط؟

تطبيق على الاختبار:

موقع يقبل ملفات لحد 5MB. بدل لا تختبر فقط:

  • 4.99 MB
  • 5.00 MB
  • 5.01 MB

جرّب:

  • 4.9999 MB
  • 5.0001 MB
  • 5MB بالضبط لكن مع اتصال بطيء
  • 5MB مع انقطاع بالاتصال ورجوع
  • 5MB من نوع ملف غريب

ب) Extreme Values - القيم القصوى

مش فقط تتجاوز الحد قليلاً، تجاوزه كتيييير!

مثال: حقل "الاسم" يقبل 50 حرف. بدل 51 حرف، جرّب:

  • 500 حرف
  • 5,000 حرف
  • 50,000 حرف
  • 1,000,000 حرف (هل سيصير Crash؟)

ليش؟ لأنه في فرق بين "الفشل المتوقع" و "الكارثة"!

  • 51 حرف: ممكن يطلع رسالة خطأ حلوة
  • 1,000,000 حرف: ممكن يعلق النظام، يملأ الميموري، يسبب Crash!

ج) Random Data - البيانات العشوائية

البيانات العشوائية ممكن تكشف حدود ما كنت تتوقعها!

مثال من الحياة الحقيقية: موقع حجوزات فنادق. التواريخ لازم تكون من اليوم لحد سنة قدام. الحدود الواضحة:

  • تاريخ اليوم (الحد الأدنى)
  • بعد سنة (الحد الأقصى)

لكن عندما جربوا تواريخ عشوائية، اكتشفوا:

  • 29 فبراير 2024 (سنة كبيسة) - مشكلة!
  • تواريخ مع فروق توقيت مختلفة - مشكلة!
  • تواريخ بصيغ مختلفة (DD/MM vs MM/DD) - مشكلة!

د) Move the Boundaries - حرّك الحدود

في حدود قابلة للتغيير! اختبر تغييرها!

أمثلة:

  • فلاتر البحث: حد السعر من 0 لـ 1000. ماذا يصير لو غيرته لـ 500-600 وبعد ذلك رجعته؟
  • إعدادات العرض: عدد النتائج بالصفحة (10، 20، 50، 100). ماذا يصير لو غيرت من 10 لـ 100 وفي 95 نتيجة بس؟
  • حجم الشاشة: الموقع responsive، يتغيّر عند 768px. ماذا يصير لو صغرت وكبرت الشاشة بسرعة؟

3. دفع الحدود (Pushing the Limits)

مش فقط تختبر الحدود، ادفعها لحد لا تنكسر!

أسئلة مهمة:

ماذا يصير على الجهة الثانية من الحد؟

  • هل في رسالة خطأ واضحة؟
  • هل النظام يتعامل مع الموقف بشكل آمن؟
  • هل المستخدم يفهم ما صار؟

هل الحد ممكن يُخترق؟

مثال: Instagram يسمح 30 Hashtag بالبوست. ما لو:

  • حطيت 30 hashtag بالبوست و 10 بالكومنت الأول؟
  • حطيت 30 hashtag وبعد ذلك عدّلت البوست وزدت 10؟
  • حطيت emoji بدل # قبل الكلمة؟

كيف الفشل بيُتعامل معه؟

  • هل النظام يُرجع لحالة آمنة؟
  • هل البيانات تتخزن ولا تضيع؟
  • هل المستخدم يستطيع يسترجع شغله؟

4. استعارة الجزيرة (The Island Metaphor)

تخيل إنك tester والعميل يحكيلك عن منتجه:

"منتجنا جزيرة فردوسية! كل شي تمام! الشمس مشرقة، الهوا لطيف، الشواطئ نظيفة!"

إنت كـ tester تسأل: "طيب، لا يوجد على أطراف الجزيرة؟"

العميل: "ليش تريد أن تروح للأطراف؟ خليك بالنص!"

إنت: "لكن المستخدمين ممكن يروحوا للأطراف!"

العميل: "ليش؟ في كل شي بيحتاجوه بالنص!"

إنت: "ما لو واحد فضولي؟ ما لو طفل؟ ما لو حد غلط؟"

وهون الفكرة: أحياناً لازم تسبح لحافة العالم حتى تشوف ماذا يصير! ممكن تلاقي:

  • منحدرات خطيرة
  • وحوش مخفية
  • كنوز (features مخفية)
  • طرق سرية

المستخدمين مش دايم يستخدموا المنتج "بالطريقة الصح". في ناس تجرب، بتستكشف، بتغلط، بتخترق. شغلتك إنك تكتشف ماذا يصير عندما يعملوا هيك!

5. لا تدور عليه عند الحدود؟

عند اختبار الحدود، دور على:

أ) Warning Signs & Guard Rails (علامات التحذير والحماية)

  • هل في رسائل تحذير قبل أن الأمور تصير سيئة؟
  • هل في حماية تمنع المستخدم من الوقوع بمشكلة؟

مثال جيد: YouTube عندما بتحمّل فيديو كبير:

  • ✅ يعطيك progress bar
  • ✅ بيحذرك لو الفيديو أكبر من الحد
  • ✅ يعطيك خيار ضغط الفيديو

مثال سيء: موقع يقبل ملفات 10MB لكن لا يحكيلك إلا بعد لا تستنى 5 دقايق تحميل!

ب) Unrecoverability (عدم القدرة على الاستعادة)

ماذا يصير لو الأمور راحت غلط؟ نستطيع نرجع؟

مثال: فورم طويل فيه 50 حقل. كتبت 49 حقل، والحقل الأخير تجاوز الحد. ماذا يصير؟

  • سيء: الفورم يمسح كل شي
  • ⚠️ مقبول: يحذف الحقل الغلط بس
  • ممتاز: يحفظ كل شي ويطلب منك تصلح الحقل الغلط

ج) Security (الأمان)

الأشرار أيضاً بيستكشفوا الحدود!

أمثلة على هجمات عند الحدود:

  1. Buffer Overflow: إرسال بيانات أكبر من الحد لتخريب الميموري
  2. SQL Injection: استخدام حروف خاصة عند الحدود
  3. DOS Attack: إرسال طلبات كتيرة لتعطيل السيرفر
  4. Price Manipulation: محاولة تجاوز حدود الخصومات
تحذير
عند اختبار الحدود، فكّر: "لو أنا شخص سيء، كيف ممكن استغل هذا الحد؟"

د) Worst Case Scenario (أسوأ سيناريو)

ما أسوأ شي ممكن يصير عند الحد؟

مثال: تطبيق بانك بيسمحك تحوّل لحد 10,000 دينار باليوم.

أسوأ السيناريوهات:

  • تحويل 10,000 دينار لحساب غلط - هل ممكن نلغي؟
  • تحويل 10,000.01 دينار - هل سيخصم الزيادة من حسابي؟
  • محاولة تحويل 10,000 دينار مرتين بنفس اللحظة - هل سيمر؟
  • الإنترنت يقطع عندما بتحوّل 10,000 دينار - هل الفلوس راحت ولا لأ؟

أمثلة عملية متقدمة

مثال 1: حقل كلمة المرور

المواصفات: كلمة المرور من 8 لـ 20 حرف

الاختبار التقليدي:

القيمة الطول النتيجة المتوقعة
Pass123 7 رفض ❌
Pass1234 8 قبول ✅
Pass12345 9 قبول ✅
Pass12345678901234567 20 قبول ✅
Pass123456789012345678 21 رفض ❌

الاختبار المتقدم (مع Heuristics):

القيمة السبب ماذا ندور عليه
(مسافات × 8) Confusable - حروف "فاضية" هل يتعامل معها كحروف؟
🔐🔐🔐🔐🔐🔐🔐🔐 Extreme - emoji بدل حروف كل emoji = 4 bytes!
Pass1234' OR '1'='1 Security - SQL Injection هل في حماية؟
كلمة_سر_123456 Unicode - عربي هل يدعم؟ كيف يحسب الطول؟
Pass1234\x00Admin Null byte injection هل بيقطع النص؟
(20 حرف) ثم backspace UI Testing هل الطول بيتحسب صح؟
8 حروف مع copy-paste Confusable هل في مسافات مخفية من النسخ؟

مثال 2: سلة المشتريات

المواصفات: ممكن تضيف من 1 لـ 99 قطعة من أي منتج

الاختبار التقليدي:

  • 0 قطعة ❌
  • 1 قطعة ✅
  • 2 قطعة ✅
  • 99 قطعة ✅
  • 100 قطعة ❌

الاختبار المتقدم:

السيناريو ماذا ندور عليه
أضف 50 قطعة، ثم أضف 50 قطعة أخرى هل سيصير 100؟ كيف يتعامل معها؟
أضف 99 قطعة من 10 منتجات مختلفة 990 قطعة بالمجموع - هل السلة تتحمل؟
أضف 99 قطعة لكن المخزون 50 فقط ما أولوية الحد؟
أضف 99 قطعة، انتظر يوم، أضف واحدة هل في expiry للسلة؟
افتح تبويبين، أضف 50 بكل واحد race condition - ماذا يصير؟
أضف 99، ثم غيّر الكمية من الـ URL Security - هل ممكن أخترق الحد؟
أضف 99 من منتج سعره 0.01 دينار أرخص طلب ممكن - مشاكل بالدفع؟
أضف 99 من منتج سعره 10,000 دينار أغلى طلب ممكن - 990,000 دينار!

مثال 3: تقييم المطاعم (1-5 نجوم)

المواصفات: التقييم من 1 لـ 5 نجوم

الاختبار التقليدي:

  • 0 نجوم ❌
  • 1 نجمة ✅
  • 5 نجوم ✅
  • 6 نجوم ❌

الاختبار المتقدم:

السيناريو ماذا ندور عليه
نقر بين نجمتين (2.5 مثلاً) هل يدعم نص نجمة؟
نقر سريع على كل النجوم هل ياخد آخر قيمة ولا بيخرب؟
إعطاء 5 نجوم ثم التراجع هل ممكن نلغي التقييم؟
إعطاء 1 نجمة بدون كومنت هل التقييم السيء يحتاج تبرير؟
إرسال rating=10 من الـ API مباشرة Security - هل في server validation؟
rating=-1 من الـ API Extreme - قيم سالبة
rating=5.5 من الـ API Confusable - كسور
rating="five" من الـ API Type confusion - نص بدل رقم
1000 شخص يعطوا تقييم بنفس اللحظة Performance - هل المعدل يحسب صح؟

استراتيجية شاملة لاختبار الحدود

حتى تختبر الحدود بشكل صحيح، اتبع هذه الخطوات:

الخطوة 1: اكتشف الحدود (Discover)

  • اقرأ المواصفات - ما الحدود المذكورة؟
  • افحص الـ UI - في حدود مخفية بالواجهة؟
  • جرّب واستكشف - اضغط على كل شي، شوف ماذا يصير
  • اسأل المطورين - في حدود تقنية لا تظهر؟

الخطوة 2: اسأل أسئلة مهمة

  • ليش هذا الحد موجود؟
  • ماذا يصير لو تجاوزناه؟
  • في حدود أخرى مرتبطة؟
  • هل الحد ثابت ولا متغير؟

الخطوة 3: صمم حالات اختبار متنوعة

استخدم مزيج من:

  • ✅ الاختبار التقليدي (±1)
  • ✅ القيم القصوى (Extreme)
  • ✅ البيانات المشوّشة (Confusable)
  • ✅ البيانات العشوائية (Random)
  • ✅ تحريك الحدود (Moving)
  • ✅ اختبار الأمان (Security)

الخطوة 4: راقب النتائج

دور على:

  • رسائل الخطأ
  • الـ Performance
  • استهلاك الموارد
  • سلوك النظام عند الفشل
  • تجربة المستخدم

الخطوة 5: وثّق اكتشافاتك

  • ما الحدود الذي اكتشفتها؟
  • ما المشاكل التي لقيتها؟
  • ما التوصيات للتحسين؟

خلاصة الدرس

Boundary Value Analysis تقنية قوية لاكتشاف الـ bugs عند الحدود

الطريقة التقليدية (±1) هي بداية بس، غير كافية لوحدها

الحدود مش دايم واضحة - في حدود مخفية، متحركة، وديناميكية

استخدم Heuristics مثل Confusable Data, Extreme Values, Random Data

افتراض المحيط خطير - اختبر من جوا أيضاً، مش فقط الأطراف

فكّر كـ hacker - كيف ممكن تخترق الحدود؟

دور على الأمان - الحدود هي خطوط الدفاع الأولى

اسأل "ما أسوأ شي ممكن يصير؟" - Worst case scenarios

الاختبار هو اكتشاف - مش فقط التحقق من المواصفات!


تمرين عملي

هذا تمرين إلك حتى تتمرن:

السيناريو: موقع حجز تذاكر سينما. القواعد:

  • العمر: من 5 لـ 80 سنة
  • عدد التذاكر: من 1 لـ 10 تذاكر
  • السعر: 7 دينار للتذكرة
  • خصم 50% للأطفال تحت 12 سنة
  • خصم 30% لكبار السن فوق 60 سنة

المطلوب منك:

  1. حدد كل الحدود الموجودة بالنظام
  2. صمم حالات اختبار تقليدية (±1)
  3. صمم حالات اختبار متقدمة باستخدام الـ Heuristics اللي تعلمناها
  4. فكّر بحدود مخفية ممكن تكون موجودة
  5. اسأل "ما أسوأ شي ممكن يصير؟" لكل حد

أسئلة تساعدك:

  • ماذا يصير لو واحد عمره 11.9 سنة؟
  • ماذا يصير لو حجزت 10 تذاكر، 5 أطفال و 5 كبار؟
  • ماذا يصير لو حاولت تحجز 100 تذكرة عن طريق الـ API؟
  • ماذا يصير لو الفيلم يبدأ بعد 5 دقايق وحجزت 10 تذاكر؟
  • ماذا يصير لو المقاعد المتاحة 3 لكن وحجزت 10؟

جرّب وفكّر... وبالتوفيق! 🎬

المراجع والمصادر

  • Rapid Software Testing Methodology - James Bach & Michael Bolton
  • "Testing at the Boundaries" - Michael Bolton
  • "The Low Bridge Heuristic" - James Bach
  • Lessons Learned in Software Testing - Kaner, Bach, Pettichord