الحالات الحدّية والحالات الطرفية

الحالة الحدّية (Edge Case) اختبار يكون فيه مُدخل واحد أو شرط واحد عند طرف أقصى — لا شيء إطلاقاً، أو أكبر قيمة مسموحة، أو أول يوم صالح أو آخره — بينما يبقى كل ما عداه معتاداً. أما الحالة الطرفية (Corner Case) فتجمع طرفين أو أكثر معاً. ففي نموذج بطاقة هدية، تُعدّ رسالة من ⁦150⁩ حرفاً بالضبط، وهو الحد الأقصى، حالةً حدّية؛ والرسالة نفسها على بطاقة تُسلَّم اليوم، وهو أبكر تاريخ مسموح، حالةً طرفية.

المصطلحان من لغة الصناعة لا من تقنيات منهج ISTQB، وتختلف الفرق قليلاً في رسم الحد بينهما. والمهم هو العادة: بعد نجاح الاختبارات الإيجابية والسلبية المعتادة، ادفع كل مُدخل إلى أطرافه، ثم اجمع الأطراف التي يتفاعل بعضها مع بعض.

لماذا يهم

تُبنى الميزات وتُجرَّب ببيانات معتادة، لذا تصل الأطراف إلى شيفرة نادراً ما تعمل: فرع القائمة الفارغة، أو طول يُحسب بوحدة خاطئة، أو تاريخ يُحسب بالمنطقة الزمنية للخادم بدلاً من منطقة المستخدم. وهذه العيوب تجتاز كل اختبار معتاد، ثم تسبّب إخفاقاً لأول عميل يقع طلبه في ⁦29⁩ فبراير.

وبالنسبة إلى المختبِر، تصل أطراف قليلة مختارة عمداً إلى شيفرة لا تلمسها البيانات المعتادة، وتكشف ثغرات في المتطلبات التي نادراً ما تقول ماذا يحدث للقيم الفارغة أو الضخمة أو للأطراف المجتمعة.

طرف واحد، أو عدة أطراف معاً

تخيّل كل مُدخل محوراً يمتد من أصغر قيمه إلى أكبرها. الاختبار المعتاد يقع في منتصف كل المحاور. والحالة الحدّية تنقل محوراً واحداً إلى أحد طرفيه، فيدلّ الإخفاق على مُدخل واحد. أما الحالة الطرفية فتنقل محورين أو أكثر إلى أطرافها معاً، وهناك تختبئ التفاعلات: كل طرف يعمل وحده، واجتماعها لا يعمل.

في نموذج بطاقة الهدية، الرسالة اختيارية وطولها حتى ⁦150⁩ حرفاً، والتسليم من اليوم حتى ⁦90⁩ يوماً قادمة. الرسالة الفارغة حالة حدّية، والتسليم اليوم حالة حدّية، واجتماعهما حالة طرفية. وقد تكون الحالة الحدّية صالحة أو غير صالحة: رسالة من ⁦150⁩ حرفاً يجب قبولها، ومن ⁦151⁩ حرفاً يجب رفضها برسالة خطأ واضحة.

وتتضاعف الحالات الطرفية بسرعة: عشرة مُدخلات لكل منها طرفان تعطي ⁦1,024⁩ تركيبة يكون فيها كل مُدخل عند أحد طرفيه. فاختبر الحالات الطرفية التي تلتقي فيها المُدخلات في عملية حساب أو سجل أو مُخرَج واحد.

نموذج بطاقة الهدية، طول الرسالة × تاريخ التسليم: الحالة المعتادة في المنتصف، وأربع حالات حدّية تنقل مُدخلاً واحداً إلى طرفه، وأربع حالات طرفية تنقل المُدخلَين معاً.
طول الرسالةتاريخ التسليم
اليومأبكر تاريختاريخ معتادداخل النطاقاليوم ⁦90⁩آخر تاريخ
فارغة⁦0⁩ حرفحالة طرفيةطرفان معاًحالة حدّيةطرف واحدحالة طرفيةطرفان معاً
معتادةرسالة قصيرةحالة حدّيةطرف واحدمعتادةبلا طرفحالة حدّيةطرف واحد
الحد الأقصى⁦150⁩ حرفاًحالة طرفيةطرفان معاًحالة حدّيةطرف واحدحالة طرفيةطرفان معاً
  • معتادة: لا مُدخل عند طرف
  • حالة حدّية: مُدخل واحد عند طرف والآخر معتاد
  • حالة طرفية: المُدخلان عند طرفيهما معاً

