الاختبار الإيجابي مقابل الاختبار السلبي - شرح أكثر

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

مقدمة

خليني أسألك سؤال:

لمّا تيجي تختبر Feature جديدة - مثلاً صفحة تسجيل حساب جديد (User Registration Form) - ما أول شي بتسويه؟

أكيد تذهب تملأ الحقول بطريقة صحيحة:

  • بريد إلكتروني صحيح: ahmed@example.com
  • كلمة سر قوية: MyPassword123!
  • تأكيد كلمة السر: MyPassword123!

وبتدوس "تسجيل" - وترى إذا اشتغل!

هذا اسمه Positive Testing - اختبار الطريق السعيد!

لكن السؤال الأهم: هل هذا كافي؟

طبعاً لأ!

لأنه المستخدمين الحقيقيين مش دايم يعملوا الشيء الصحيح:

  • في ناس بتحط بريد إلكتروني بدون @
  • في ناس بتحط كلمة سر ضعيفة زي 123
  • في ناس تترك الحقول فاضية
  • وفي hackers يحاولوا يخربوا التطبيق!

كل هذه الحالات - اسمها Negative Testing!

اليوم سنفهم بالتفصيل ما الفرق بينهم، ليش Negative Testing مهم جداً، وكيف تفكر فيه صح!

جاهزين؟ يلا نبدأ!


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

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

  • فهم الفرق الواضح بين Positive Testing و Negative Testing
  • معرفة ليش معظم الـ Bugs تختبئ في السيناريوهات السلبية
  • تطبيق الـ 80/20 Rule في الاختبار السلبي
  • التفكير زي المستخدم الحقيقي (مش زي الشروط المكتوبة!)
  • اكتشاف عشرات الحالات السلبية لأي Feature
  • تطبيق التقنيات على قصة حقيقية (User Registration Form)

القصة: نموذج التسجيل - User Registration Form

خلينا نشتغل على مثال حقيقي طول الدرس!

السيناريو: شركتك تبني موقع جديد - زي Souq.com أو أي موقع e-commerce.

وصلتك Story جديدة:

As a new user
I want to create an account
So that I can shop and track my orders

الشروط المطلوبة:

✅ User can register with: email, password, confirm password
✅ Email must be valid format (contains @)
✅ Password must be at least 8 characters
✅ Password and Confirm Password must match
✅ After successful registration, user is redirected to homepage

بسيطة، صح؟

خليني نبدأ نختبرها - بالطريقتين!


Positive Testing: اختبار الطريق السعيد

ما هو Positive Testing؟

Positive Testing = اختبار إنه الـ Feature تعمل صح لمّا المستخدم يعمل الشيء الصحيح!

يعني:

  • بتحط بيانات صحيحة
  • تتبع الخطوات الصحيحة
  • تتوقع نتيجة ناجحة
نصيحة
بالعربي: "لمّا المستخدم يفعل كل شي تمام - هل النظام يعمل؟"

حالات إيجابية - للـ User Registration

خلينا نكتب حالات إيجابية للـ Registration Form:

حالة 1: تسجيل ناجح - كل شي صحيح

الخطوة البيانات النتيجة المتوقعة
1. افتح صفحة التسجيل - الصفحة تظهر بنجاح
2. املأ البريد الإلكتروني ahmed@example.com مقبول
3. املأ كلمة السر MyPassword123! مقبول
4. املأ تأكيد كلمة السر MyPassword123! مقبول
5. اضغط "تسجيل" - ✅ التسجيل نجح، انتقال للصفحة الرئيسية

النتيجة: ✅ PASS - المستخدم سجل بنجاح!


حالة 2: تسجيل ناجح - بريد إلكتروني بصيغ مختلفة

نفس الخطوات، لكن بنجرب أشكال مختلفة من البريد الإلكتروني الصحيح:

البريد الإلكتروني هل صحيح؟
user@example.com ✅ صحيح - Standard
user.name@example.com ✅ صحيح - مع نقطة
user+tag@example.com ✅ صحيح - مع +
user_123@example.co.uk ✅ صحيح - subdomain

كل هذه لازم تنجح!


حالة 3: تسجيل ناجح - كلمات سر قوية بأشكال مختلفة

