خليني أسألك سؤال: ما القاسم المشترك بين عمرك عندما تريد أن تفتح حساب Netflix، والمبلغ المطلوب حتى تحصل على خصم، وعدد الحروف المسموحة بكلمة المرور؟
الجواب: كلهم عندهم حدود!
وهذه الحدود، يا صديقي، هي أكتر الأماكن الذي تصبح فيها الـ Bugs! ليش؟ لأنه المبرمجين بشر مثلنا، وأحياناً بيخطئوا بكتابة > بدل >= أو العكس. وهذه الأخطاء الصغيرة ممكن تسبب مشاكل كبيرة!
بنهاية هذا الدرس ستكون قادراً على:
تحليل القيم الحدودية هو تقنية اختبار تركز على القيم التي موجودة على الحدود وحواليها. الفكرة بسيطة: معظم الأخطاء تصبح عند حواف المدخلات مش بالنص.
تخيل معي إنك عم تختبر موقع يعطي خصم 10% لأي طلب أكتر من 100 دينار. الحد هون هو 100 دينار. القيم الحدودية هي:
Netflix تسمح للأطفال فوق 13 سنة يعملوا حساب بدون موافقة ولي الأمر. خلينا نشوف كيف نطبق BVA:
الحد الأدنى: 13 سنة
| القيمة | النوع | النتيجة المتوقعة |
|---|---|---|
| 12 | قبل الحد | رفض - يطلب موافقة ولي الأمر |
| 13 | على الحد | قبول ✅ |
| 14 | بعد الحد | قبول ✅ |
الحد الأقصى: 120 سنة (مثلاً)
| القيمة | النوع | النتيجة المتوقعة |
|---|---|---|
| 119 | قبل الحد | قبول ✅ |
| 120 | على الحد | قبول ✅ |
| 121 | بعد الحد | رفض - عمر غير منطقي |
موقع يعطي خصومات حسب المبلغ:
حالات الاختبار:
| المبلغ (دينار) | الخصم المتوقع |
|---|---|
| 49 | 0% |
| 50 | 5% |
| 51 | 5% |
| 99 | 5% |
| 100 | 10% |
| 101 | 10% |
| 199 | 10% |
| 200 | 15% |
| 201 | 15% |
BVA و ECP صحاب! عندما تقسم البيانات لمجموعات متساوية (ECP)، BVA بيجي يقلك: "خد قيمة من كل مجموعة، لكن ركز على القيم على الحدود!"
مثلاً بمثال الخصومات:
هسا خليني أحكيلك سر: التعريف التقليدي لـ BVA ناقص!
الفولكلور التقليدي يحكيلك: "اختبر واحد أقل، على الحد، واحد أكتر - وخلصت!"
لكن الواقع أعقد من هيك بكتير!
تخيل موقع يعطي خصم لأي طلب أكتر من $10.25. إنت اختبرت:
كل شي تمام، صح؟ غلط!
ما لو كان في Bug بالتقريب؟ ما لو $10.2499999 يتعامل معها النظام على إنها $10.25؟ أو العكس؟
هذا النوع من الأخطاء ممكن يصير مع:
- الأسعار والعملات
- النسب المئوية
- القياسات الفيزيائية
- الأوقات والتواريخ
مش كل الحدود موجودة بالمواصفات! في حدود مخفية ما أحد حكالك عنها.
مثلاً، فيسبوك بيسمحلك تكتب بوست. ما الحد الأقصى للحروف؟
المواصفات تتحدث: "63,206 حرف"
لكن في حدود أخرى مخفية:
ماذا يصير لو كتبت 63,206 حرف كلهم إيموجي؟ الإيموجي ياخد مساحة أكبر بالميموري! ممكن يصير Crash!
في أنظمة، الحدود مش ثابتة!
مثال واقعي من Instagram:
الحدود هون ديناميكية وتعتمد على سياق المستخدم!
المواصفات تتحدث واحد، والكود يفعل شي ثاني!
المواصفة: "العمر من 18 لـ 65 سنة"
الكود الفعلي:
if (age > 17 && age < 66) {
// قبول
}إنت اختبرت 17، 18، 19 ظناً منك إنه الحد هو 18. لكن الحد الحقيقي بالكود هو 17.0001!
هسا بعد أن شككنا بالتقليدي، خلينا نشوف طريقة أفضل وأذكى للتعامل مع الحدود!
الفكرة التقليدية تتحدث: "لو الأمور أوكي عند الأطراف، غالباً ستكون أوكي جوا"
تخيل قلعة محاطة بسور. لو حطيت جنود على السور كله، ستحمي القلعة. لكن ما لو العدو أصلاً جوا القلعة؟
مثال: موقع يقبل أرقام من 1 لـ 100. إنت اختبرت:
تمام! لكن ما لو في Bug عند الرقم 50؟ أو 33؟ أو -999؟
الدرس المستفاد: اختبار الحدود غير كافٍ! لازم تختبر قيم من جوا، وقيم بعيدة كثير عن الحدود!
بدل لا تلتزم بـ "واحد أقل، على الحد، واحد أكتر"، استخدم Heuristics ذكية!
Low Bridge Heuristic (استعارة الجسر المنخفض):
تخيل شاحنة ارتفاعها 4 متر عم تمر تحت جسر ارتفاعه 4.1 متر. هل ستمر؟ نظرياً: نعم. لكن عملياً:
تطبيق على الاختبار:
موقع يقبل ملفات لحد 5MB. بدل لا تختبر فقط:
جرّب:
مش فقط تتجاوز الحد قليلاً، تجاوزه كتيييير!
مثال: حقل "الاسم" يقبل 50 حرف. بدل 51 حرف، جرّب:
ليش؟ لأنه في فرق بين "الفشل المتوقع" و "الكارثة"!
- 51 حرف: ممكن يطلع رسالة خطأ حلوة
- 1,000,000 حرف: ممكن يعلق النظام، يملأ الميموري، يسبب Crash!
البيانات العشوائية ممكن تكشف حدود ما كنت تتوقعها!
مثال من الحياة الحقيقية: موقع حجوزات فنادق. التواريخ لازم تكون من اليوم لحد سنة قدام. الحدود الواضحة:
لكن عندما جربوا تواريخ عشوائية، اكتشفوا:
في حدود قابلة للتغيير! اختبر تغييرها!
أمثلة:
مش فقط تختبر الحدود، ادفعها لحد لا تنكسر!
أسئلة مهمة:
مثال: Instagram يسمح 30 Hashtag بالبوست. ما لو:
تخيل إنك tester والعميل يحكيلك عن منتجه:
"منتجنا جزيرة فردوسية! كل شي تمام! الشمس مشرقة، الهوا لطيف، الشواطئ نظيفة!"
إنت كـ tester تسأل: "طيب، لا يوجد على أطراف الجزيرة؟"
العميل: "ليش تريد أن تروح للأطراف؟ خليك بالنص!"
إنت: "لكن المستخدمين ممكن يروحوا للأطراف!"
العميل: "ليش؟ في كل شي بيحتاجوه بالنص!"
إنت: "ما لو واحد فضولي؟ ما لو طفل؟ ما لو حد غلط؟"
وهون الفكرة: أحياناً لازم تسبح لحافة العالم حتى تشوف ماذا يصير! ممكن تلاقي:
المستخدمين مش دايم يستخدموا المنتج "بالطريقة الصح". في ناس تجرب، بتستكشف، بتغلط، بتخترق. شغلتك إنك تكتشف ماذا يصير عندما يعملوا هيك!
عند اختبار الحدود، دور على:
مثال جيد: YouTube عندما بتحمّل فيديو كبير:
مثال سيء: موقع يقبل ملفات 10MB لكن لا يحكيلك إلا بعد لا تستنى 5 دقايق تحميل!
ماذا يصير لو الأمور راحت غلط؟ نستطيع نرجع؟
مثال: فورم طويل فيه 50 حقل. كتبت 49 حقل، والحقل الأخير تجاوز الحد. ماذا يصير؟
الأشرار أيضاً بيستكشفوا الحدود!
أمثلة على هجمات عند الحدود:
ما أسوأ شي ممكن يصير عند الحد؟
مثال: تطبيق بانك بيسمحك تحوّل لحد 10,000 دينار باليوم.
أسوأ السيناريوهات:
المواصفات: كلمة المرور من 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 | هل في مسافات مخفية من النسخ؟ |
المواصفات: ممكن تضيف من 1 لـ 99 قطعة من أي منتج
الاختبار التقليدي:
الاختبار المتقدم:
| السيناريو | ماذا ندور عليه |
|---|---|
| أضف 50 قطعة، ثم أضف 50 قطعة أخرى | هل سيصير 100؟ كيف يتعامل معها؟ |
| أضف 99 قطعة من 10 منتجات مختلفة | 990 قطعة بالمجموع - هل السلة تتحمل؟ |
| أضف 99 قطعة لكن المخزون 50 فقط | ما أولوية الحد؟ |
| أضف 99 قطعة، انتظر يوم، أضف واحدة | هل في expiry للسلة؟ |
| افتح تبويبين، أضف 50 بكل واحد | race condition - ماذا يصير؟ |
| أضف 99، ثم غيّر الكمية من الـ URL | Security - هل ممكن أخترق الحد؟ |
| أضف 99 من منتج سعره 0.01 دينار | أرخص طلب ممكن - مشاكل بالدفع؟ |
| أضف 99 من منتج سعره 10,000 دينار | أغلى طلب ممكن - 990,000 دينار! |
المواصفات: التقييم من 1 لـ 5 نجوم
الاختبار التقليدي:
الاختبار المتقدم:
| السيناريو | ماذا ندور عليه |
|---|---|
| نقر بين نجمتين (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 - هل المعدل يحسب صح؟ |
حتى تختبر الحدود بشكل صحيح، اتبع هذه الخطوات:
استخدم مزيج من:
دور على:
✅ Boundary Value Analysis تقنية قوية لاكتشاف الـ bugs عند الحدود
✅ الطريقة التقليدية (±1) هي بداية بس، غير كافية لوحدها
✅ الحدود مش دايم واضحة - في حدود مخفية، متحركة، وديناميكية
✅ استخدم Heuristics مثل Confusable Data, Extreme Values, Random Data
✅ افتراض المحيط خطير - اختبر من جوا أيضاً، مش فقط الأطراف
✅ فكّر كـ hacker - كيف ممكن تخترق الحدود؟
✅ دور على الأمان - الحدود هي خطوط الدفاع الأولى
✅ اسأل "ما أسوأ شي ممكن يصير؟" - Worst case scenarios
✅ الاختبار هو اكتشاف - مش فقط التحقق من المواصفات!
هذا تمرين إلك حتى تتمرن:
السيناريو: موقع حجز تذاكر سينما. القواعد:
المطلوب منك:
أسئلة تساعدك:
جرّب وفكّر... وبالتوفيق! 🎬