تقسيم التكافؤ

تقسيم التكافؤ (Equivalence Partitioning) تقنية لتصميم الاختبار من نوع الصندوق الأسود، تقسم البيانات التي يتعامل معها موضوع الاختبار (Test Object) إلى أقسام تُسمّى أيضاً فئات التكافؤ (Equivalence Classes). ويُتوقَّع أن تُعالَج جميع قيم القسم الواحد بالطريقة نفسها: فإذا كشفت قيمة منه عيباً، يُفترض أن أي قيمة أخرى منه ستكشفه أيضاً. لذلك تختبر قيمة واحدة من كل قسم، لا كل القيم.

مثال: متجر يقبل طلبات من ⁦1⁩ إلى ⁦10⁩ وحدات. لحقل الكمية قسم صالح واحد هو من ⁦1⁩ إلى ⁦10⁩، وثلاثة أقسام غير صالحة: أقل من ⁦1⁩، وأكبر من ⁦10⁩، وإدخال ليس عدداً صحيحاً، مثل ⁦2.5⁩ أو two. وأربعة اختبارات، مثل ⁦4⁩ و⁦-3⁩ و⁦25⁩ وtwo، تختبر الأقسام الأربعة كلها؛ أما إضافة ⁦5⁩ و⁦6⁩ فلا تختبر شيئاً جديداً.

لماذا يهم

الاختبار الشامل مستحيل، فكل مجموعة اختبارات عيّنة، والسؤال هو: هل اختيرت العيّنة عن قصد؟ فمن دون أقسام يميل المختبِرون إلى تجربة قيم عدة تمر بالمنطق نفسه، مثل ⁦3⁩ و⁦5⁩ و⁦7⁩ لحقل الكمية، ولا يجربون قيمة يجب أن يرفضها النظام. فتبدو مجموعة الاختبارات كبيرة، ومع ذلك تفوتها سلوكيات كاملة.

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

الأقسام الصالحة وغير الصالحة، وقيمة واحدة من كل قسم

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

القسم الذي يضم قيماً يجب أن يعالجها موضوع الاختبار قسم صالح (Valid Partition)، والقسم الذي يضم قيماً يجب أن يرفضها أو يتجاهلها قسم غير صالح (Invalid Partition). ويشير منهج ISTQB إلى أن الفرق تعرّف «الصالح» و«غير الصالح» بطرق مختلفة (فبعضها لا يعدّ القيمة صالحة إلا إذا حدّدت المواصفات طريقة معالجتها)، فاتفق على المعنى أولاً. ثم اختر قيمة واحدة من كل قسم. وتصلح أي قيمة؛ وعادةً يأخذ المختبِرون قيمة معتادة من المنتصف ويتركون الأطراف لتحليل القيم الحدّية.

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

جرّبها: مولّد أقسام التكافؤ جرّبها: مولّد الاختبارات السلبية

تغطية أقسام التكافؤ

كما في درس نشاط تصميم الاختبار، تُحسب التغطية على عناصر التغطية (Coverage Items). وفي تقسيم التكافؤ تكون عناصر التغطية هي الأقسام، الصالحة وغير الصالحة. والتغطية هي عدد الأقسام التي اختبرتها حالة اختبار واحدة على الأقل مقسوماً على عدد الأقسام المحددة، بنسبة مئوية.

ولا تكون هذه النسبة أدق من قائمة الأقسام التي تُحسب منها: فالقسم الذي لم يحدده أحد لا يُحسب، فقد تبلغ التغطية ⁦100%⁩ وهو مفقود. لذلك احفظ الأقسام في تصميم اختبار يستطيع الآخرون مراجعته، لا في ذهنك وحده.

Field: quantity, whole numbers, valid 1..10

Partitions:    Q1 below 1 (invalid)      Q2 1..10 (valid)
               Q3 above 10 (invalid)     Q4 not a whole number (invalid)

Tests so far:  4 -> Q2,  25 -> Q3
Coverage:      2 of 4 partitions = 50%

Add:           -3 -> Q1,  "two" -> Q4
Coverage:      4 of 4 partitions = 100%

عدة معاملات وتغطية كل اختيار

معظم مواضيع الاختبار تأخذ أكثر من مُدخل. ولكل معامل (Parameter) مجموعة أقسامه، وحالة الاختبار الواحدة تستخدم قسماً من كل مجموعة في الوقت نفسه. والتوليفات تكبر بسرعة: ثلاثة معاملات لها ⁦3⁩ و⁦2⁩ و⁦2⁩ من الأقسام الصالحة تعطي ⁦3 × 2 × 2 = 12⁩ توليفة.