تعرض الشبكة الأطراف الصالحة. وكل حالة حدّية تُختبر أيضاً خارج النطاق مباشرةً: ⁦151⁩ حرفاً، وأمس، واليوم ⁦91⁩.

أين تبحث: خمس عائلات من الأطراف

اكتشاف الحالات الحدّية يحتاج إلى قائمة تحقق لا إلى إلهام. مرّر كل مُدخل وكل قيمة مخزَّنة وكل مُخرَج على خمس عائلات.

  • الفراغ: نص فارغ، ومسافات فقط، و0، وقائمة فارغة، وملف حجمه ⁦0⁩ بايت، وحقل تاريخ متروك دون تعبئة.
  • القيمة null والحقل الغائب: "note": null و"note": "" وطلبٌ بلا الحقل note ثلاثة مُدخلات مختلفة لواجهة API. يجب ألا يُسقط أيٌّ منها الخدمة أو يُظهر «null» على الشاشة.
  • الحد الأدنى والحد الأقصى: الحد بالضبط وما يتجاوزه بواحد، وعنصر واحد، وأكبر عدد أو حجم ملف مسموح، وكلمة طويلة بلا مسافات، وأكبر رقم يستوعبه نوع البيانات.
  • اليونيكود (Unicode): العربية والديفاناغاري، واتجاه نص مختلط، والتشكيل، ومسافة صفرية العرض، وأرقام عربية مشرقية مثل ١٢٣، واسم ملف بالعربية، ورمز تعبيري بلون بشرة. فرمز الإبهام المرفوع بلون بشرة متوسط، U+1F44D U+1F3FD، محرف مرئي واحد، لكنه نقطتا ترميز وأربع وحدات UTF-16 وثمانية بايتات UTF-8، لذا تختلف الحدود المحسوبة بالمحارف المرئية أو بوحدات الترميز أو بالبايتات على النص نفسه.
  • التاريخ والوقت: منتصف الليل، ونهاية الشهر والسنة، و⁦29⁩ فبراير (سنة ⁦2028⁩ كبيسة وسنة ⁦2100⁩ ليست كبيسة)، وأول يوم مسموح وآخره، ومنطقة زمنية أخرى، وتغيير التوقيت الصيفي. والمنطقتان Asia/Riyadh (⁦UTC+03:00⁩) وAsia/Kolkata (⁦UTC+05:30⁩) بلا توقيت صيفي، فالفريق الذي يختبر هناك فقط لا يصادف هذا التغيير أبداً.
العائلات الخمس من الأطراف مطبّقةً على النصوص والأرقام والتواريخ والقوائم أو الملفات: معنى «لا شيء» و«الأصغر والأكبر» و«المحتوى غير المعتاد» لكل نوع من المُدخلات.
نوع المُدخللا شيءفارغ، null، غائبالأصغر والأكبرالحد الأدنى والأقصىمحتوى غير معتاداليونيكود والتاريخ والوقت
النص""، ومسافات فقط، وnull، وحقل غائبالحد بالضبط، وما يتجاوزه بواحد، وكلمة طويلة بلا مسافاتالعربية والديفاناغاري، واتجاه مختلط، ورمز تعبيري بلون بشرة، ومسافة صفرية العرض
الرقم0، وnull، وحقل غائبالحد وما يتجاوزه بواحد، وأكبر قيمة يستوعبها النوعأرقام عربية مشرقية ١٢٣
التاريخ والوقتحقل تاريخ متروك دون تعبئة، وnullأول يوم مسموح وآخره، ونهاية الشهر والسنةمنتصف الليل، و⁦29⁩ فبراير، ومنطقة زمنية أخرى، وتغيير التوقيت الصيفي
القائمة أو الملفقائمة فارغة، وملف حجمه ⁦0⁩ بايتعنصر واحد، وأكبر عدد أو حجم مسموحاسم ملف بالعربية

جرّبها: مولّد الحالات الحدّية جرّبها: مولّد مجموعات بيانات Unicode جرّبها: مولّد بيانات اختبار التواريخ

الحالات الحدّية ليست هي القيم الحدّية