كلمة السر هل صحيحة؟
MyPassword123! ✅ 8 characters أو أكثر
VeryStrongPassword2024@ ✅ طويلة وقوية
12345678 ✅ 8 characters (لكن ضعيفة - سنحكي عنها بالـ Negative!)

ملاحظة مهمة: 12345678 تقنياً صحيحة لأنها 8 characters - فبالـ Positive Testing لازم تنجح!

لكن هل هي كلمة سر آمنة؟ لأ! هذه مشكلة أخرى - سنحكي عنها!


ما اختبرنا بالـ Positive Testing؟

اختبرنا الـ "Happy Path" - الطريق السعيد:

  • المستخدم دخل بيانات صحيحة
  • النظام قبلها
  • التسجيل نجح
  • المستخدم انتقل للصفحة الرئيسية

كل شي تمام! كل شي شغال!

بس...

هل هذا كافي؟

خليني أقولك قصة حقيقية:


القصة الحقيقية: الـ Bug اللي كلف 6 مليون دولار!

سنة 2012، NASA:

كان عندهم موقع إلكتروني لبيع صور فضائية عالية الدقة - للعلماء والباحثين.

الصور كانت غالية جداً - بعضها بـ $10,000 للصورة الواحدة!

ما صار؟

في شخص ذكي - مش hacker حتى - لكن فاهم قليلاً تكنولوجيا - لاحظ شيء غريب:

لمّا يضيف صورة للسلة (Cart)، السعر كان بيجي من الـ Frontend مش من الـ Backend!

يعني:

  • Frontend يقول: "الصورة ثمنها $10,000"
  • لمّا تدوس "Add to Cart"، Frontend يبعت للـ Backend: {"item_id": 123, "price": 10000}

ما عمل الشخص الذكي؟

فتح الـ Browser DevTools → راح على Network Tab → شاف الـ Request!

عدّل السعر من $10,000 لـ $1!

{
  "item_id": 123,
  "price": 1  // بدل 10000!
}

ورسل الـ Request!

النتيجة: الـ Backend قبل السعر بدون فحص!

اشترى صور بملايين الدولارات بـ $1 للواحدة!

NASA اكتشفت الموضوع بعد فترة - لكن كان خسروا ملايين!


ليش صار هذا؟

لأنه المختبرين اختبروا لكن الـ Positive Testing!

اختبروا:

  • ✅ هل المستخدم يستطيع يضيف صورة للسلة؟
  • ✅ هل السعر الصحيح يظهر؟
  • ✅ هل الدفع يعمل؟

لكن ما اختبروا:

  • ❌ ما لو المستخدم غيّر السعر من الـ Browser؟
  • ❌ هل الـ Backend يفحص السعر؟
  • ❌ ما لو المستخدم حاول يغش؟
تحذير
هذه كلها Negative Testing - واللي ما صار!

Negative Testing: اختبار الطريق غير السعيد

ما هو Negative Testing؟

Negative Testing = اختبار إنه الـ Feature تتصرف صح لمّا المستخدم يعمل الشيء الغلط!

يعني:

  • بتحط بيانات غلط
  • تفعل خطوات غلط
  • تتوقع النظام يرفض أو يعطي Error واضح
نصيحة
بالعربي: "لمّا المستخدم يفعل غلط - عن قصد أو بدون قصد - هل النظام بيحميني؟"

ليش Negative Testing مهم جداً؟

السبب بسيط:

معظم المستخدمين الحقيقيين مش بيتبعوا الشروط المكتوبة!

في 4 أنواع مستخدمين:

1. المستخدم المستعجل:

  • بيملأ الحقول بسرعة
  • ممكن ينسى حقل
  • ممكن يدوس "تسجيل" قبل أن يخلص
  • ممكن يحط معلومات ناقصة

2. المستخدم الذي لا يعرف:

  • أول مرة يستخدم النظام
  • لا يفهم ما المطلوب
  • بيحط بيانات بصيغة غلط
  • مثلاً: بيحط رقم جوال بدل بريد إلكتروني

3. المستخدم الذي يجرب:

  • فضولي - يريد أن يشوف ماذا يصير
  • بيحط بيانات غريبة
  • يدوس على أزرار كثير
  • يجرب حدود النظام

