خلينا نتفق على شي مهم جداً: الاختبارات مش معصومة من الخطأ!
عندما تشوف نتيجة اختبارك "Pass" أو "Fail"، ممكن تكون النتيجة كاذبة! ليش؟ لأنك أنت كمختبر إنسان، وبتغلط، والـ Test Cases اللي بتصممها هي مثل الكود بالضبط - ممكن يكون فيها bugs!
المختبرين بشر، وبنغلط! والـ Test Cases بنصممها احنا، وممكن تكون غلط! فلازم دايماً نشك بنتائجنا ونتأكد منها.
بنهاية هذا الدرس، ستكون قادراً على:
False Positive معناه: الاختبار يقول "Fail" ← لكن المنتج شغال صح!
يعني الاختبار "كذب عليك" وقلك في مشكلة، لكن بالحقيقة لا يوجد مشكلة أصلاً. المشكلة باختبارك أنت، مش بالمنتج!
تخيل إنك تختبر ميزة Login في Instagram:
Test Case: Verify user can login with valid credentials
Test Steps:
1. Open Instagram
2. Enter email: "ahmad@gmail.com"
3. Enter password: "Ahmad1234"
4. Click Login
Expected Result: User should login successfully
Actual Result: ❌ Login failed! Error: "Invalid credentials"
Your Report: 🐛 BUG FOUND - Login system is broken!لكن عندما راجعت الموضوع، اكتشفت إنك كنت تكتب Password غلط (نسيت إنه capital A)! المنتج شغال صح، لكن الـ Test Data اللي استخدمتها كانت غلط!
هذا False Positive ← قلت "Fail" لكن المنتج سليم!
False Positive بخلي المطورين ما يثقوا فيك كمختبر! لو صار معك كثير، سيبطلوا ياخدوا الـ bugs تبعك بجدية.
False Negative معناه: الاختبار يقول "Pass" ← لكن المنتج فيه Bug حقيقي!
يعني الاختبار "طمنك كذب" وقلك كل شي تمام، لكن بالحقيقة في مشكلة خطيرة ما اكتشفتها!
تخيل إنك تختبر نظام الخصومات:
المتطلبات: خصم 10% على الطلبات 100 دولار أو أكثر
Test Case: Verify 10% discount for orders >= $100
Test Steps:
1. Add products worth $150 to cart
2. Go to checkout
3. Check discount applied
Expected Result: 10% discount ($15 off)
Actual Result: ✅ Discount $15 applied! Total = $135
Your Report: ✅ PASS - Discount system works perfectly!لكن انتظر! ما لو في Bug بالكود؟
// الكود الحقيقي فيه خطأ!
if (orderTotal > 100) {// المفروض >= 100
applyDiscount(10);
}المشكلة: الخصم يعمل لـ $150، لكن لا يشتغل لـ $100 بالضبط!
اختبارك نجح لأنك اختبرت $150، لكن لو كنت اختبرت $100 بالضبط كنت اكتشفت الـ Bug!
هذا False Negative ← الاختبار قال "Pass" لكن في Bug حقيقي ما اكتشفته لأنك ما اختبرت الـ boundary!
False Positive = وقت ضايع ← مزعج لكن مش نهاية العالم
False Negative = Bug في Production ← كارثة حقيقية!
| الجانب | False Positive (إنذار كاذب) | False Negative (أمان كاذب) |
|---|---|---|
| التعريف | الاختبار يقول Fail لكن المنتج سليم | الاختبار يقول Pass لكن المنتج فيه Bug |
| من المشكلة؟ | المشكلة بالاختبار نفسه | المشكلة بالمنتج (لكن ما اكتشفناها) |
| النتيجة | وقت ضايع على investigation | Bug يوصل للمستخدمين! |
| التأثير | مزعج للفريق | خطير على المنتج والشركة |
| مستوى الخطورة | 🟡 متوسط | 🔴 عالي جداً |
المختبر بستخدم بيانات غلط بالاختبار:
✅ Correct: test@example.com / Password123
❌ Wrong: test@example.com / password123 (lowercase p)الاختبار فشل ← لكن السبب إنك كتبت password غلط، مش لأنه المنتج فيه مشكلة!
البيئة التي تختبر فيها مختلفة عن Production:
الـ Expected Result اللي حطيته مش صحيح:
Test Case: User login with valid email
Expected Result: Error message "Invalid email format"
لكن هذا غلط! لو الـ email valid، ليش تريد error؟
المشكلة بتصميم الـ Test Case مش بالمنتج!المختبر فاهم الـ requirement غلط:
Requirement: Password must be at least 8 characters
المختبر فهمها: Password must be EXACTLY 8 characters
فاختبر password من 10 characters ← فشل الاختبار!
لكن المنتج شغال صح، المختبر فاهم غلط!الاختبار أسرع أو أبطأ من اللازم:
// الكود بحتاج 2 ثانية لتحميل البيانات
// لكن الاختبار بعد 1 ثانية بس:
click(loginButton);
wait(1000); // waiting 1 second only!
assert(userIsLoggedIn); // ❌ FAIL - too fast!المنتج شغال صح، لكن اختبارك كان مستعجل!
المختبر لكن اختبر الحالات السهلة:
✅ اختبرت: Login with valid email and password
❌ ما اختبرت: Login with SQL injection
❌ ما اختبرت: Login with empty password
❌ ما اختبرت: Login with special characters
❌ ما اختبرت: Login with very long passwordالاختبار نجح ← لكن لأنك ما اختبرت الحالات الصعبة!
ركزنا على السيناريو المثالي ونسينا البقية:
Amazon Example:
- ✅ اختبرت: Add to cart ← works!
- ❌ ما اختبرت: Add to cart مع sold out item
- ❌ ما اختبرت: Add to cart مع network error
- ❌ ما اختبرت: Add to cart بسرعة 10 مرات متتالية
نسينا الحالات الطرفية والـ غريبة:
Testing: User age validation (must be 18-100)
✅ اختبرت: age = 25 ← Pass
✅ اختبرت: age = 18 ← Pass
✅ اختبرت: age = 100 ← Pass
❌ ما اختبرت: age = 17.9999 ← هل بيقبلها؟
❌ ما اختبرت: age = 100.0001 ← هل برفضها؟
❌ ما اختبرت: age = -5 ← ما بصير؟
❌ ما اختبرت: age = "twenty" ← string بدل number!ركزنا على "لا لازم يشتغل" ونسينا "ما لا لازم يشتغل":
Testing: File upload feature
✅ اختبرت: Upload valid image (JPG, 2MB) ← Pass
❌ ما اختبرت: Upload.exe file ← هل بيرفضه؟
❌ ما اختبرت: Upload 500MB file ← هل بيمنعه؟
❌ ما اختبرت: Upload empty file ← ما بصير؟
❌ ما اختبرت: Upload without selecting file ← هل في validation؟"هذا developer شاطر، أكيد كوده صح!" ← خطأ قاتل!
القواعد الذهبية للمختبر الذكي:
قبل لا تقول PASS ← اسأل: "هل اختبرت كل شي؟"
قبل لا تقول FAIL ← اسأل: "هل أنا اللي غلطان؟"
لا تثق بالـ Test Cases ← ممكن تكون فيها bugs!
False Negative أخطر من False Positive ← كن حذر!
الشك ينجيك، الثقة الزايدة تخربك!
"A tester who never doubts their own tests is a tester who will miss critical bugs!"
"مختبر ما بشك بنتائج اختباراته، هو مختبر سيفوت bugs خطيرة!"
بنهاية هذا الدرس، لازم تكون فاهم إنه نتيجة الاختبار مش دايم صحيحة! دورك كمختبر مش فقط تختبر المنتج، لازم أيضاً تختبر نفسك وتتأكد إنك اختبرت صح!
الدرس الجاي رح نحكي عن مفاهيم أخرى مهمة بعالم الـ Testing. استنونا! 🚀