اختبار انتقالات الحالة
اختبار انتقالات الحالة (State Transition Testing) تقنية لتصميم الاختبار من نوع الصندوق الأسود، تناسب السلوك الذي يعتمد على ما حدث من قبل. تنمذج فيها النظام، أو كياناً واحداً يديره كحساب أو طلب أو مستند، حالاتٍ وأحداثاً تنقله بينها، ثم تستخرج حالات الاختبار من هذا النموذج. ففي تسجيل الدخول برمز لمرة واحدة يكون الحساب «غير مسجَّل الدخول» أو «أُرسل الرمز» أو «مسجَّل الدخول» أو «مقفَل»: الرمز الخاطئ يُبقي المستخدم في «أُرسل الرمز» في المرتين الأولى والثانية، ويُقفل الحساب في الثالثة. المُدخل نفسه يعطي نتيجة مختلفة لأن الحالة مختلفة.
جمع تقسيم التكافؤ (Equivalence Partitioning) قيم المدخلات التي يجب أن يعاملها النظام بالطريقة نفسها. ويفعل نموذج الحالات الشيء ذاته مع تاريخ الأحداث: فبدلاً من تجربة كل ترتيب للنقرات، تختبر الحالات القليلة التي يمكن أن يكون فيها النظام، والانتقالات المسموح بها بينها، ورفض الانتقالات الممنوعة.
لماذا يهم
كثير من العيوب الخطيرة لا يظهر إلا بعد تاريخ معيّن من الأحداث: طلب مُلغى يُشحن رغم ذلك، وحساب مقفَل يقبل الرمز الصحيح، وجلسة تبقى بعد تسجيل الخروج. كل مُدخل هنا صالح بمفرده، لذلك لا تكشفها التقنيات التي تفحص مُدخلاً واحداً في كل مرة.
يحوّل نموذج الحالات سير العمل إلى قائمة محدودة من عناصر التغطية (Coverage Items)، أي الحالات والانتقالات، فتستطيع أن تقول بدقة ما اختُبر. كما يكشف بناؤه الثغرات مبكراً: فكل تركيبة من حالة وحدث لم يحددها أحد تصبح سؤالاً لمالك المنتج، لا إخفاقاً في بيئة الإنتاج.
الحالات والأحداث والانتقالات والشروط الحارسة
الحالة (State) وضعٌ يبقى فيه الكيان المنمذَج حتى يحدث شيء ما. والحدث (Event) هو ما يحدث: نقرة، أو وصول رسالة، أو انتهاء مؤقّت. والانتقال (Transition) هو تغيّر الحالة الذي يسببه حدث، ويعدّه منهج ISTQB لحظياً. وقد يُطلق إجراءً (Action) مثل إرسال رسالة SMS، وقد يحمل شرطاً حارساً (Guard Condition) يجب أن يكون صحيحاً كي يحدث الانتقال.
يُكتب وصف الانتقال بالصيغة event [guard] / action، أي «الحدث [الشرط الحارس] / الإجراء»، مع حذف الأجزاء غير الموجودة. وتظهر أهمية الشرط الحارس حين يقود الحدث نفسه إلى حالات مختلفة: «رمز خاطئ [المحاولة الخاطئة الأولى أو الثانية]» يُبقي المستخدم في «أُرسل الرمز»، أما «رمز خاطئ [المحاولة الخاطئة الثالثة]» فيُقفل الحساب. والشرط الحارس مثل عدد المحاولات حدٌّ في حقيقته، فاختبر جانبيه كليهما. وتستخدم الأمثلة هذا المتطلب:
- يطلب المستخدم رمزاً، فيرسل النظام رمزاً من 6 أرقام برسالة SMS صالحاً لمدة 5 دقائق.
- الرمز الصحيح يُدخل المستخدم إلى حسابه، ولا يصلح الرمز إلا لمرة واحدة. وتسجيل الخروج يُنهي الجلسة.
- بعد رمز خاطئ يمكن للمستخدم المحاولة مجدداً، والرمز الخاطئ الثالث على التوالي يُقفل الحساب 30 دقيقة، يمكنه بعدها طلب رمز جديد.
مخطط الحالات وجدول الحالات
يرسم مخطط الحالات (State Diagram)، ويُسمّى أيضاً مخطط انتقالات الحالة، الحالاتِ مربعاتٍ والانتقالاتِ الصالحة أسهماً موسومة. ولمتطلب تسجيل الدخول أربع حالات، من S1 إلى S4، وسبعة انتقالات، من T1 إلى T7. والمخطط سهل المراجعة مع الفريق، لكنه لا يُظهر إلا المسموح به.
| # | من | إلى | الحدث [الشرط الحارس] / الإجراء |
|---|---|---|---|
| 1 | S1 غير مسجَّل الدخولالبداية | S2 أُرسل الرمز | E1 طلب رمز / إرسال رمز من 6 أرقام برسالة SMS |
| 2 | S2 أُرسل الرمز | S3 مسجَّل الدخول | E2 رمز صحيح / فتح جلسة |
| 3 | S2 أُرسل الرمز | S2 أُرسل الرمز | E3 رمز خاطئ [المحاولة الخاطئة الأولى أو الثانية] / عرض المحاولات المتبقيةمسار بديل |
| 4 | S2 أُرسل الرمز | S4 مقفَل | E3 رمز خاطئ [المحاولة الخاطئة الثالثة على التوالي]مسار بديل |
| 5 | S2 أُرسل الرمز | S1 غير مسجَّل الدخولالبداية | E4 انتهاء صلاحية الرمز (بعد 5 دقائق من إرساله)مسار بديل |
| 6 | S3 مسجَّل الدخول | S1 غير مسجَّل الدخولالبداية | E5 تسجيل الخروج / إنهاء الجلسة |
| 7 | S4 مقفَل | S1 غير مسجَّل الدخولالبداية | E6 انتهاء القفل (بعد 30 دقيقة)مسار بديل |
لا تُرسم إلا الانتقالات الصالحة. ويُظهر جدول الحالات أدناه بقية أزواج الحالة والحدث: الانتقالات غير الصالحة، وثغرة واحدة تركها المتطلب مفتوحة.
ويحمل جدول الحالات (State Table) النموذج نفسه في شبكة: صف لكل حالة، وعمود لكل حدث، وفي كل خلية الانتقال وحالته الهدف. ويُظهر الممنوع أيضاً: فالخلية الفارغة، وعلامتها الشَّرطة في الجدول أدناه، انتقال غير صالح، يجب أن يرفض فيه النظام الحدث أو يتجاهله ويبقى في حالته. ويخصّص منهج ISTQB عموداً لكل حدث مع شرطه الحارس، فيأخذ E3 عمودين؛ أما هذا الجدول فيجمع الشرطين الحارسين للحدث E3 في خلية واحدة ليبقى مختصراً.
وملء الجدول يكشف الثغرات. فالمتطلب لا يقول ماذا يحدث إذا طلب المستخدم رمزاً آخر بينما الرمز الأول ما زال صالحاً، لذا تحمل الخلية S2 × E1 سؤالاً لمالك المنتج لا اختباراً.
E1 E2 E3 E4 E5 E6
request correct wrong code sign lock
code code code expires out ends
S1 Signed out T1: S2 - - - - -
S2 Code sent ? T2: S3 T3: S2 [1st,2nd] T5: S1 - -
T4: S4 [3rd]
S3 Signed in - - - - T6: S1 -
S4 Locked - - - - - T7: S1
- invalid transition: refused, the state does not change
? not specified in the requirement: ask the product ownerالتغطية: جميع الحالات، والانتقالات الصالحة، وجميع الانتقالات
حالة الاختبار هنا تسلسلٌ من الأحداث يبدأ من حالة معروفة، مع الحالة والإجراء المتوقعين بعد كل حدث، وغالباً ما تغطي حالة الاختبار الواحدة عدة انتقالات. ويناقش منهج ISTQB للمستوى التأسيسي ثلاثة معايير للتغطية، كلٌّ منها أقوى مما قبله: فبلوغ 100% من معيار لاحق يضمن 100% من المعايير السابقة.
- تغطية جميع الحالات (All States Coverage): عناصر التغطية هي الحالات. وتبلغ حالتا اختبار 100%، هما E1 ثم E2، وE1 ثم E3 ثلاث مرات، لكنهما لا تنفّذان إلا الانتقالات من T1 إلى T4، أي 4 من 7 انتقالات صالحة (57%). فيبقى انتهاء صلاحية الرمز وتسجيل الخروج وانتهاء القفل دون اختبار.
- تغطية الانتقالات الصالحة (Valid Transitions Coverage)، وتُسمّى أيضاً تغطية 0-switch: عناصر التغطية هي الانتقالات الصالحة المفردة، من T1 إلى T7. وهي المعيار الأكثر استخداماً، وبلوغ 100% منها يضمن المرور بكل الحالات أيضاً.
- تغطية جميع الانتقالات (All Transitions Coverage): عناصر التغطية هي كل الانتقالات في جدول الحالات؛ فيُنفَّذ كل انتقال صالح ويُجرَّب كل انتقال غير صالح. ويوصي بها المنهج حداً أدنى للبرمجيات الحرجة للمهمة وللسلامة.
مثال تطبيقي: حالات اختبار الرمز لمرة واحدة
لتحقيق تغطية الانتقالات الصالحة، ابدأ كل حالة اختبار من S1 وتابع الأحداث حتى يُنفَّذ كل انتقال. وتكفي ثلاث حالات اختبار. ويمكن لتسلسل طويل واحد أن يغطي الانتقالات السبعة، لأن T5 وT6 وT7 تعود كلها إلى S1، لكن إخفاقاً مبكراً فيه يمنع تنفيذ كل الانتقالات التي تليه. في TC-03 ينفّذ الرمزان الخاطئان الأول والثاني T3 لأن الشرط الحارس صحيح، وينفّذ الثالث T4.
اكتب كل نتيجة متوقعة بصيغة الحالة والإجراء، لا رسالة الشاشة وحدها: بعد الرمز الخاطئ الثاني يبقى المستخدم في S2 ويرى أن محاولة واحدة متبقية. وتنتظر TC-02 وTC-03 مدة 5 دقائق و30 دقيقة، فاسأل مبكراً هل تسمح بيئة الاختبار بتقصير هذه المدد أو بضبط الساعة.
Every test case starts in S1 Signed out.
ID Events and resulting states Covers
TC-01 E1 -> S2 E2 -> S3 E5 -> S1 T1 T2 T6
TC-02 E1 -> S2 E4 -> S1 T1 T5
TC-03 E1 -> S2 E3 -> S2 E3 -> S2 E3 -> S4 E6 -> S1 T1 T3 T4 T7
Valid transitions coverage: 7 of 7 (100%)
All states coverage: 4 of 4 (100%)اختبار الانتقالات غير الصالحة
من الخلايا الفارغة الـ17 في هذا الجدول لا يمكن إطلاق خمس: فالقفل لا ينتهي إلا في S4، والرمز غير المستخدَم، وهو وحده ما تنتهي صلاحيته، لا يوجد إلا في S2 وS4. علّم هذه الخمس بأنها غير قابلة للاختبار واذكر السبب؛ والـ12 الباقية هي الانتقالات غير الصالحة التي تجرّبها لتغطية جميع الانتقالات.
جرّب انتقالاً واحداً في كل حالة اختبار: فإذا قُبلت محاولة أولى خطأً، فلن يكون النظام في الحالة التي تفترضها المحاولة التالية، فيخفي عيبٌ عيباً آخر، ويسمّي منهج ISTQB ذلك حجب العيوب (Defect Masking)، ويُعرف أيضاً باسم Fault Masking. والنتيجة المتوقعة أن يُرفض الحدث ولا تتغيّر الحالة؛ فتأكّد من الحالة بالحدث التالي أو عبر الواجهة البرمجية (API). وابدأ بالمحاولات الأهم من ناحية الأمان:
- S4 × E2: أثناء القفل، أدخل الرمز الصحيح قبل انتهاء صلاحيته. المتوقع: يبقى الحساب مقفَلاً، ولا تُفتح جلسة.
- S3 × E2: بعد تسجيل الدخول، أرسل الرمز نفسه مرة أخرى. المتوقع: يُرفض، وتبقى جلسة واحدة فقط.
- S1 × E2: أدخل رمزاً بعد انتهاء صلاحيته (T5). المتوقع: يُرفض، ويبقى المستخدم غير مسجَّل الدخول.
- S4 × E1: اطلب رمزاً جديداً أثناء القفل. المتوقع: لا تُرسل رسالة SMS، ويبقى الحساب مقفَلاً.
- S4 × E4: انتظر انتهاء صلاحية الرمز أثناء قفل الحساب. المتوقع: يبقى الحساب مقفَلاً؛ فالانتقال إلى «غير مسجَّل الدخول» يتيح للمستخدم طلب رمز جديد قبل انقضاء الدقائق الـ30 بوقت طويل.
أخطاء شائعة
- نمذجة المسار السعيد وحده ونسيان المهل الزمنية والإلغاء وانتهاء الصلاحية وطريق الخروج من حالات الخطأ مثل «مقفَل».
- اعتبار 100% من تغطية جميع الحالات كافية: ففي نموذج تسجيل الدخول تترك حالتا الاختبار اللتان تبلغانها ثلاثة من الانتقالات السبعة دون اختبار.
- عدم تجربة الأحداث التي يجب أن ترفضها الحالة أبداً، أو تجربة عدة منها في حالة اختبار واحدة، فتُخفي النتيجة الخاطئة الأولى ما بعدها (حجب العيوب).
- اختبار الانتقال المشروط على جانب واحد من شرطه الحارس: المحاولة الخاطئة الأولى دون الثالثة.
- التحقق من الرسالة بدلاً من الحالة: ظهور رسالة «رُفض الطلب» بينما ينتقل الطلب إلى «تم الشحن» إخفاق.
من منظور ضمان الجودة
يبدأ اختبار انتقالات الحالة في تحليل الاختبار: فكلمات مثل الحالة و«بعد» و«حتى» و«فقط عندما» و«لم يعد» في المتطلب تشير إلى نموذج حالات. ارسم المخطط، وابنِ الجدول، وخذ الخلايا الفارغة والمشكوك فيها إلى مالك المنتج. واسأل المطورين عن الانتقالات التي تسمح بها الشيفرة فعلاً، فهي كثيراً ما تختلف عن المتطلب.
احتفظ بجدول الحالات مع حالات الاختبار ضمن مواد الاختبار (Testware)، مع معرّفات ثابتة للحالات والأحداث والانتقالات، واعرض التغطية بهذه المصطلحات: «7 من 7 انتقالات صالحة، وجُرّب 9 من 12 انتقالاً غير صالح». ويذكر تقرير العيب لانتقال فاشل حالة البداية والحدث والحالة المتوقعة والحالة الفعلية.
تمرين عملي
نمذج سير عمل مطالبة النفقات
في أداة للنفقات هذا المتطلب: «تبدأ المطالبة بحالة مسودة، ويمكن لمالكها حذفها ما دامت مسودة أو إرسالها للمراجعة. يعتمد المدير المطالبة المرسلة أو يعيدها إلى المسودة مع ملاحظات. والمطالبة التي تزيد على 5,000 ريال تحتاج أيضاً إلى اعتماد الإدارة المالية بعد المدير. وتدفع الإدارة المالية المطالبات المعتمدة».
ابنِ نموذج الحالات، وصمّم أقل عدد من حالات الاختبار يحقق 100% من تغطية الانتقالات الصالحة، واختر الانتقالات غير الصالحة التي ستجرّبها أولاً. ثم أدخل انتقالاتك في مولّد انتقالات الحالة (State Transition Generator)، انتقالاً في كل سطر مثل Draft --submit--> Submitted، وقارن جدول الحالات واختبارات الانتقالات غير الصالحة التي يولّدها بما أعددته.
إظهار الإجابة النموذجية
الحالات: S1 مسودة (البداية)، وS2 مُرسلة، وS3 بانتظار الإدارة المالية، وS4 معتمدة، وS5 مدفوعة (نهاية)، وS6 محذوفة (نهاية). الانتقالات: T1 من S1 إلى S2 إرسال؛ T2 من S2 إلى S1 إعادة؛ T3 من S2 إلى S4 اعتماد [المبلغ ≤ 5,000]؛ T4 من S2 إلى S3 اعتماد [المبلغ > 5,000]؛ T5 من S3 إلى S4 اعتماد الإدارة المالية؛ T6 من S4 إلى S5 دفع؛ T7 من S1 إلى S6 حذف.
تغطي ثلاث حالات اختبار الانتقالات السبعة والحالات الست كلها: TC-01 (1,200 ريال) إرسال، إعادة، حذف، أي T1 وT2 وT7؛ وTC-02 (5,000.00 ريال) إرسال، اعتماد، دفع، أي T1 وT3 وT6؛ وTC-03 (5,000.01 ريال) إرسال، اعتماد، اعتماد الإدارة المالية، دفع، أي T1 وT4 وT5 وT6. والمبلغان يختبران جانبي الشرط الحارس.
الانتقالات غير الصالحة التي تُجرَّب أولاً، واحد في كل حالة اختبار: دفع مطالبة في S2 (غير معتمدة)؛ دفع مطالبة في S5 مرة أخرى (دفع مزدوج)؛ اعتماد الإدارة المالية لمطالبة في S2 متجاوزةً المدير؛ حذف مطالبة في S4. ويجب أن يُرفض كل منها وتبقى الحالة دون تغيير.
أسئلة: هل يمكن للإدارة المالية إعادة المطالبة، وإلى أي حالة؟ وإذا تغيّر مبلغ مطالبة مُعادة، فهل يُفحص الشرط الحارس من جديد؟
أسئلة شائعة
هل مخطط الحالات هو نفسه المخطط الانسيابي؟
لا. يُظهر المخطط الانسيابي (Flowchart) خطوات عملية بالترتيب. أما مخطط الحالات فيُظهر الأوضاع التي يمكن أن يكون فيها الكائن والأحداث التي تنقله بينها، فقد يقود الحدث نفسه إلى نتائج مختلفة في حالات مختلفة. وكثير من مسارات العمل يحتاج إلى الاثنين: مخطط انسيابي لمسار المستخدم، ونموذج حالات لحالة الكائن.
ما الفرق بين تغطية 0-switch وتغطية 1-switch؟
تنفّذ تغطية 0-switch كل انتقال صالح مفرد. أما تغطية 1-switch فتنفّذ كل زوج من الانتقالات الصالحة المتتالية، مثل T3 يليه T2: رمز خاطئ ثم الرمز الصحيح. ولا تنفّذ حالات الاختبار الثلاث السابقة هذا الزوج أبداً، فلن تكشف عيباً تُبطل فيه محاولةٌ خاطئة واحدة الرمزَ. وتحتاج تغطية 1-switch إلى حالات اختبار أكثر وتتجاوز المعايير الثلاثة في منهج المستوى التأسيسي. ويستطيع مولّد انتقالات الحالة (State Transition Generator) توليد حالات اختبار للاثنين.
متى أستخدم اختبار انتقالات الحالة؟
كلما اعتمدت الاستجابة لحدث على ما حدث قبله: كل ما له حقل حالة (الطلبات والمطالبات والتذاكر)، والحسابات والجلسات، والاشتراكات، والمعالجات متعددة الخطوات، والأجهزة ذات الأوضاع، وموارد الواجهات البرمجية التي تتغيّر حالتها. وحين تعتمد النتيجة على تركيبة المدخلات الحالية وحدها، يكون جدول القرار أنسب.
هل يجب أن أختبر كل انتقال غير صالح؟
التغطية الكاملة لجميع الانتقالات تتطلب تجربة كل انتقال غير صالح يمكن إطلاقه. وخارج البرمجيات الحرجة للمهمة وللسلامة، تختار الفرق عادةً حسب المخاطر: ما يستطيع المستخدم أو عميل الواجهة البرمجية إطلاقه، وما قد يحرّك أموالاً أو بيانات أو صلاحيات وصول. وسجّل ما تتخطاه وسببه.
المراجع
- ISTQB Certified Tester Foundation Level (CTFL) v4.0المنهج التأسيسي لاختبار البرمجيات: مستويات الاختبار وأنواعه وتقنيات تصميم الاختبارات وإدارة الاختبار والأدوات.
- ISTQB Glossaryالتعريفات القياسية لمصطلحات الاختبار — حالة الاختبار واختبار الانحدار والخطورة والأولوية وتحليل القيم الحدّية وغيرها.
تدرّب بأدوات متقن
عرّف الحالات والأحداث، ثم ولّد جدول الانتقالات واختبارات الانتقالات الصالحة/غير الصالحة وتغطية 0-switch/1-switch.
ولّد حالات اختبار منظّمة (المعرّف والعنوان والشروط المسبقة والخطوات والنتيجة المتوقّعة والأولوية) من وصف الميزة وقائمة الحقول.
ولّد القيم الحدّية (min-1 وmin وmin+1 والقيمة الاسمية وmax-1 وmax وmax+1) للقيود الرقمية وقيود الطول.
للتعمّق أكثر
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.