No Account --[Sign Up + Start Trial]--> TrialTrial --[Subscribe]--> ActiveTrial --[Trial Ended, No Payment]--> ExpiredActive --[Cancel]--> CancelledActive --[Payment Failed]--> ExpiredActive --[Pause]--> PausedPaused --[Resume]--> ActiveCancelled --[End of Billing Period]--> ExpiredExpired --[Subscribe Again]--> Active
نصيحة
لاحظ إنه في "حالات مؤقتة" زي "Cancelled" - أنت ألغيت لكن لسه تستطيع أن تشوف لنهاية الشهر الذي دفعته!
مثال عملي #3: طلب أونلاين (E-commerce Order)
هسا نحكي عن شي كلنا نعمله - الطلب من Amazon أو أي موقع تسوق!
الحالات:
Cart - السلة
Checkout - صفحة الدفع
Payment Processing - قيد معالجة الدفع
Confirmed - تم التأكيد
Preparing - قيد التجهيز
Shipped - تم الشحن
Out for Delivery - في الطريق إليك
Delivered - تم التوصيل
Returned - مرتجع
Cancelled - ملغي
Refunded - استرجاع المبلغ
الأحداث:
Add Item (أضف منتج)
Remove Item (احذف منتج)
Proceed to Checkout (اذهب للدفع)
Enter Payment (أدخل بيانات الدفع)
Payment Success (نجح الدفع)
Payment Failed (فشل الدفع)
Prepare Order (جهز الطلب)
Ship (أرسل)
Deliver (سلّم)
Return Request (طلب إرجاع)
Cancel Order (الغِ الطلب)
Refund (أرجع المبلغ)
جدول انتقالات مختصر:
الحالة الحالية
الحدث
الحالة الجديدة
الإجراء
Cart
Proceed to Checkout
Checkout
أظهر صفحة الدفع
Checkout
Payment Success
Confirmed
أرسل إيميل تأكيد
Checkout
Payment Failed
Cart
"فشل الدفع، حاول مرة ثانية"
Confirmed
Cancel (within 1h)
Cancelled
ألغِ الطلب
Shipped
Cancel
Shipped
"لا تستطيع أن تلغي، الطلب طلع!"
Delivered
Return Request (14 days)
Returned
ابدأ عملية الإرجاع
Returned
Refund Approved
Refunded
أرجع المبلغ
سؤال مهم للاختبار: ماذا يصير لو المستخدم حاول يلغي الطلب بعد أن انشحن؟ هذه انتقالة غير صالحة لازم نختبرها!
مثال عملي #4: تسجيل الدخول مع الحجب (Login with Lockout)
هذا المثال كثير مهم لأنه يوضح ليش الحالة (State) مهمة!
الحالات:
Logged Out - مسجل خروج
Attempt 1 Failed - محاولة أولى فاشلة
Attempt 2 Failed - محاولة ثانية فاشلة
Locked - الحساب محجوب (بعد 3 محاولات)
Logged In - مسجل دخول
السيناريو:
User enters WRONG password├─ If in state "Logged Out" ← Go to "Attempt 1 Failed"├─ If in state "Attempt 1 Failed" ← Go to "Attempt 2 Failed"└─ If in state "Attempt 2 Failed" ← Go to "LOCKED" (احجب الحساب!)
جدول الانتقالات:
الحالة الحالية
الحدث
الحالة الجديدة
الإجراء
Logged Out
Correct Password
Logged In
"مرحبا!"
Logged Out
Wrong Password
Attempt 1 Failed
"خطأ في الباسورد"
Attempt 1 Failed
Correct Password
Logged In
"مرحبا!"
Attempt 1 Failed
Wrong Password
Attempt 2 Failed
"تحذير: محاولة 2 من 3"
Attempt 2 Failed
Correct Password
Logged In
"مرحبا!"
Attempt 2 Failed
Wrong Password
Locked
"حسابك محجوب لمدة 30 دقيقة"
Locked
Any Password
Locked
"حسابك محجوب"
Locked
30 Minutes Passed
Logged Out
أعد تعيين العداد
Any State
Logout
Logged Out
امسح السيشن
هذا المثال يوضح إنه نفس الحدث (Wrong Password) يعطي نتائج مختلفة حسب الحالة الحالية!
كيف نستخرج حالات الاختبار؟
عندنا مستويات مختلفة من التغطية (Coverage):
1. All States Coverage (0-switch)
اختبر كل حالة مرة واحدة على الأقل
مثال من ATM:
حالة اختبار تزور "Idle"
حالة اختبار تزور "Card Inserted"
حالة اختبار تزور "Authenticated"
إلخ...
هذه أضعف تغطية، لكن أحسن من لا شي!
2. All Transitions Coverage (1-switch)
اختبر كل انتقال مرة واحدة على الأقل
مثال من Login:
✅ Test: Logged Out ← (Correct Password) ← Logged In
✅ Test: Logged Out ← (Wrong Password) ← Attempt 1
✅ Test: Attempt 1 ← (Wrong Password) ← Attempt 2
✅ Test: Attempt 2 ← (Wrong Password) ← Locked
هذه تغطية قوية ومنطقية!
3. All Paths Coverage (N-switch)
اختبر كل مسار ممكن من البداية للنهاية
تحذير
هذه التغطية ممكن تكون مستحيلة لو عندك حلقات (loops) أو مسارات لا نهائية!
4. Invalid Transitions Testing
هذا الأهم! اختبر الانتقالات التي ما المفروض أن تصير!
أمثلة:
❌ Ship order while still in "Cart" (اشحن طلب لسه في السلة!)
❌ Withdraw money without entering PIN (اسحب مصاري بدون رمز!)
❌ Cancel order after it's delivered (ألغِ طلب بعد أن وصل!)
❌ Login while already logged in (سجل دخول وأنت مسجل!)
النظام المفروض يرفض هذه الطلبات أو يتعامل معها بشكل صحيح!
الانتقالات غير الصالحة (Invalid Transitions) - مهم جداً!