الاختبار الزوجي

الاختبار الزوجي (Pairwise Testing)، ويُسمّى أيضاً اختبار جميع الأزواج (All-pairs Testing)، تقنية لتصميم الاختبار من نوع الصندوق الأسود، تُستخدم مع الميزات التي تعتمد على عدة معاملات (Parameters) لكل منها بضع قيم. فبدلاً من اختبار كل التركيبات، تختار الاختبارات بحيث يظهر كل زوج من قيم أي معاملين معاً في اختبار واحد على الأقل. فالمتجر الإلكتروني المدعوم في ⁦3⁩ متصفحات، وعلى ⁦3⁩ أنظمة تشغيل، وبـ⁦3⁩ لغات، له ⁦27⁩ تركيبة، ومع ذلك تحتوي ⁦9⁩ اختبارات مختارة جيداً على كل أزواج المتصفح ونظام التشغيل، والمتصفح واللغة، ونظام التشغيل واللغة.

تُبنى هذه التقنية على تقسيم التكافؤ (Equivalence Partitioning): فالتقسيم يعطي كل معامل قيمه، قيمةً ممثِّلة لكل قسم، والاختبار الزوجي يقرّر كيف تُجمع هذه القيم دون أن يتضاعف عدد الاختبارات.

لماذا يهم

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

الاختبار الزوجي حلّ وسط منهجي. فبدلاً من «الإعدادات التي نجرّبها عادةً»، يحصل الفريق على مجموعة صغيرة يمكن ذكر تغطيتها والتحقق منها، مثل «جميع أزواج القيم الـ⁦27⁩ في ⁦9⁩ اختبارات».

لماذا ينفجر عدد التركيبات الكاملة

المعامل هو أي شيء يتغيّر مستقلاً عن غيره: المتصفح، ونظام التشغيل، ولغة الواجهة، ودور المستخدم، وطريقة الدفع، وعلم الميزة (Feature Flag). وعدد التركيبات هو حاصل ضرب أعداد القيم، لذلك يضاعف كل معامل جديد المجموع.

وفي الطرف الآخر تقع تغطية كل اختيار (Each Choice Coverage) التي تعرّفتَ إليها في درس تقسيم التكافؤ: أن تظهر كل قيمة في اختبار واحد على الأقل، فتكفي ثلاثة اختبارات عندما يكون لكل معامل ثلاث قيم. وهي رخيصة، لكنها لا تجمع قيمتين بعينهما عن قصد أبداً.

  • المتصفح (⁦3⁩ قيم) × نظام التشغيل (⁦3⁩) × اللغة (⁦3⁩) = ⁦27⁩ تركيبة.
  • أضف حجم الشاشة (هاتف، جهاز لوحي، حاسوب): ⁦27 × 3 = 81⁩.
  • أضف دورين للمستخدم (زائر، مسجّل الدخول): ⁦81 × 2 = 162⁩، أي ⁦27⁩ ساعة بمعدل ⁦10⁩ دقائق لكل تشغيل يدوي.
  • عشرة معاملات لكل منها ثلاث قيم: 3^10 أي ⁦59,049⁩ تركيبة.

ما معنى تغطية جميع الأزواج

زوج القيم هو قيمة لمعامل مع قيمة لمعامل آخر، مثل Browser = Chrome مع Language = Arabic؛ ويسمّيه مسرد ISTQB زوجاً من أزواج المعامل والقيمة (Pair of Parameter-Value Pairs). وأزواج القيم هي عناصر التغطية (Coverage Items) في هذه التقنية: فالتغطية الزوجية (Pairwise Coverage) هي نسبة أزواج القيم التي ينفّذها اختبار واحد على الأقل، والمجموعة الزوجية تبلغ ⁦100%⁩.