4. المستخدم الخبيث (Bad User / Hacker):

  • عن قصد يحاول يخرّب
  • يحاول يسرق بيانات
  • يحاول يستغل ثغرات
  • يحاول يضر الشركة
تحذير
كل هذه الأنواع - لازم النظام يتعامل معهم صح!

حالات سلبية - للـ User Registration

خلينا نكتب حالات سلبية للـ Registration Form - وشوف كم عددهم!

الفئة الأولى: حقول فاضية (Empty Fields)

الفكرة: ما لو المستخدم ترك حقل فاضي؟

الحالة البيانات النتيجة المتوقعة
TC-N-01 Email: (فاضي)
Password: MyPassword123!
Confirm: MyPassword123!
❌ Error: "البريد الإلكتروني مطلوب"
TC-N-02 Email: user@example.com
Password: (فاضي)
Confirm: MyPassword123!
❌ Error: "كلمة السر مطلوبة"
TC-N-03 Email: user@example.com
Password: MyPassword123!
Confirm: (فاضي)
❌ Error: "تأكيد كلمة السر مطلوب"
TC-N-04 كل الحقول (فاضية) ❌ Error: "يرجى ملء جميع الحقول"

عددهم: 4 حالات سلبية - لكن من الحقول الفاضية!


الفئة الثانية: بريد إلكتروني بصيغة غلط (Invalid Email Format)

الفكرة: ما لو المستخدم حط بريد إلكتروني غلط؟

الحالة البريد الإلكتروني النتيجة المتوقعة
TC-N-05 ahmed (بدون @) ❌ Error: "صيغة البريد الإلكتروني غير صحيحة"
TC-N-06 ahmed@ (@ لكن بدون domain) ❌ Error
TC-N-07 @example.com (domain لكن بدون username) ❌ Error
TC-N-08 ahmed @example.com (مسافة بالنص!) ❌ Error
TC-N-09 ahmed@@example.com (@ مكررة) ❌ Error
TC-N-10 ahmed@example (بدون.com) ❌ Error أو تحذير
TC-N-11 12345 (رقم بس!) ❌ Error
TC-N-12 (رموز غريبة) !@#$%^&*() ❌ Error

عددهم: 8 حالات سلبية - لكن من البريد الإلكتروني!


الفئة الثالثة: كلمة سر ضعيفة (Weak Password)

الفكرة: ما لو المستخدم حط كلمة سر ضعيفة؟

ملاحظة: الشروط تقول "at least 8 characters" - لكن هل هذا كافي؟

الحالة كلمة السر النتيجة المتوقعة
TC-N-13 123 (أقل من 8) ❌ Error: "كلمة السر لازم تكون 8 أحرف على الأقل"
TC-N-14 1234567 (7 characters - أقل بواحد!) ❌ Error
TC-N-15 12345678 (8 characters - لكن كلها أرقام!) سؤال: هل لازم ترفض؟
TC-N-16 aaaaaaaa (8 characters - لكن كلها نفس الحرف!) سؤال: هل لازم ترفض؟
TC-N-17 password (8 characters - لكن كلمة شائعة جداً!) سؤال: هل لازم ترفض؟
تحذير
ملاحظة مهمة جداً: TC-N-15, TC-N-16, TC-N-17 تقنياً صحيحة - 8 characters! لكن من ناحية الأمان - خطيرة جداً!

لا لازم يصير؟

في خيارين:

الخيار 1: نرفضها تماماً

❌ Error: "كلمة السر ضعيفة - لازم تحتوي على أحرف وأرقام ورموز"

الخيار 2: نقبلها لكن نحذر المستخدم

⚠️ Warning: "كلمة السر ضعيفة - ننصح باستخدام كلمة سر أقوى"
(لكن نسمحله يكمل إذا يريد)
نصيحة
أنت كمختبر - لازم تسأل: - ما الـ Business Requirements؟ - ما المقبول؟ - هل نرفض ولا نحذر بس؟ لا تفترض! اسأل!

الفئة الرابعة: كلمة السر والتأكيد مش متطابقين (Password Mismatch)