أبسط معيار لعدة مجموعات هو تغطية كل اختيار (Each Choice Coverage): أن تختبر حالة اختبار واحدة على الأقل كل قسم من كل مجموعة، دون اعتبار للتوليفات. وحين تكون كل التوليفات مسموحة، لا تحتاج الأقسام الصالحة إلا إلى عدد من حالات الاختبار يساوي عدد الأقسام الصالحة للمعامل الذي له أكثر الأقسام الصالحة. أما التوليفات فهي موضوع الاختبار الزوجي (Pairwise Testing) لاحقاً في هذه الوحدة.

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

مثال تطبيقي: رسوم شحن الطرود

المتطلب: «الوزن من ⁦0.1⁩ إلى ⁦2.0⁩ كغ رسومه ⁦20⁩ ريالاً، ومن ⁦2.1⁩ إلى ⁦10.0⁩ كغ ⁦35⁩ ريالاً، ومن ⁦10.1⁩ إلى ⁦30.0⁩ كغ ⁦60⁩ ريالاً. للوزن منزلة عشرية واحدة، وتُرفض الطرود التي تزيد على ⁦30.0⁩ كغ. الوجهة محلية (Domestic) أو دول مجلس التعاون الخليجي (GCC)، ودول المجلس تضيف ⁦30⁩ ريالاً. والسرعة عادية (Standard) أو سريعة (Express)، والسريعة تضيف ⁦25⁩ ريالاً».

للوزن ستة أقسام: صفر أو أقل، وشرائح الرسوم الثلاث، وأكثر من ⁦30.0⁩ كغ، وإدخال ليس رقماً. وللوجهة ثلاثة أقسام (محلية، ودول المجلس، وأي دولة أخرى)، وللسرعة قسمان: فالمجموع ⁦11⁩ قسماً، منها ⁦7⁩ صالحة و⁦4⁩ غير صالحة. وإذا كان الحقل يمكن أن يستقبل وزناً بمنزلتين عشريتين، مثل ⁦2.05⁩، فاسأل هل يُقرَّب أم يُرفض؛ فقد تضيف الإجابة قسماً جديداً.

في مثال رسوم الشحن ينقسم وزن الطرد إلى خمسة أقسام مرتبة، اثنان غير صالحين وثلاث شرائح رسوم صالحة، ويُختبر وزن واحد من كل قسم.

weight: kg, one decimal, accepted 0.1..30.0

المحور من 0 kg إلى 30 kg
  • ≤ 0.0W1 · غير صالح: صفر أو أقل
  • 0.1–2.0W2 · صالح: ⁦20⁩ ريالاً
  • 2.1–10.0W3 · صالح: ⁦35⁩ ريالاً
  • 10.1–30.0W4 · صالح: ⁦60⁩ ريالاً
  • ≥ 30.1W5 · غير صالح: أثقل من المسموح
  1. 1−2.0 kg TC4: مرفوضيمثّل W1
  2. 21.5 kg TC1: ⁦20⁩ ريالاًرسوم الوزن قبل الإضافات
  3. 36.0 kg TC2: ⁦35⁩ ريالاًرسوم الوزن قبل الإضافات
  4. 418.5 kg TC3: ⁦60⁩ ريالاًرسوم الوزن قبل الإضافات
  5. 542.0 kg TC5: مرفوضيمثّل W5

القسم W6، أي الإدخال الذي ليس رقماً (حالة الاختبار ⁦6⁩، abc)، لا مكان له على خط الأعداد، وكذلك أقسام الوجهة والسرعة؛ والجدول أدناه يعرض جميع الأقسام وعددها ⁦11⁩.

  • حالات الاختبار من ⁦1⁩ إلى ⁦3⁩ تبلغ تغطية كل اختيار للأقسام الصالحة؛ وتكفي ثلاث لأن الوزن، وهو أكبر مجموعة، له ثلاثة أقسام صالحة.
  • حالات الاختبار من ⁦4⁩ إلى ⁦7⁩ تغطي كل منها قسماً غير صالح واحداً وكل القيم الأخرى صالحة. فسبع حالات اختبار تغطي الأقسام كلها وعددها ⁦11⁩: تغطية ⁦100%⁩ لأقسام التكافؤ.
  • إذا كانت الوجهة قائمة منسدلة، فلا يمكن اختيار D3 في واجهة المستخدم؛ اختبره عبر الواجهة البرمجية (API)، أو اسأل هل يتحقق الخادم منه.
  • ما لم يُغطَّ بعد: توليفات مثل الشحن السريع مع أخف شريحة، والأطراف ⁦0.0|0.1⁩ و⁦2.0|2.1⁩ و⁦10.0|10.1⁩ و⁦30.0|30.1⁩ التي يمكنك إضافتها بتحليل القيم الحدّية، وهو تقنية الدرس التالي.