وتبقى المجموعة صغيرة لأن الاختبار الواحد يغطي عدة أزواج في آنٍ واحد: فالاختبار Chrome · Windows · العربية يغطي Chrome–Windows وChrome–العربية وWindows–العربية. وكلما زادت معاملات الاختبار زادت الأزواج التي يغطيها، ولهذا تنمو المجموعة الزوجية ببطء مع إضافة المعاملات.

ولا يمكن لأي مجموعة أن تكون أصغر من عدد قيم أكبر معامل مضروباً في عدد قيم المعامل الذي يليه: ⁦4⁩ متصفحات و⁦3⁩ أنظمة تشغيل تحتاج إلى ⁦12⁩ اختباراً على الأقل. وتستخدم معظم الأدوات خوارزميات جشعة (Greedy) تجد مجموعة صغيرة وليست بالضرورة الأصغر؛ والمهم أن تبلغ تغطية الأزواج ⁦100%⁩.

Parameters:        Browser (3), OS (3), Language (3)

All combinations:  3 × 3 × 3                  = 27 tests

Value pairs:       Browser–OS         3 × 3  =  9
                   Browser–Language   3 × 3  =  9
                   OS–Language        3 × 3  =  9
                   total                     = 27 pairs

Pairs in one test: 3 (one per pair of parameters)
Fewest tests:      3 × 3 (two largest)       =  9 tests
                   27 pairs / 3 per test     =  9, so each pair appears once

جرّبها: مولّد الاختبار الزوجي (Pairwise)

مثال تطبيقي: المتصفحات × أنظمة التشغيل × اللغات

صفحة دفع يجب أن تعمل في Chrome وFirefox وEdge، على Windows وmacOS وLinux، باللغات الإنجليزية والعربية (من اليمين إلى اليسار) والهندية. واستُبعد Safari لأنه يعمل على منصات Apple فقط، فالزوج Safari–Windows مستحيل؛ والقواعد التي تستبعد مثل هذه الأزواج، أي القيود (Constraints)، من موضوعات درس الاختبار التوافيقي.

ابنِ المجموعة يدوياً. ارسم شبكة صفوفها المتصفحات وأعمدتها أنظمة التشغيل: خاناتها التسع هي أزواج المتصفح ونظام التشغيل التسعة، لكل منها اختبار. ثم اكتب في كل خانة لغةً بحيث تظهر كل لغة مرة واحدة في كل صف ومرة واحدة في كل عمود. عندها يحمل كل صف كل أزواج المتصفح واللغة، ويحمل كل عمود كل أزواج نظام التشغيل واللغة.

تسعة اختبارات تغطي أزواج القيم الـ⁦27⁩ كلها للمتصفح ونظام التشغيل واللغة: كل خانة اختبار واحد، وكل لغة تظهر مرة واحدة في كل صف وفي كل عمود.
المتصفحنظام التشغيل
WindowsmacOSLinux
Chromeالإنجليزية#1العربية#2الهندية#3
Firefoxالعربية#4الهندية#5الإنجليزية#6
Edgeالهندية#7الإنجليزية#8العربية#9
  • الإنجليزية
  • العربية
  • الهندية
كيف تقرأ الشبكة
الخانة اختبار واحد: متصفح صفّها، ونظام تشغيل عمودها، واللغة المكتوبة فيها. والخانات التسع هي أزواج المتصفح ونظام التشغيل التسعة.
الصف تظهر اللغات الثلاث مرة واحدة، فيُغطّى كل زوج من المتصفح واللغة.
العمود تظهر اللغات الثلاث مرة واحدة، فيُغطّى كل زوج من نظام التشغيل واللغة.