رغم تشابه الاسمين بالعربية، فهما فكرتان مختلفتان. في مصطلحات ISTQB، القيمة الحدّية (Boundary Value) هي أصغر قيمة أو أكبر قيمة في قسم تكافؤ مرتب. وقسم التكافؤ (Equivalence Partition) مجموعة من القيم يُفترض أن يعاملها النظام بالطريقة نفسها، مثل كل أطوال الرسالة الصالحة من ⁦0⁩ إلى ⁦150⁩ حرفاً؛ ويكون القسم مرتباً حين يمكن ترتيب قيمه من الأصغر إلى الأكبر. أما تحليل القيم الحدّية، وهو التقنية المبنية على القيم الحدّية، فسيأتي في وحدة تصميم الاختبار. والفكرتان تتداخلان، لكن أيّاً منهما لا تحتوي الأخرى.

  • كثير من الحالات الحدّية قيم حدّية: ⁦0⁩ و⁦150⁩ حرفاً طرفا الطول الصالح للرسالة، و⁦151⁩ أول طول غير صالح.
  • بعض الحالات الحدّية لا ترتيب لها، فلا حدود لها: null، والرمز التعبيري، والنص مختلط الاتجاه.
  • بعض القيم الحدّية ليست أطرافاً: رسوم التوصيل التي تتغير عند ⁦100.00⁩ ريال لها حدّ داخل النطاق الصالح.
  • تحليل القيم الحدّية منهجي ويتيح قياس التغطية. أما الحالات الحدّية فتأتي من قوائم التحقق والخبرة، كما في تقنيتين قائمتين على الخبرة في منهج ISTQB ستلقاهما في وحدة تصميم الاختبار: تخمين الأخطاء (Error Guessing)، الذي يتوقع الأخطاء والعيوب والإخفاقات المحتملة اعتماداً على معرفة المختبِر، والاختبار القائم على قوائم التحقق (Checklist-based Testing).

مثال تطبيقي: بطاقة الهدية

المتطلب: «الرسالة اختيارية وطولها حتى ⁦150⁩ حرفاً. التسليم من اليوم حتى ⁦90⁩ يوماً قادمة. تُرسل البطاقة بالبريد الإلكتروني الساعة ⁦09:00⁩ بتوقيت المنطقة الزمنية للمستلم في تاريخ التسليم». اكتب الحالات الحدّية لكل مُدخل، ثم اجمع الأطراف التي تلتقي في مُخرَج واحد.

  • حالات الرسالة الحدّية: فارغة ← بلا فقرة رسالة، ولا تظهر «null» أبداً؛ ⁦150⁩ ← تظهر كاملة؛ ⁦151⁩ ← مرفوضة مع ذكر الحد؛ نص عربي ورمز تعبيري بلون بشرة ← يظهران سليمين.
  • حالات التاريخ الحدّية: اليوم واليوم ⁦90⁩ ← مقبولان؛ و⁦29⁩ فبراير ⁦2028⁩ متى وقع ضمن مدة ⁦90⁩ يوماً ← مقبول؛ أمس واليوم ⁦91⁩ ← مرفوضان.
  • حالة طرفية، الطول × اليونيكود: ⁦150⁩ محرفاً مرئياً، بعضها رموز تعبيرية. إذا أظهر العدّاد ⁦150/150⁩ ثم رفض الخادم الرسالة أو قطع رمزاً تعبيرياً من منتصفه، فالعدّاد والخادم يعدّان بوحدتين مختلفتين، وهذا عيب.
  • حالة طرفية، اليوم × وقت الإرسال: التسليم اليوم، والطلب الساعة ⁦11:00⁩ بتوقيت المستلم بعد أن مرّت الساعة ⁦09:00⁩ لديه. المتطلب صامت: هل تُرسل فوراً أم يُرفض الطلب؟ اسأل مالك المنتج.
  • حالة طرفية، اليوم ⁦90⁩ × المنطقة الزمنية: في الساعة ⁦23:30⁩ بالرياض يختار مُرسِل اليوم ⁦90⁩ لمستلم في كولكاتا، حيث الساعة ⁦02:00⁩ من اليوم التالي. هل تُحسب مدة ⁦90⁩ يوماً من «اليوم» لدى المُرسِل أم لدى المستلم؟

جرّبها: عدّاد طول السلاسل النصية جرّبها: محوّل المناطق الزمنية

أخطاء شائعة

  • معاملة «الحالة الحدّية» كاسم للمُدخل غير الصالح؛ فكثير من الحالات الحدّية صالحة ويجب قبولها.
  • الاختبار بنص إنجليزي فقط، فلا تُجرَّب أبداً الحدود المحسوبة بالبايتات أو بوحدات الترميز، ولا عرض النص مختلط الاتجاه.
  • اختبار الأطراف منفردةً فقط، أو جمعها كلها بدلاً من الحالات الطرفية التي تتفاعل فيها المُدخلات.
  • اختبار التواريخ في المنطقة الزمنية للفريق فقط، وفي أيام عادية.
  • معاملة null والنص الفارغ والحقل الغائب كحالة واحدة.
  • تخمين النتيجة المتوقعة حين يصمت المتطلب، بدلاً من السؤال وتسجيل الإجابة.

