الحالات الحدّية والحالات الطرفية
الحالة الحدّية (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 ساعة».
اكتب ثماني حالات حدّية على الأقل وثلاث حالات طرفية، ولكل منها نتيجة متوقعة، أو سؤال حين يصمت المتطلب.
- اكتب المُدخلات والمُخرَجات، ومنها رسالة التذكير النصية.
- مرّر كل مُدخل على العائلات الخمس.
- اكتب النتيجة المتوقعة لكل حالة حدّية، صالحة كانت أم غير صالحة.
- اجمع الأطراف التي تلتقي في عملية حساب أو مُخرَج واحد.
إظهار الإجابة النموذجية
الحالات الحدّية: اسم من 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.0المنهج التأسيسي لاختبار البرمجيات: مستويات الاختبار وأنواعه وتقنيات تصميم الاختبارات وإدارة الاختبار والأدوات.
- ISTQB Glossaryالتعريفات القياسية لمصطلحات الاختبار — حالة الاختبار واختبار الانحدار والخطورة والأولوية وتحليل القيم الحدّية وغيرها.
- UAX #29: Unicode Text Segmentationكيفية تقسيم النص إلى عناقيد رسومية وكلمات وجمل — ولماذا قد يختلف عدد «الأحرف» عن عدد نقاط الترميز أو البايتات.
- Time Zone Databaseقاعدة بيانات tz للمناطق الزمنية في العالم وقواعد فروق التوقيت والتوقيت الصيفي تاريخياً، وتُحدَّث عدة مرات في السنة.
تدرّب بأدوات متقن
ولّد حالات حدّية (edge cases) للسلاسل النصية والأرقام والتواريخ والملفات والقوائم والتزامن انطلاقاً من تعريف الحقول.
ولّد سلاسل نصية اختبارية بترميز Unicode عبر الخطوط (العربية والديفاناغارية وCJK والسيريلية) والرموز التعبيرية وعلامات الدمج وصيغ التطبيع.
قِس طول السلسلة النصية بالأحرف ونقاط الترميز (code points) وبايتات UTF-8 ووحدات UTF-16.
ولّد مجموعات بيانات للتواريخ: تواريخ عشوائية ضمن نطاق، وأيام كبيسة، ونهايات الأشهر، وحدود التوقيت الصيفي، وصيغ متعددة.
حوّل التاريخ والوقت بين المناطق الزمنية (الرياض، عمّان، دلهي، UTC، نيويورك، لندن…).
عدّ الأحرف مع المسافات وبدونها والأسطر، وتحقق من حدود التغريدات ورسائل SMS والأوصاف الوصفية (meta).
للتعمّق أكثر
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.