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

تحليل القيم الحدّية (Boundary Value Analysis) تقنية لتصميم الاختبار من نوع الصندوق الأسود، تختبر القيم الواقعة على أطراف أقسام التكافؤ. والقيمة الحدّية هي أصغر قيمة أو أكبر قيمة في قسم مرتب: فإذا كان الحقل يقبل الأعمار من ⁦18⁩ إلى ⁦65⁩، فحدّا القسم الصالح هما ⁦18⁩ و⁦65⁩، وحدّا القسمين غير الصالحين المجاورين هما ⁦17⁩ و⁦66⁩.

يُبنى هذا التحليل مباشرةً على تقسيم التكافؤ (Equivalence Partitioning). فالتقسيم يخبرك أيّ مجموعات المدخلات يجب أن يعاملها النظام بالطريقة نفسها، وتحليل القيم الحدّية يخبرك أين تبحث داخل هذه المجموعات، لأن الأطراف هي حيث يتغيّر المنطق وحيث تتجمّع الأخطاء.

لماذا يهم

يكتب المطورون قواعد مثل «من ⁦18⁩ إلى ⁦65⁩» باستخدام عمليات مقارنة: age >= 18 && age <= 65. وكتابة > بدلاً من >=، أو استخدام حدّ خاطئ بسبب سوء فهم المتطلب، تُنتج عيباً لا يظهر إلا عند قيمة واحدة بعينها. أما القيم المعتادة في منتصف النطاق، مثل ⁦30⁩، فتنجح سواء كانت المقارنة صحيحة أم خاطئة.

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

لا توجد حدود إلا حيث تكون القيم مرتبة

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

ابدأ بكتابة الأقسام، بما فيها الأقسام غير الصالحة. فحقل العمر الذي يقبل الأعداد الصحيحة من ⁦18⁩ إلى ⁦65⁩ له ثلاثة أقسام: أقل من ⁦18⁩ (غير صالح)، ومن ⁦18⁩ إلى ⁦65⁩ (صالح)، وأكبر من ⁦65⁩ (غير صالح). وكل قسمين متجاورين يلتقيان عند حدّ.

  • الأرقام: الحد الأدنى والحد الأقصى، ومقدار الخطوة (أعداد صحيحة، أو ⁦0.01⁩ للمبالغ المالية) هو ما يحدد القيمة المجاورة.
  • الأطوال: اسم من ⁦2⁩ إلى ⁦50⁩ حرفاً حدوده عند ⁦1|2⁩ و⁦50|51⁩ حرفاً.
  • التواريخ والأوقات: «صالح حتى ⁦31⁩ مارس» له حدّ بين ⁦23:59:59⁩ يوم ⁦31⁩ مارس و⁦00:00:00⁩ يوم ⁦1⁩ أبريل، في منطقة زمنية محددة.
  • الأعداد والأحجام: «حتى ⁦5⁩ مرفقات، حجم كل منها ⁦10⁩ ميغابايت كحد أقصى» تعطي حدوداً عند ⁦5|6⁩ ملفات وعند ⁦10⁩ ميغابايت وبايت واحد فوقها.

تحليل القيم الحدّية الثنائي والثلاثي

يعرّف منهج ISTQB للمستوى التأسيسي صيغتين. في الصيغة الثنائية (2-value BVA) تختبر لكل حدّ القيمة الحدّية نفسها وأقرب قيمة مجاورة لها في القسم المجاور. وفي الصيغة الثلاثية (3-value BVA) تختبر القيمة الحدّية وجارتيها، واحدة على كل جانب.

في حقل العمر (أعداد صحيحة، والصالح من ⁦18⁩ إلى ⁦65⁩) تعطي الصيغة الثنائية ⁦17⁩ و⁦18⁩ و⁦65⁩ و⁦66⁩، وتعطي الثلاثية ⁦17⁩ و⁦18⁩ و⁦19⁩ و⁦64⁩ و⁦65⁩ و⁦66⁩. والقيمتان الإضافيتان ⁦19⁩ و⁦64⁩ تكشفان عيوباً يكتب فيها المطور العامل الصحيح لكن بحدّ خاطئ، مثل age < 65 بدلاً من age <= 65 (عندها تُرفض ⁦65⁩، وهذا ما تكشفه الصيغة الثنائية أيضاً)، أو شيفرة تعامل الحدّ كحالة خاصة فتُفسد القيمة المجاورة له.