الحالة Password Confirm Password النتيجة المتوقعة
TC-N-18 MyPassword123! MyPassword456! (مختلفة تماماً) ❌ Error: "كلمتا السر غير متطابقتين"
TC-N-19 MyPassword123! MyPassword123 (بدون !) ❌ Error
TC-N-20 MyPassword123! mypassword123! (حرف صغير!) ❌ Error

ملاحظة: TC-N-20 مهمة جداً!

الفرق لكن حرف كبير/صغير - لكن لازم يكونوا متطابقين تماماً!


الفئة الخامسة: بريد إلكتروني مستخدم من قبل (Duplicate Email)

الفكرة: ما لو المستخدم حاول يسجل ببريد إلكتروني موجود مسبقاً؟

الحالة السيناريو النتيجة المتوقعة
TC-N-21 1. سجل مستخدم ببريد user@example.com
2. حاول تسجل مرة ثانية بنفس البريد
❌ Error: "البريد الإلكتروني مستخدم مسبقاً"
تحذير
ملاحظة أمنية مهمة: بعض الأنظمة لا تحب تقول إنه البريد موجود! ليش؟ لأنه hacker ممكن يستخدم هذه المعلومة يكتشف أي Emails مسجلة! مثال: - Hacker يحاول يسجل بـ ahmed@example.com - النظام يقول: "البريد مستخدم مسبقاً" - يعني Ahmed عنده حساب هون! الحل الأفضل: ℹ️ "إذا كان البريد الإلكتروني موجوداً، ستصلك رسالة تأكيد" هيك لا تفضح إذا البريد موجود ولا لأ! أنت كمختبر - لازم تعرف هذه الأمور وتختبرها!

الفئة السادسة: حقول طويلة جداً (Extremely Long Input)

الفكرة: ما لو المستخدم حط نص طويل جداً؟

الحالة البيانات النتيجة المتوقعة
TC-N-22 Email: aaaaaaa...aaa@example.com (500 حرف) ❌ Error: "البريد الإلكتروني طويل جداً"
TC-N-23 Password: aaaaaaa... (10,000 حرف!) ❌ Error أو يقبل لكن لحد limit معين

ليش هذا مهم؟

1. مشاكل الـ Database:

  • الـ Database ممكن يكون فيها حد أقصى - مثلاً 255 character
  • لو حطيت 10,000 - سيصير Error!

2. مشاكل الأداء:

  • كلمة سر طويلة جداً ستاخد وقت طويل للـ Hashing
  • ممكن يتجمد النظام!

3. هجمات أمنية:

  • في هجوم اسمه Buffer Overflow Attack
  • الـ Hacker بيحط input طويل جداً حتى يخرّب الـ Memory!
تحذير
لازم النظام يحدد حد أقصى ويرفض الزيادة!

الفئة السابعة: رموز خاصة وأحرف غريبة (Special Characters)

الفكرة: ما لو المستخدم حط رموز غريبة؟

الحالة البيانات النتيجة المتوقعة
TC-N-24 Email: <script>alert('hacked')</script>@example.com ❌ Error - XSS Attack attempt!
TC-N-25 Email: user' OR '1'='1'@example.com ❌ Error - SQL Injection attempt!
TC-N-26 Email: user@مثال.com (حروف عربية بالـ domain) قد يكون صحيح! (IDN - Internationalized Domain Names)
TC-N-27 Password: 😀🎉💻🚀 (Emoji!) سؤال: هل نقبلها؟
تحذير
ملاحظات مهمة: TC-N-24 و TC-N-25: هذه محاولات هجوم! لازم النظام: 1. يرفضها تماماً 2. يعمل Sanitization - ينظف الـ Input 3. يسجل المحاولة - ممكن يكون هجوم!
نصيحة
TC-N-27 (Emoji): سؤال فلسفي: هل نسمح بـ Emoji في كلمة السر؟ تقنياً - ممكن! Emoji هي Unicode characters عادية. بس: - هل كل الأنظمة بتدعمها؟ - هل المستخدم سيقدر يكتبها على أجهزة مختلفة؟ قرار الـ Business!

الفئة الثامنة: محاولات متعددة (Multiple Attempts)

الفكرة: ما لو المستخدم حاول يسجل كذا مرة بسرعة؟