Partitions
  Weight       W1 <= 0.0 (invalid)   W2 0.1-2.0 (valid)    W3 2.1-10.0 (valid)
               W4 10.1-30.0 (valid)  W5 > 30.0 (invalid)   W6 not a number (invalid)
  Destination  D1 Domestic (valid)   D2 GCC (valid)        D3 other country (invalid)
  Speed        S1 Standard (valid)   S2 Express (valid)

TC  Weight  Destination  Speed     Covers     Expected
1   1.5     Domestic     Standard  W2 D1 S1   fee 20 SAR
2   6.0     GCC          Express   W3 D2 S2   fee 35 + 30 + 25 = 90 SAR
3   18.5    Domestic     Express   W4 D1 S2   fee 60 + 25 = 85 SAR
4   -2.0    Domestic     Standard  W1         refused: weight must be above 0
5   42.0    Domestic     Standard  W5         refused: parcel over 30.0 kg
6   abc     Domestic     Standard  W6         refused: weight must be a number
7   1.5     Egypt        Standard  D3         refused: destination not served

Coverage: 11 of 11 partitions = 100% with 7 test cases

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

أخطاء شائعة

  • تقسيم المدخلات فقط ونسيان المخرجات: ثلاث شرائح رسوم يغذيها حقل وزن واحد هي ثلاثة أقسام.
  • اختبار الأقسام الصالحة فقط. فالأقسام غير الصالحة تدخل في حساب التغطية، وفيها تظهر عيوب معالجة الأخطاء.
  • وضع عدة قيم غير صالحة في حالة اختبار واحدة، فيُخفي رفضُ القيمة الأولى طريقةَ معالجة القيم الأخرى.
  • كتابة أقسام متداخلة مثل «من ⁦0⁩ إلى ⁦10⁩» و«من ⁦10⁩ إلى ⁦20⁩»؛ فكل قيمة تنتمي إلى قسم واحد فقط.
  • اختبار عدة قيم من القسم نفسه واعتبار ذلك اختباراً شاملاً: كلفة أكثر بلا تغطية إضافية.
  • اعتبار تغطية ⁦100%⁩ لأقسام التكافؤ دليلاً على الجودة؛ فهي تعني فقط أن كل قسم محدد اختُبر مرة واحدة على الأقل.

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

يبدأ تقسيم التكافؤ عند قراءة أساس الاختبار (Test Basis). فكل قاعدة في متطلب أو معيار قبول تقترح أقساماً، وكل قاعدة غامضة سؤال: «ماذا يحدث لوزن ⁦0⁩؟»، «هل يُشحن طرد إلى دول المجلس بالخدمة السريعة؟». اسأل مالك المنتج أثناء التنقيح (Refinement) ودوّن الإجابات؛ فهي تصبح نتائجك المتوقعة.

سجّل الأقسام بمعرّفات (W1 وD2…) في تصميم الاختبار، واربط كل حالة اختبار بالأقسام التي تغطيها، وأبلغ عن تغطية أقسام التكافؤ لكل ميزة، ليستطيع المراجعون الاعتراض على قسم مفقود. وإذا فشل اختبار، فاذكر في تقرير الخطأ القسم إلى جانب القيمة: فمجموعة القيم كلها متأثرة على الأرجح، لا رقم واحد فقط.

تمرين عملي

قسّم نموذج حجز تذاكر السينما

المطلوب

نموذج حجز في سينما فيه حقلان. العمر بالسنوات الكاملة: من ⁦0⁩ إلى ⁦12⁩ يدفع سعر الطفل، ومن ⁦13⁩ إلى ⁦59⁩ سعر البالغ، ومن ⁦60⁩ إلى ⁦120⁩ سعر كبار السن؛ وتُرفض القيم الأخرى. ونوع المقعد: Standard أو Premium أو VIP؛ ويُرفض أي شيء آخر.