حقل العمر الصالح من ⁦18–65⁩: الصيغة الثنائية تختبر ⁦17⁩ و⁦18⁩ و⁦65⁩ و⁦66⁩، والثلاثية تضيف ⁦19⁩ و⁦64⁩ داخل القسم الصالح مباشرةً.

age: integer, valid 18..65

المحور من 17 إلى 66
  • ≤ 17غير صالح: أصغر من الحد
  • 18–65القسم الصالح
  • ≥ 66غير صالح: أكبر من الحد
  1. 117 الجار الأدنىمرفوضفشل
  2. 218 الحد الأدنىمقبولنجاح
  3. 319 الجار الداخليفي الصيغة الثلاثية فقط · مقبول
  4. 464 الجار الداخليفي الصيغة الثلاثية فقط · مقبول
  5. 565 الحد الأعلىمقبولنجاح
  6. 666 الجار الأعلىمرفوضفشل
النسخة النصية
Field: age, whole numbers, valid 18..65

Partitions:   [ ... 17 ] [ 18 ......... 65 ] [ 66 ... ]
                invalid         valid           invalid

2-value BVA:  17  18                    65  66
3-value BVA:  17  18  19            64  65  66

Expected:     17 rejected, 18 accepted, 19 accepted,
              64 accepted, 65 accepted, 66 rejected

جرّبها: تحليل القيم الحدّية جرّبها: مولّد القيم الحدّية

مثال تطبيقي: قاعدة رسوم التوصيل

المتطلب: «الطلبات التي تقل عن ⁦100.00⁩ ريال تدفع رسوم توصيل ⁦15.00⁩ ريالاً. والطلبات من ⁦100.00⁩ إلى ⁦299.99⁩ ريالاً تدفع ⁦7.50⁩ ريالات. والطلبات بقيمة ⁦300.00⁩ ريال فأكثر توصيلها مجاني». للأسعار منزلتان عشريتان، فالخطوة بين القيم المتجاورة ⁦0.01⁩.

الأقسام هي: أقل من ⁦100.00⁩، ومن ⁦100.00⁩ إلى ⁦299.99⁩، و⁦300.00⁩ فأكثر. وهناك حدّان بين الأقسام الصالحة، وحدّ ثالث في الأسفل: فإجمالي الطلب لا يمكن أن يكون صفراً أو سالباً، لذا تهمّ القيمتان ⁦0.00⁩ و⁦0.01⁩ أيضاً.

  • ⁦0.00⁩ ← مرفوض (لا طلب فارغاً)؛ ⁦0.01⁩ ← رسوم ⁦15.00⁩.
  • ⁦99.99⁩ ← رسوم ⁦15.00⁩؛ ⁦100.00⁩ ← رسوم ⁦7.50⁩.
  • ⁦299.99⁩ ← رسوم ⁦7.50⁩؛ ⁦300.00⁩ ← توصيل مجاني.
  • أضف قيمة معتادة واحدة لكل قسم (مثل ⁦50.00⁩ و⁦180.00⁩ و⁦750.00⁩) لتثبت أن القسم يتصرّف ككتلة واحدة؛ وهذا دور تقسيم التكافؤ.

جرّبها: مولّد مجموعات الأرقام الحدّية

حدود خفية لا يذكرها المتطلب

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

اسأل المطور، أو اقرأ عقد الواجهة البرمجية أو المخطط لمعرفة الحدود التقنية، ثم طبّق التقنية نفسها: الحدّ، والقيمة التي تتجاوزه مباشرةً.

  • نص يُخزَّن في عمود من ⁦100⁩ حرف: اختبر ⁦100⁩ و⁦101⁩ حرف، واحسب الأحرف كما يحسبها النظام؛ فقد يُقاس النص العربي أو الهندي بالبايتات لا بالحروف.
  • عدد صحيح بإشارة من ⁦32⁩ بت: ⁦2147483647⁩ و⁦2147483648⁩.
  • التواريخ: ⁦28⁩ و⁦29⁩ فبراير في السنوات الكبيسة وغير الكبيسة، وتغيّر اليوم بين المناطق الزمنية.