الحالة السيناريو النتيجة المتوقعة
TC-N-28 حاول تسجل 100 حساب بـ 1 دقيقة Rate Limiting! ❌ "محاولات كثيرة، انتظر قليلاً"
TC-N-29 دوس على زر "تسجيل" 10 مرات بسرعة لازم يتجاهل الضغطات الزيادة!

ليش هذا مهم؟

1. منع هجمات الـ Bot:

  • Bots تستطيع أن تسجل آلاف الحسابات الوهمية
  • لازم Rate Limiting - حد أقصى للمحاولات

2. منع الـ Double Submission:

  • المستخدم المستعجل يدوس "تسجيل" 5 مرات
  • لو لم يوجد حماية - سيسجل 5 مرات!
  • لازم الزر ينعطل أو نتجاهل الضغطات الزيادة

الفئة التاسعة: مشاكل الشبكة (Network Issues)

الفكرة: ما لو الإنترنت قُطع أثناء التسجيل؟

الحالة السيناريو النتيجة المتوقعة
TC-N-30 1. املأ الحقول
2. اضغط "تسجيل"
3. قطّع الـ WiFi فوراً!
❌ Error واضح: "مشكلة في الاتصال، يرجى المحاولة لاحقاً"
TC-N-31 إنترنت بطيء جداً (Slow 3G) ⏳ Loading Indicator + Timeout بعد وقت معقول

ملاحظات:

TC-N-30: مش المفروض النظام يتجمد أو يطلع Error غريب!

لازم Error واضح ومفيد!

TC-N-31: لازم:

  1. Loading Indicator - المستخدم يعرف إنه في شي عم يصير
  2. Timeout - لو أخذ أكثر من 30 ثانية مثلاً - نوقف ونعطي Error

الفئة العاشرة: مشاكل المتصفح (Browser-Specific Issues)

الفكرة: ما لو المستخدم عطّل JavaScript أو حذف Cookies؟