من منظور ضمان الجودة

تبدأ الحالات الحدّية أثناء التنقيح (Refinement): اسأل عن كل حقل ماذا يحدث حين يكون فارغاً، وما أكبر قيمة مدعومة، وبأي منطقة زمنية يُقرأ التاريخ. وتتحول الإجابات إلى معايير قبول. وفي المثال التطبيقي انتهت حالتان طرفيتان من ثلاث بأسئلة، وهذا شائع: فالمتطلبات تصف الحالات المعتادة.

سجّل بيانات دقيقة: النص مع طوله وطريقة عدّه، والوقت مع منطقته الزمنية. فعبارة «رسالة من ⁦150⁩ حرفاً تنتهي برمزين تعبيريين» يمكن إعادة إنتاجها، أما «رسالة طويلة» فلا. واحتفظ بقائمة تحقق للفريق بالعائلات الخمس، ووسّعها كلما كشف عيب في بيئة الإنتاج طرفاً جديداً.

تمرين عملي

استخرج الحالات الحدّية والطرفية لنموذج حجز

المطلوب

يقول تطبيق عيادة: «يُدخل المريض اسمه الكامل (من ⁦2⁩ إلى ⁦60⁩ حرفاً) وملاحظة اختيارية (حتى ⁦300⁩ حرف)، ويحجز موعداً من الغد حتى ⁦30⁩ يوماً قادمة، كل ⁦15⁩ دقيقة من ⁦08:00⁩ حتى ⁦16:45⁩ بتوقيت العيادة (Asia/Riyadh). تُرسل رسالة نصية (SMS) للتذكير قبل الموعد بـ⁦24⁩ ساعة».

اكتب ثماني حالات حدّية على الأقل وثلاث حالات طرفية، ولكل منها نتيجة متوقعة، أو سؤال حين يصمت المتطلب.

الخطوات
  1. اكتب المُدخلات والمُخرَجات، ومنها رسالة التذكير النصية.
  2. مرّر كل مُدخل على العائلات الخمس.
  3. اكتب النتيجة المتوقعة لكل حالة حدّية، صالحة كانت أم غير صالحة.
  4. اجمع الأطراف التي تلتقي في عملية حساب أو مُخرَج واحد.
إظهار الإجابة النموذجية
الإجابة النموذجية

الحالات الحدّية: اسم من ⁦2⁩ ومن ⁦60⁩ حرفاً مقبول؛ والاسم الفارغ والاسم من حرف واحد ومن ⁦61⁩ حرفاً والمسافات فقط مرفوضة؛ والأسماء العربية وأسماء الديفاناغاري تظهر صحيحة. الملاحظة الفارغة تظهر بلا ملاحظة، ولا تظهر «null» أبداً؛ ⁦300⁩ حرف مقبولة و⁦301⁩ مرفوضة. الغد واليوم ⁦30⁩ وموعدا ⁦08:00⁩ و⁦16:45⁩ معروضة؛ واليوم الحالي واليوم ⁦31⁩ وموعدا ⁦07:45⁩ و⁦17:00⁩ غير معروضة؛ و⁦29⁩ فبراير في سنة كبيسة معروض متى وقع ضمن مدة ⁦30⁩ يوماً.

الحالات الطرفية: (⁦1⁩) موعد ⁦08:00⁩ غداً يُحجز الساعة ⁦10:00⁩ اليوم، فوقت التذكير مضى؛ هل يُرسل الآن أم لا يُرسل؟ (⁦2⁩) اسم عربي من ⁦60⁩ حرفاً في رسالة التذكير، والرسالة النصية الواحدة بالعربية تتسع عادةً لـ⁦70⁩ محرفاً فقط، فقد تنقسم أو تُقطع. (⁦3⁩) هاتف مضبوط على Asia/Kolkata يحجز أول موعد، ⁦08:00⁩، فيجب أن يُحجز الساعة ⁦08:00⁩ بتوقيت العيادة (⁦10:30⁩ على ذلك الهاتف)، لا ⁦08:00⁩ بتوقيت كولكاتا، أي ⁦05:30⁩ في الرياض قبل بدء الدوام؛ ويتبع التذكير توقيت العيادة.

