تقسيم التكافؤ
يُعدّ تقسيم التكافؤ، أو تقسيم فئات التكافؤ ( ECP ) [ 1 ] ، أسلوبًا لاختبار البرمجيات ، حيث يُقسّم بيانات الإدخال لوحدة برمجية إلى أجزاء من البيانات المتكافئة، والتي يُمكن اشتقاق حالات الاختبار منها. من حيث المبدأ، تُصمّم حالات الاختبار لتغطية كل جزء مرة واحدة على الأقل. يسعى هذا الأسلوب إلى تحديد حالات اختبار تكشف عن فئات الأخطاء، مما يُقلّل من إجمالي عدد حالات الاختبار المطلوبة. ومن مزايا هذا النهج تقليل الوقت اللازم لاختبار البرمجيات نظرًا لانخفاض عدد حالات الاختبار.
يُطبَّق تقسيم التكافؤ عادةً على مدخلات المكون المختبر، ولكن قد يُطبَّق على المخرجات في حالات نادرة. وتُستمد أقسام التكافؤ عادةً من مواصفات متطلبات سمات الإدخال التي تؤثر على معالجة كائن الاختبار.
ينبع المفهوم الأساسي لـ ECP من فئة التكافؤ ، والتي بدورها تنبع من علاقة التكافؤ . نظام البرمجيات هو في الواقع دالة قابلة للحساب تُنفذ كخوارزمية بلغة برمجة معينة . عند إدخال متجه اختبار، تُغطى بعض تعليمات تلك الخوارزمية (انظر تغطية الكود لمزيد من التفاصيل)، بينما لا تُغطى تعليمات أخرى. وهذا ما يُفسر العلاقة المهمة بين متجهات اختبار الإدخال. تُعتبر علاقة التكافؤ بين متجهي الاختبار a و b قائمةً إذا وفقط إذا كانت بصمة التغطية للمتجهين a و b متطابقة تمامًا، أي أنهما يغطيان نفس التعليمات في نفس الخطوة. وهذا يعني بوضوح أن علاقة التغطية C ستقسم نطاق متجه الاختبار إلى فئات تكافؤ متعددة . يُسمى هذا التقسيم بتقسيم مدخلات الاختبار إلى فئات تكافؤ. إذا كان هناك N فئة تكافؤ، فإن N متجهًا فقط تكفي لتغطية النظام بالكامل.
يمكن إجراء العرض التوضيحي باستخدام دالة مكتوبة بلغة C :
int safe_add ( int a , int b ) { int c = a + b ;إذا كانت ( a > 0 && b > 0 && c <= 0 ) { fprintf ( stderr , "تجاوز السعة (موجب)! \n " ); }إذا كانت ( a < 0 && b < 0 && c >= 0 ) { fprintf ( stderr , "تجاوز السعة (قيمة سالبة)! \n " ); }أعد c ; }استنادًا إلى الكود، يتم تقسيم متجهات الإدخال [ a , b ] . وتشمل الكتل التي نحتاج إلى تغطيتها حالات تجاوز السعة في الاتجاه الموجب، والاتجاه السالب، وحالات عدم تجاوز أي منهما. وينتج عن ذلك ثلاث فئات متكافئة، وفقًا لمراجعة الكود نفسها.