حدّد أقسام الحقلين، وصمّم أصغر مجموعة اختبارات تبلغ تغطية ⁦100%⁩ لأقسام التكافؤ، مع اختبار الأقسام غير الصالحة واحداً تلو الآخر.

الخطوات
  1. اكتب أقسام كل حقل، بما فيها الأقسام غير الصالحة، مع معرّف لكل قسم.
  2. غطِّ الأقسام الصالحة بتغطية كل اختيار.
  3. أضف حالة اختبار لكل قسم غير صالح، مع إبقاء الحقل الآخر صالحاً.
  4. احسب الأقسام وحالات الاختبار، واذكر نسبة التغطية.
إظهار الإجابة النموذجية
الإجابة النموذجية

العمر: A1 أقل من ⁦0⁩ (غير صالح)، A2 من ⁦0⁩ إلى ⁦12⁩ طفل، A3 من ⁦13⁩ إلى ⁦59⁩ بالغ، A4 من ⁦60⁩ إلى ⁦120⁩ كبير السن (صالحة)، A5 أكبر من ⁦120⁩ (غير صالح)، A6 ليس عدداً صحيحاً، مثل ten أو ⁦7.5⁩ (غير صالح). نوع المقعد: T1 Standard وT2 Premium وT3 VIP (صالحة)، T4 أي قيمة أخرى (غير صالح). المجموع ⁦10⁩ أقسام.

الأقسام الصالحة بتغطية كل اختيار، في ثلاث حالات اختبار لأن لكل حقل ثلاثة أقسام صالحة: (⁦8⁩، Standard) تغطي A2 وT1؛ (⁦35⁩، Premium) تغطي A3 وT2؛ (⁦70⁩، VIP) تغطي A4 وT3.

الأقسام غير الصالحة واحداً تلو الآخر: (⁦-5⁩، Standard) للقسم A1؛ (⁦130⁩، Standard) للقسم A5؛ (ten، Standard) للقسم A6؛ (⁦35⁩، Balcony) للقسم T4.

سبع حالات اختبار تغطي الأقسام وعددها ⁦10⁩: تغطية ⁦100%⁩ لأقسام التكافؤ. واسأل هل يُدخَل عمر الرضيع دون السنة الأولى ⁦0⁩، وهل تُرفض ⁦7.5⁩ أم تُقرَّب؛ وإذا عولجت ⁦7.5⁩ وten بطريقتين مختلفتين، فقسّم A6 إلى قسمين.

أسئلة شائعة

هل فئة التكافؤ هي نفسها قسم التكافؤ؟

نعم. تستخدم كتب وأدوات كثيرة، منها أداة Equivalence Partition Generator في Mutqan، مصطلح فئة التكافؤ (Equivalence Class)، ويستخدم منهج ISTQB مصطلح قسم التكافؤ (Equivalence Partition). وكلاهما يعني مجموعة من القيم يُتوقَّع أن يعالجها موضوع الاختبار بالطريقة نفسها.

أي قيمة أختار من القسم؟

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

هل تكفي تغطية كل اختيار عندما توجد عدة معاملات؟

هي الحد الأدنى: كل قسم من كل معامل يُختبر مرة واحدة. لكنها لا تختبر التفاعل بين المعاملات، فإذا كانت قيم معامل ما تغيّر نتيجة معامل آخر، فأضف توليفات باختبار جداول القرار أو بالاختبار الزوجي.

المراجع

  • ISTQB Certified Tester Foundation Level (CTFL) v4.0ISTQB · 2023المنهج التأسيسي لاختبار البرمجيات: مستويات الاختبار وأنواعه وتقنيات تصميم الاختبارات وإدارة الاختبار والأدوات.
  • ISTQB GlossaryISTQBالتعريفات القياسية لمصطلحات الاختبار — حالة الاختبار واختبار الانحدار والخطورة والأولوية وتحليل القيم الحدّية وغيرها.

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

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

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

ولّد حالات اختبار سلبية لحقول النماذج وواجهات API: قيم فارغة وnull ونوع خاطئ وطول زائد وحقن وصيغة غير صالحة.

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

ولّد حالات اختبار للتحقق من حقول النماذج: الإلزامية والصيغة والطول والنطاق والنمط والقواعد المشتركة بين الحقول.

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

ولّد حالات اختبار منظّمة (المعرّف والعنوان والشروط المسبقة والخطوات والنتيجة المتوقّعة والأولوية) من وصف الميزة وقائمة الحقول.

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

للتعمّق أكثر

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

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