اختبار كل التركيبات يحتاج إلى ⁦27⁩ اختباراً. وهذا الترتيب، المسمّى المربع اللاتيني (Latin Square)، واحد من عدة مجموعات صالحة من ⁦9⁩ اختبارات.

  • كل صف إعداد (Configuration) وليس حالة اختبار: شغّل سيناريو الدفع نفسه، بخطواته ونتائجه المتوقعة، في الإعدادات التسعة كلها.
  • قد تعيد أداة «مولّد الاختبار الزوجي» ⁦10⁩ اختبارات لهذه المدخلات؛ وأي مجموعة تبلغ تغطية أزواجها ⁦100%⁩ صحيحة.
  • تركيبة Chrome على Windows بالعربية ليست في المجموعة، مع أن كل زوج من أزواجها موجود. فإذا أظهرت التحليلات أن معظم العملاء يستخدمونها، فأضفها اختباراً عاشراً: الاختبار الزوجي يعامل كل الأزواج بأهمية متساوية، أما المخاطر فلا.
النسخة النصية
#  Browser  OS       Language
1  Chrome   Windows  English
2  Chrome   macOS    Arabic
3  Chrome   Linux    Hindi
4  Firefox  Windows  Arabic
5  Firefox  macOS    Hindi
6  Firefox  Linux    English
7  Edge     Windows  Hindi
8  Edge     macOS    English
9  Edge     Linux    Arabic

9 tests instead of 27 combinations; 27 of 27 value pairs covered

جرّبها: مولّد الاختبار الزوجي (Pairwise)

أين يتوقف الاختبار الزوجي

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

  • قد تفوته التفاعلات بين ثلاث قيم أو أكثر. وللميزات عالية المخاطر استخدم الاختبار الثلاثي (3-wise) الذي يغطي كل ثلاثية من القيم بدلاً من كل زوج؛ ودرس الاختبار التوافيقي يبيّن كيف.
  • لا يختار القيم بنفسه: فالقسم أو الحدّ الغائب عن قائمة القيم لا يُختبر أبداً، لذا اختر القيم أولاً بتقسيم التكافؤ وتحليل القيم الحدّية.
  • لا يعرف شيئاً عن التركيبات المستحيلة أو المهمة: فالأزواج المستحيلة تحتاج إلى قيود، والإعدادات الأساسية يجب إضافتها عن قصد.
  • القيم غير الصالحة لا مكان لها في المجموعة المجمّعة: فالاختبار الذي يحمل قيمتين غير صالحتين يتوقف عادةً عند الخطأ الأول فيُخفي الثاني، وهذا ما يُسمّى الحجب (Masking). اختبر كل قيمة غير صالحة وحدها.
  • لا يناسب كل مشكلة: استخدم جدول القرار عندما تحدد قاعدة عمل النتيجة من تركيبات بعينها، واختبار انتقالات الحالة عندما يهمّ ترتيب الأحداث.

أخطاء شائعة

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

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

استخدم الاختبار الزوجي كلما ذكر أساس الاختبار خيارات قابلة للجمع: المتصفحات والأجهزة المدعومة، واللغات، والأدوار، والخطط، وطرق الدفع، وأعلام الميزات. وأثناء تحليل الاختبار وتصميمه اكتب النموذج (المعاملات والقيم والتركيبات المستحيلة) وراجعه مع المطورين ومالك المنتج: ما القيم المدعومة فعلاً؟ وما الأزواج التي لا يمكن أن تحدث؟ وما الإعدادات الأهم بحسب التحليلات وتذاكر الدعم وسلاسل User-Agent في سجلات الخادم؟

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

تمرين عملي

ابنِ مجموعة اختبار زوجي لصفحة دفع اشتراك

المطلوب

صفحة تسجيل في اشتراك تجمع المعاملات الأربعة أدناه، وكل التركيبات مسموحة. احسب عدد التركيبات وعدد أزواج القيم، وابنِ مجموعة زوجية يدوياً، ثم قارنها بأداة «مولّد الاختبار الزوجي».

ثم سمِّ تركيبة لا تحتويها مجموعتك، واذكر متى تضيفها اختباراً إضافياً.