جرّبها: عدّاد طول السلاسل النصية جرّبها: مولّد بيانات اختبار التواريخ

أخطاء شائعة

  • اختبار الجانب الصالح فقط من كل حدّ (⁦18⁩ و⁦65⁩) وعدم اختبار القيم التي يجب رفضها (⁦17⁩ و⁦66⁩).
  • عدم حسم ما إذا كان الحدّ داخلاً في النطاق: «بين ⁦18⁩ و⁦65⁩» و«حتى ⁦65⁩» و«أقل من ⁦65⁩» معانٍ مختلفة. اسأل، واكتب الإجابة في حالة الاختبار.
  • استخدام خطوة خاطئة: جارة ⁦100.00⁩ في الأسعار هي ⁦99.99⁩ وليست ⁦99⁩.
  • تطبيق التحليل على قيم غير مرتبة مثل طرق الدفع أو رموز الدول، حيث لا معنى له.
  • نسيان الحدود الضمنية مثل أطوال الحقول وحدود أنواع البيانات وأطراف التواريخ.
  • اختبار الحدود وإهمال الأقسام بينها؛ فتحليل القيم الحدّية يكمّل تقسيم التكافؤ ولا يحلّ محله.

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

يبدأ تحليل القيم الحدّية عملياً أثناء مراجعة المتطلبات: كل رقم أو طول أو تاريخ في المتطلب سؤال عن الشمول والوحدات ومقدار الخطوة. وطرح سؤال «هل يُعدّ عمر ⁦65⁩ مؤهلاً؟» قبل البرمجة يمنع العيب بدلاً من اكتشافه لاحقاً.

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

تمرين عملي

استخرج القيم الحدّية لقاعدة كلمة المرور

المطلوب

نموذج التسجيل يقول: «يجب أن يكون طول كلمة المرور من ⁦12⁩ إلى ⁦64⁩ حرفاً». يُحسب الطول بعدد الأحرف. حدّد الأقسام، ثم اكتب القيم الحدّية للصيغتين الثنائية والثلاثية مع النتيجة المتوقعة لكل قيمة.

بعد ذلك راجع المتطلب بحثاً عن أي شيء ما زال غامضاً، واكتبه سؤالاً لمالك المنتج.

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

الأقسام: من ⁦0⁩ إلى ⁦11⁩ حرفاً (غير صالح)، ومن ⁦12⁩ إلى ⁦64⁩ (صالح)، و⁦65⁩ فأكثر (غير صالح). الحدود: ⁦11|12⁩ و⁦64|65⁩.

الصيغة الثنائية: ⁦11⁩ (مرفوض)، ⁦12⁩ (مقبول)، ⁦64⁩ (مقبول)، ⁦65⁩ (مرفوض). وتضيف الصيغة الثلاثية ⁦13⁩ و⁦63⁩ (كلاهما مقبول).

ومما يستحق الاختبار أيضاً: كلمة مرور فارغة (⁦0⁩ حرف)، وهي أدنى طرف في القسم الأول وغالباً لها رسالة خطأ خاصة.

أسئلة مفتوحة: كيف تُحسب الرموز التعبيرية أو الحروف العربية المشكولة؟ هل يُفحص الطول قبل حذف المسافات الطرفية أم بعده؟ هل يوجد حدّ أقصى آخر في قاعدة البيانات أو في مكتبة التجزئة؟

أسئلة شائعة

هل تحليل القيم الحدّية هو نفسه تقسيم التكافؤ؟

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

هل أستخدم الصيغة الثنائية أم الثلاثية؟

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

هل ينطبق التحليل على التواريخ والنصوص؟

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

المراجع

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

نفّذ تحليلاً كاملاً للقيم الحدّية (ثنائي القيم وثلاثي القيم) مع فئات التكافؤ والنتائج المتوقّعة.

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

ولّد القيم الحدّية (min-1 وmin وmin+1 والقيمة الاسمية وmax-1 وmax وmax+1) للقيود الرقمية وقيود الطول.

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

اشتق فئات التكافؤ الصالحة وغير الصالحة لكل مدخل واختر قيم اختبار تمثيلية.

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

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

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

للتعمّق أكثر

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

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