لحل مشكلة الإدخال، نلجأ إلى المتباينة.
يوجد حجم ثابت للأعداد الصحيحة (في علوم الحاسوب)، لذا يمكن استبدال z بما يلي:
- INT_MIN ≤ x + y ≤ INT_MAX
و
حيث x ∈ { INT_MIN , ... , INT_MAX } و y ∈ { INT_MIN , ... , INT_MAX }
تُسمى قيم متجه الاختبار عند تحقق شرط المساواة التام، أي INT_MIN = x + y و INT_MAX = x + y ، بالقيم الحدية. يوفر تحليل القيم الحدية معلومات تفصيلية عنها. تجدر الإشارة إلى أن الرسم البياني يغطي حالة تجاوز السعة فقط، أي الربع الأول للقيم الموجبة لـ X و Y.
بشكل عام، تحتوي المدخلات على نطاقات صالحة وأخرى غير صالحة. لا تعني البيانات غير الصالحة هنا أن البيانات خاطئة، بل تعني أنها تقع خارج نطاق قسم محدد. يمكن توضيح ذلك بشكل أفضل من خلال مثال دالة تأخذ مُعاملًا يُسمى "الشهر". النطاق الصالح لهذا الشهر هو من 1 إلى 12، أي من يناير إلى ديسمبر. يُسمى هذا النطاق الصالح "قسمًا". في هذا المثال، يوجد قسمان إضافيان من النطاقات غير الصالحة. القسم غير الصالح الأول هو ≤ 0، والقسم غير الصالح الثاني هو ≥ 13.
... -2 -1 0 1 .............. 12 13 14 15 ..... --------------|-------------------|--------------------- القسم 1 غير صالح، القسم 1 صالح، القسم 2 غير صالح
تنص نظرية الاختبار المتعلقة بتقسيم التكافؤ على أن حالة اختبار واحدة فقط من كل قسم تكفي لتقييم سلوك البرنامج في ذلك القسم. بعبارة أخرى، يكفي اختيار حالة اختبار واحدة من كل قسم للتحقق من سلوك البرنامج. استخدام عدد أكبر من حالات الاختبار، أو حتى جميعها، لن يكشف عن أخطاء جديدة في البرنامج. تُعتبر القيم داخل القسم الواحد "متكافئة". وبالتالي، يمكن تقليل عدد حالات الاختبار بشكل كبير.
من الآثار الإضافية لتطبيق هذه التقنية اكتشاف حالات الاختبار "غير الصالحة". قد يميل المختبر عديم الخبرة إلى استخدام بيانات الإدخال من 1 إلى 12 للشهر كحالات اختبار، وينسى اختيار بعض الأقسام غير الصالحة. سيؤدي هذا إلى عدد هائل من حالات الاختبار غير الضرورية من جهة، ونقص في حالات الاختبار للنطاقات غير الصالحة من جهة أخرى.
يميل البعض إلى ربط تقسيم التكافؤ بما يُسمى اختبار الصندوق الأسود ، وهو فحص دقيق لمكون برمجي عند واجهته فقط، دون النظر إلى بنيته الداخلية. ولكن بالتدقيق، نجد حالات ينطبق فيها هذا المفهوم على اختبار الصندوق الرمادي أيضًا. تخيل واجهة لمكون ما، نطاق قيمها الصالحة بين 1 و12، كما في المثال السابق. مع ذلك، قد تُفرّق الدالة داخليًا بين القيم بين 1 و6، وبين القيم بين 7 و12. وبناءً على قيمة الإدخال، سيسلك البرنامج مسارات مختلفة لتنفيذ إجراءات متباينة قليلاً. لن يُلاحظ هذا الاختلاف في واجهات الإدخال والإخراج للمكون، ولكن في اختبار الصندوق الرمادي، من المهم التأكد من فحص كلا المسارين. لتحقيق ذلك، من الضروري إضافة تقسيمات تكافؤ إضافية، وهي غير ضرورية في اختبار الصندوق الأسود. في هذا المثال، ستكون هذه التقسيمات كالتالي:
... -2 -1 0 1 ..... 6 7 ..... 12 13 14 15 ..... --------------|---------|----------|--------------------- القسم 1 غير صالح P1 P2 القسم 2 غير صالح التقسيمات الصالحة
للتحقق من النتائج المتوقعة، ستحتاج إلى تقييم بعض القيم الوسيطة الداخلية بدلاً من واجهة الإخراج. ليس من الضروري استخدام قيم متعددة من كل قسم. في السيناريو المذكور أعلاه، يمكننا أخذ -2 من القسم غير الصالح 1، و6 من القسم الصالح P1، و7 من القسم الصالح P2، و15 من القسم غير الصالح 2.
لا يُعدّ تقسيم التكافؤ طريقةً مستقلةً لتحديد حالات الاختبار، بل يجب استكماله بتحليل القيم الحدية . فبعد تحديد تقسيمات المدخلات المحتملة، يُطبّق تحليل القيم الحدية لاختيار حالات الاختبار الأكثر فعالية من بين هذه التقسيمات.
القيود
في الحالات التي تكون فيها نطاقات أو مجموعات البيانات بسيطة (مثال: 0-10، 11-20، 21-30)، ويكون اختبار جميع القيم عمليًا، يُنصح باستخدام تغطية اختبار شاملة تشمل جميع القيم داخل النطاقات ومحيطها. تكشف هذه التغطية عن أخطاء لا يمكن اكتشافها باستخدام طريقة تقسيم التكافؤ، إذا كان البرنامج يتضمن أقسامًا فرعية غير معروفة للمختبِر. [ 2 ] كذلك، في الحالات البسيطة، تقل فائدة تقليل عدد قيم الاختبار باستخدام تقسيم التكافؤ، مقارنةً بالحالات التي تتضمن نطاقات أكبر (مثال: 0-1000، 1001-2000، 2001-3000).
للمزيد من القراءة
- موقع فريق عمل معايير الاختبار ( مؤرشف بتاريخ 23 يوليو 2010 على موقع Wayback Machine)
- Parteg ، أداة مجانية لتوليد الاختبارات تجمع بين توليد مسار الاختبار من آلات الحالة UML وتوليد فئة التكافؤ لقيم الإدخال.
- https://books.google.com/books/about/Software_Testing_Techniques.html
مراجع
- اختبار البرمجيات