المادة
Plan:     Basic, Pro, Business
Payment:  card, wallet, bank transfer
Billing:  monthly, yearly
Currency: SAR, USD
الخطوات
  1. احسب عدد التركيبات الكاملة.
  2. احسب أزواج القيم لكل زوج من المعاملات، ثم المجموع.
  3. استنتج الحد الأدنى لعدد الاختبارات من أكبر معاملين.
  4. ابدأ بشبكة الخطة × طريقة الدفع ذات الخانات التسع، ثم املأ فترة الفوترة والعملة بحيث يظهر كل زوج.
  5. شغّل المعاملات نفسها في «مولّد الاختبار الزوجي» وقارن الحجم والتغطية.
إظهار الإجابة النموذجية
الإجابة النموذجية

التركيبات: ⁦3 × 3 × 2 × 2 = 36⁩.

أزواج القيم: الخطة والدفع ⁦9⁩، والخطة والفوترة ⁦6⁩، والخطة والعملة ⁦6⁩، والدفع والفوترة ⁦6⁩، والدفع والعملة ⁦6⁩، والفوترة والعملة ⁦4⁩؛ والمجموع ⁦37⁩. والحد الأدنى ⁦3 × 3 = 9⁩ اختبارات، واحد لكل زوج من أزواج الخطة والدفع.

مجموعة صالحة: Basic · card · monthly · SAR، Basic · wallet · yearly · SAR، Basic · bank transfer · monthly · USD، Pro · card · yearly · USD، Pro · wallet · monthly · SAR، Pro · bank transfer · monthly · SAR، Business · card · monthly · SAR، Business · wallet · monthly · USD، Business · bank transfer · yearly · SAR. كل خطة وكل طريقة دفع تظهر مع فترتي الفوترة ومع العملتين، وأزواج الفوترة والعملة الأربعة كلها موجودة.

قد يعيد المولّد ⁦10⁩ اختبارات؛ وأي مجموعة تحتوي الأزواج الـ⁦37⁩ كلها صحيحة. ومما ليس في هذه المجموعة: خطة Business بالدفع عبر التحويل البنكي بالدولار؛ أضفها إن كان هذا المسار عالي المخاطر، مثل الفواتير الكبيرة لعملاء الأعمال في الخارج.

أسئلة شائعة

هل الاختبار الزوجي هو نفسه استخدام المصفوفات المتعامدة؟

ليس تماماً. المصفوفة المتعامدة (Orthogonal Array) طريقة لبناء مجموعة زوجية يظهر فيها كل زوج العدد نفسه من المرات، ومثال الاختبارات التسعة في هذا الدرس واحدة منها. أما الاختبار الزوجي فيشترط ظهور كل زوج مرة واحدة على الأقل فقط، وهذا يسمح للمولّدات بالتعامل مع معاملات تختلف أعداد قيمها ومع التركيبات المستحيلة.

كم اختباراً تحتاج المجموعة الزوجية؟

على الأقل عدد قيم أكبر معامل مضروباً في عدد قيم المعامل الذي يليه. وبعد ذلك ينمو الحجم ببطء: إضافة حجم الشاشة إلى مثال الدرس ترفع التركيبات من ⁦27⁩ إلى ⁦81⁩، ومع ذلك يمكن أن تغطي ⁦9⁩ اختبارات أزواج القيم الـ⁦54⁩ كلها، وعشرة معاملات لكل منها ثلاث قيم (⁦59,049⁩ تركيبة و⁦405⁩ من أزواج القيم) تكفيها أقل من ⁦30⁩ اختباراً.

هل أستخدم الاختبار الزوجي لحقول النماذج أيضاً، لا للإعدادات فقط؟

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

المراجع

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

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

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

أنشئ جداول القرار من الشروط والإجراءات، وولّد جميع تركيبات القواعد، واختزل المستحيل منها.

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

تحليل سلاسل User-Agent إلى المتصفح والإصدار والمحرك ونظام التشغيل ونوع الجهاز مع كشف الروبوتات.

الويب

للتعمّق أكثر

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

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