الحالة السيناريو النتيجة المتوقعة
TC-N-32 عطّل JavaScript في المتصفح لازم يشتغل! (Server-side validation)
TC-N-33 امسح Cookies بعد التسجيل لازم Session يضل شغال (أو نطلب تسجيل دخول)
تحذير
ملاحظة مهمة جداً: TC-N-32: كثير مواقع تعتمد على JavaScript للـ Validation! مثال: javascript if (email.includes('@')) { // Email صحيح } لكن ما لو المستخدم عطّل JavaScript؟ الـ Validation لن يشتغل! الحل: Server-Side Validation - لازم الـ Backend يفحص أيضاً! لا تثق بالـ Frontend أبداً!

خلاصة الحالات السلبية

عديناهم؟ خلينا نعد:

الفئة عدد الحالات
حقول فاضية 4
بريد إلكتروني غلط 8
كلمة سر ضعيفة 5
Password Mismatch 3
Duplicate Email 1
Input طويل جداً 2
Special Characters 4
Multiple Attempts 2
Network Issues 2
Browser Issues 2

المجموع: 33 حالة سلبية!

مقابل كام حالة إيجابية؟ 3 حالات بس!

شايف الفرق؟


الحقيقة المرعبة: معظم الـ Bugs تختبئ في السيناريوهات السلبية!

خليني أشاركك إحصائية حقيقية:

حسب دراسات متعددة في مجال Software Testing:

  • 70-80% من الـ Bugs تنكشف في Negative Testing
  • 20-30% لكن من الـ Bugs تنكشف في Positive Testing

ليش؟

لأنه المطورين - مثلنا كبشر - بيركزوا على "الطريق السعيد"!

لمّا المطور يكتب الكود، يفكر:

  • "المستخدم سيحط بريد إلكتروني صحيح"
  • "المستخدم سيحط كلمة سر صحيحة"
  • "كل شي سيمشي تمام"

لكن الحقيقة مختلفة!

المستخدمين الحقيقيين:

  • ينسوا حقول
  • يحطوا بيانات غلط
  • بيدوسوا أزرار كثير
  • بيجربوا أشياء غريبة
  • وفي hackers يحاولوا يخربوا!

وهون تصبح الـ Bugs!


قاعدة الـ 80/20 في Negative Testing

خليني أعطيك نصيحة ذهبية:

نصيحة
اقضي 80% من وقت الاختبار على Negative Testing و 20% لكن على Positive Testing!

ليش؟

1. الـ Positive Testing سهل:

  • واضح ومباشر
  • المطور غالباً اختبره
  • لا ياخذ وقت كثير

2. الـ Negative Testing صعب:

  • في مئات الاحتمالات
  • المطور غالباً ما فكر فيها
  • هون تجد معظم المشاكل!

3. الـ Negative Testing هو الذي يحمي النظام:

  • من المستخدمين الغلط
  • من الـ Hackers
  • من الكوارث!

كيف تفكر بحالات سلبية؟ - تقنيات عملية

السؤال الكبير: كيف أطلع كل هذه الحالات السلبية؟

إليك 5 تقنيات عملية:

التقنية 1: فكر بالعكس (Inverse Thinking)

لكل شرط - فكر بالعكس!

مثال:

  • Positive: "Email must contain @"
  • Negative: ما لو لا يوجد @؟ ما لو في @ مكررة؟ ما لو @ بالأول أو بالآخر؟

مثال 2:

  • Positive: "Password must be 8 characters"
  • Negative: ما لو أقل من 8؟ ما لو 7 بس؟ ما لو 0؟ ما لو سالب؟

التقنية 2: فكر بالحدود (Boundary Thinking)

لكل حد - اختبر:

  • قبل الحد
  • على الحد بالضبط
  • بعد الحد

مثال: Password length: minimum 8

الحالة القيمة
قبل الحد 7 characters → ❌
على الحد 8 characters → ✅
بعد الحد 9 characters → ✅

سنشرح Boundary Value Analysis بالتفصيل في درس لاحق!

التقنية 3: فكر بالمستخدم السيء (Bad User Mindset)

البس قبعة الـ Hacker!

اسأل نفسك:

  • كيف أقدر أخرب هذا النظام؟
  • كيف أقدر أسرق بيانات؟
  • كيف أقدر أستغل ثغرة؟

أمثلة:

  • ما لو حطيت كود JavaScript بالـ Email؟
  • ما لو حطيت SQL Injection بالـ Password؟
  • ما لو عدّلت الـ Request من الـ Browser؟

التقنية 4: فكر بالمستخدم الغلطان (Clumsy User)

تخيل مستخدم:

  • مستعجل
  • لا يركز
  • مش فاهم التكنولوجيا
  • أول مرة يستخدم

ماذا يسوي؟

  • ينسى يملأ حقول
  • بيحط معلومات بصيغة غلط
  • يدوس على الزر كذا مرة
  • يُرجع للوراء بنص العملية
نصيحة
كل هذه حالات لازم تختبرها!

التقنية 5: استخدم الـ SFDPOT Heuristic

SFDPOT = اختصار لـ:

  • Structure (البنية)
  • Function (الوظيفة)
  • Data (البيانات)
  • Platform (المنصة)
  • Operations (العمليات)
  • Time (الوقت)

لكل واحد - فكر بحالات سلبية!

مثال:

Data:

  • Empty data (فاضي)
  • Invalid data (غلط)
  • Too long (طويل جداً)
  • Special characters (رموز)

Platform:

  • Different browsers (متصفحات مختلفة)
  • Different devices (أجهزة مختلفة)
  • Disabled JavaScript (JS معطّل)

Time:

  • Session timeout (انتهاء الجلسة)
  • Slow network (إنترنت بطيء)
  • Multiple requests (طلبات متعددة)
نصيحة
هذه التقنية تساعدك تطلع عشرات الحالات!

التمرين العملي: Instagram Signup - 20 Negative Cases Challenge!

هسّا جاي دورك!

التحدي:

افتح Instagram (أو أي تطبيق بتحبه - Facebook, Twitter, LinkedIn).

روح على صفحة التسجيل (Signup Page).

مهمتك: طلّع 20 حالة سلبية!

القواعد:

  1. لا تسجل فعلاً! - لكن جرب واكتشف!
  2. استخدم التقنيات التي تعلمناها:
  • فكر بالعكس
  • فكر بالحدود
  • فكر زي Bad User
  • استخدم SFDPOT
  1. اكتب كل حالة بتفصيل:
  • رقم الحالة
  • الخطوات
  • البيانات
  • النتيجة المتوقعة

أمثلة لتبدأ فيها:

Instagram Signup Form فيه:

  • Full Name
  • Username
  • Email or Phone
  • Password
  • Date of Birth

حالات سلبية ممكنة:

1. Full Name:

  • TC-01: Full Name فاضي
  • TC-02: Full Name فيه أرقام لكن (123456)
  • TC-03: Full Name فيه رموز (@#$%)
  • TC-04: Full Name طويل جداً (500 حرف)

2. Username:

  • TC-05: Username مستخدم من قبل
  • TC-06: Username فيه مسافات (user name)
  • TC-07: Username فيه رموز غير مسموحة (@)
  • TC-08: Username أقل من الحد الأدنى (حرف واحد)
  • TC-09: Username أكثر من الحد الأقصى

3. Email/Phone:

  • TC-10: Email بدون @
  • TC-11: Phone Number بحروف
  • TC-12: Email و Phone كلاهما فاضي

4. Password:

  • TC-13: Password أقل من 6 characters
  • TC-14: Password كلها نفس الحرف (aaaaaa)
  • TC-15: Password = Username (نفس القيمة!)

5. Date of Birth:

  • TC-16: تاريخ ميلاد مستقبلي (سنة 2030!)
  • TC-17: عمر أقل من 13 سنة (Instagram لا يسمح!)
  • TC-18: عمر 200 سنة!

6. سيناريوهات معقدة:

  • TC-19: دوس "Sign Up" 10 مرات بسرعة
  • TC-20: قطّع الإنترنت بنص العملية
نصيحة
هسّا دورك - كمّل لـ 20!

نصائح ذهبية للـ Negative Testing

1. لا تخاف تكسر الأشياء!

دورك كمختبر: تكتشف المشاكل قبل المستخدمين!

  • جرب كل شيء غريب
  • حط بيانات مجنونة
  • حاول تخرّب النظام
  • أحسن تلاقي Bug هسّا، مش بعد الـ Production!

2. وثّق كل شي!

كل حالة سلبية - وثّقها!

ليش؟

  • حتى ما تنسَ ما اختبرت
  • حتى غيرك يعرف ما صار
  • حتى تقدر تعيدها بعد ذلك (Regression Testing)

3. رتب الأولويات!

مش كل الحالات السلبية نفس الأهمية!

High Priority:

  • Security (SQL Injection, XSS)
  • Data Loss (حذف بيانات)
  • Payment Issues (مشاكل دفع)

Medium Priority:

  • Validation Errors
  • UI/UX Issues

Low Priority:

  • Edge Cases نادرة جداً
نصيحة
ابدأ بالأهم!

4. فكر بالـ User Journey الكامل!

لا تختبر الـ Feature لحالها!

اختبر:

  • ما قبلها؟
  • ما بعدها؟
  • كيف تأثر على باقي النظام؟

مثال: تسجيل حساب جديد:

  • ما قبلها: في صفحة Login؟ في "Already have an account?"
  • ما بعدها: ينتقل للـ Homepage؟ بيجي Email Verification؟
  • التأثير: بيضاف User للـ Database، يبعت Email، تبدأ Session

كل هذه لازم تختبرها!

5. استخدم الأدوات المساعدة!

في أدوات تساعدك تكتشف حالات سلبية:

1. Fuzzing Tools:

  • تولد بيانات عشوائية وغريبة
  • بتدخلها بالـ Inputs
  • ترى ماذا يصير!

2. Security Testing Tools:

  • Burp Suite - لاختبار الثغرات الأمنية
  • OWASP ZAP - Security Scanner

3. Test Data Generators:

  • بتولدلك بيانات غلط بأشكال مختلفة
  • Emails غلط، أرقام غريبة، نصوص طويلة

سنشرح هذه الأدوات بدروس لاحقة!


الأخطاء الشائعة في Negative Testing

خطأ 1: "Positive Testing كافي - الكود شغال!"

تحذير
غلط! Positive Testing يتأكد إنه الكود يعمل لمّا كل شي صح. لكن الحياة الحقيقية مش دايم صح!

خطأ 2: "سأختبر كل الحالات الممكنة!"

مستحيل!

الحالات السلبية لا نهائية تقريباً!

الحل:

  • رتب الأولويات
  • اختبر الأهم
  • استخدم Risk-Based Testing (سنشرحه لاحقاً)

خطأ 3: "المطور قال الكود صح، لا داعي أختبر"

تحذير
أبداً لا تثق بدون اختبار! حتى أفضل المطورين - يعملوا أخطاء! دورك: تتأكد!

خطأ 4: "سأختبر الـ Edge Cases بس"

لا تنسَ الحالات الشائعة!

مثال:

  • Edge Case: Password بـ 10,000 حرف (نادر!)
  • Common Case: Password فاضية (شائع جداً!)
نصيحة
ابدأ بالشائع - بعد ذلك الـ Edge Cases!

خطأ 5: "لقيت Bug - خلصت!"

لأ!

Bug واحد ممكن يخبي وراه عشرات الـ Bugs!

مثال: لقيت إنه النظام لا يفحص Email format.

ما أيضاً مش عم يفحص؟

  • Password strength؟
  • Input length؟
  • Special characters؟
تحذير
لا تتوقف - كمّل التحقيق!

خلاصة الدرس

اليوم تعلمنا:

1. الفرق بين Positive و Negative Testing

Positive Testing Negative Testing
اختبار الطريق السعيد اختبار الطريق غير السعيد
بيانات صحيحة بيانات غلط
نتوقع نجاح نتوقع رفض أو Error
20-30% من الـ Bugs 70-80% من الـ Bugs

2. ليش Negative Testing مهم جداً

معظم الـ Bugs تختبئ بالسيناريوهات السلبية! ✅ المستخدمين الحقيقيين مش دايم يعملوا الصح ✅ في hackers يحاولوا يستغلوا الثغراتالحماية الحقيقية تأتي من Negative Testing

3. قاعدة الـ 80/20

نصيحة
اقضي 80% من وقتك على Negative Testing!

4. تقنيات اكتشاف الحالات السلبية

فكر بالعكس (Inverse Thinking) ✅ فكر بالحدود (Boundary Thinking) ✅ فكر زي Bad Userفكر زي مستخدم غلطاناستخدم SFDPOT Heuristic

5. أمثلة حقيقية

33 حالة سلبية للـ User Registration Form ✅ مقابل 3 حالات إيجابية بس!

شفت الفرق؟


رسالة أخيرة

عزيزي المختبر،

Negative Testing مش "اختبار إضافي" - هو الاختبار الحقيقي!

لأنه:

  • هو الذي يحمي المستخدمين من الأخطاء
  • هو الذي يحمي الشركة من الخسائر
  • هو الذي يحمي النظام من الـ Hackers
تحذير
لا تستخف فيه أبداً!

تذكر:

"المختبر الكويس مش ما يتأكد إنه الأشياء تعمل - المختبر الكويس هو الذي يتأكد إنه الأشياء لا تنكسر حتى لو المستخدم عمل كل شيء غلط!"

فخور بدورك! أنت خط الدفاع الأول!


التطبيق العملي - الواجب

مهمتك:

1. اختر تطبيق حقيقي:

  • Instagram, Facebook, Amazon, أي تطبيق بتحبه

2. اختر Feature:

  • Login Form
  • Search Bar
  • Add to Cart
  • Post Comment

3. طلّع 20 حالة سلبية:

  • استخدم التقنيات التي تعلمناها
  • رتبهم حسب الأولوية (High, Medium, Low)
  • اكتبهم بتفصيل

4. نفذهم:

  • جرب كل واحد
  • سجل النتيجة (Pass / Fail)
  • لو لقيت Bug - صوّر Screenshot ووثّقه!

5. اكتب تقرير:

  • كام حالة إيجابية؟
  • كام حالة سلبية؟
  • كام Bug لقيت؟
  • ما أخطر Bug؟

بالدرس الجاي:

سنتعلم تقنية جديدة اسمها Equivalence Partitioning - كيف نقسم الـ Input لمجموعات ونختبر بذكاء دون أن نختبر كل حالة ممكنة!

استعدوا - سيكون درس قوي!

إلى اللقاء!