الأسئلة: التذكير عند الحجز المتأخر، وكيف تُعدّ الرموز التعبيرية في الاسم، وهل تُقبل الرسالة النصية المنقسمة، وبأي منطقة زمنية تُحسب «⁦30⁩ يوماً قادمة».

أسئلة شائعة

ما الفرق بين الحالة الحدّية والحالة الطرفية؟

الحالة الحدّية تضع مُدخلاً أو شرطاً واحداً عند طرف أقصى بينما يبقى كل ما عداه معتاداً. والحالة الطرفية تضع اثنين أو أكثر عند أطرافها في الوقت نفسه. اختبر الحالات الحدّية أولاً: فإذا فشلت حالة طرفية بينما تنجح كل حالة حدّية فيها، فقد وجدت عيب تفاعل.

هل الحالة الحدّية هي نفسها القيمة الحدّية؟

ليس دائماً. القيمة الحدّية هي أصغر قيمة أو أكبر قيمة في قسم مرتب، ويستخدمها تحليل القيم الحدّية. وكثير من الحالات الحدّية قيم حدّية، لكن null والرمز التعبيري والنص مختلط الاتجاه لا ترتيب لها، والحدّ الواقع في منتصف نطاق، مثل رسوم تتغير عند ⁦100.00⁩، ليس طرفاً للمُدخل.

هل الحالات الحدّية هي نفسها الاختبارات السلبية؟

لا. الاختبار السلبي يتحقق من أن المُدخل غير الصالح أو سوء الاستخدام يُعالَج جيداً. أما الحالات الحدّية فقد تكون صالحة أو غير صالحة: رسالة من ⁦150⁩ حرفاً يجب قبولها، ورسالة من ⁦151⁩ حرفاً يجب رفضها. عاملها طريقةً مستقلة لاختيار بيانات الاختبار تجمعها مع الاختبارات الإيجابية والسلبية.

كم حالة طرفية يجب أن أختبر؟

ليس كلها، فعددها يزداد بسرعة مع كل مُدخل جديد. اختر التركيبات التي تتشارك فيها المُدخلات عملية حساب أو سجلاً مخزَّناً أو مُخرَجاً، وتلك التي يكون إخفاقها الأعلى كلفة. وتأتي تقنيات التركيبات، مثل الاختبار الثنائي (Pairwise Testing)، لاحقاً في وحدة تصميم الاختبار.

المراجع

  • ISTQB Certified Tester Foundation Level (CTFL) v4.0ISTQB · 2023المنهج التأسيسي لاختبار البرمجيات: مستويات الاختبار وأنواعه وتقنيات تصميم الاختبارات وإدارة الاختبار والأدوات.
  • ISTQB GlossaryISTQBالتعريفات القياسية لمصطلحات الاختبار — حالة الاختبار واختبار الانحدار والخطورة والأولوية وتحليل القيم الحدّية وغيرها.
  • UAX #29: Unicode Text SegmentationUnicode Consortiumكيفية تقسيم النص إلى عناقيد رسومية وكلمات وجمل — ولماذا قد يختلف عدد «الأحرف» عن عدد نقاط الترميز أو البايتات.
  • Time Zone DatabaseIANAقاعدة بيانات tz للمناطق الزمنية في العالم وقواعد فروق التوقيت والتوقيت الصيفي تاريخياً، وتُحدَّث عدة مرات في السنة.

تدرّب بأدوات متقن

ولّد حالات حدّية (edge cases) للسلاسل النصية والأرقام والتواريخ والملفات والقوائم والتزامن انطلاقاً من تعريف الحقول.

تصميم الاختبارات

ولّد سلاسل نصية اختبارية بترميز Unicode عبر الخطوط (العربية والديفاناغارية وCJK والسيريلية) والرموز التعبيرية وعلامات الدمج وصيغ التطبيع.

بيانات الاختبار

ولّد مجموعات بيانات للتواريخ: تواريخ عشوائية ضمن نطاق، وأيام كبيسة، ونهايات الأشهر، وحدود التوقيت الصيفي، وصيغ متعددة.

بيانات الاختبار

حوّل التاريخ والوقت بين المناطق الزمنية (الرياض، عمّان، دلهي، UTC، نيويورك، لندن…).

أدوات مساعدة

عدّ الأحرف مع المسافات وبدونها والأسطر، وتحقق من حدود التغريدات ورسائل SMS والأوصاف الوصفية (meta).

التنسيق

للتعمّق أكثر

تقدّمك في هذا الموضوع

جزء من مسار تعلم ضمان الجودة