حالات اختبار قابلة لإعادة الاستخدام وحالات الانحدار

حالة الاختبار القابلة لإعادة الاستخدام (Reusable Test Case) تُكتب مرة واحدة وتُشغَّل مرات كثيرة، ببيانات مختلفة وضمن حزم مختلفة. تكتب الخطوات مرة واحدة، وتضع القيم المتغيرة في جدول بيانات، وتحفظ التهيئة المشتركة، مثل تسجيل الدخول، في كتلة مشتركة واحدة. أما حالة اختبار الانحدار (Regression Test Case) فهي حالة استحقت مكاناً في حزمة الانحدار: الحالات التي يُعاد تشغيلها بعد التغييرات للتحقق من أن ما كان يعمل ما زال يعمل.

مثال ذلك متجر يسمح للعميل بإضافة ما بين ⁦1⁩ و⁦10⁩ وحدات من صنف إلى السلة. فبأسلوب الحالات المكتوبة لمرة واحدة تُكتب أربع حالات للكميات ⁦1⁩ و⁦10⁩ و⁦0⁩ و⁦11⁩، تكرر كلٌّ منها خطوات تسجيل الدخول. أما بالأسلوب القابل لإعادة الاستخدام فتُكتب حالة واحدة، «أضف <qty> وحدات إلى السلة»، مع جدول للكميات ونتائجها المتوقعة.

لماذا يهم

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

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

من حالة الاختبار لمرة واحدة إلى الحالة القابلة لإعادة الاستخدام

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

أما الحالة القابلة لإعادة الاستخدام فتفصل بين الثلاثة. وبمصطلحات مسرد ISTQB، الحالة المكتوبة بعناصر نائبة حالة اختبار عالية المستوى (High-level)، أي منطقية: مدخلاتها ونتائجها المتوقعة مجردة. وكل صف من القيم المحددة في جدولها يجعل منها حالة اختبار منخفضة المستوى (Low-level)، أي ملموسة، لها نتيجتها المتوقعة ونجاحها أو فشلها الخاص.

  • ذات معاملات (Parameterised): تحتوي الخطوات على عناصر نائبة مثل <qty> بدلاً من القيم الثابتة.
  • معتمدة على البيانات (Data-Driven): جدول من القيم والنتائج المتوقعة يقود مرات التشغيل، صف لكل تشغيل.
  • خطوات مشتركة (Shared Steps): التهيئة التي تحتاجها حالات كثيرة، مثل تسجيل الدخول، تُكتب مرة واحدة ويُشار إليها بمعرّفها.
قاعدة كمية السلة من ⁦1⁩ إلى ⁦10⁩ وحدات: أربع حالات لمرة واحدة تكرر تسجيل الدخول وتثبّت قيمها في الخطوات، وحالة واحدة قابلة لإعادة الاستخدام تحفظ الخطوات مرة واحدة والقيم في جدول بيانات وتسجيل الدخول في الكتلة المشتركة SS-01.

حالات اختبار لمرة واحدة

أربع حالات، واحدة لكل كمية: ⁦1⁩ و⁦10⁩ و⁦0⁩ و⁦11⁩

الخطوات:
تُكتب من جديد في كل حالة
القيم:
مثبّتة داخل الخطوات
تهيئة الدخول والمنتج:
منسوخة في كل حالة
إضافة قيمة مثل ⁦2.5⁩:
انسخ حالة كاملة وعدّلها
الحد يتغير من ⁦10⁩ إلى ⁦20⁩:
ابحث عن كل حالة تستخدم الحد أو تذكره وعدّلها
صفحة الدخول تتغير:
عدّل كل حالة
النتائج المسجّلة:
نتيجة لكل حالة

حالة اختبار قابلة لإعادة الاستخدام

TC-CART-010 مع <qty> وجدول بيانات والكتلة المشتركة SS-01

الخطوات:
تُكتب مرة واحدة
القيم:
صف لكل قيمة في جدول بيانات، موسوم بنوعه
تهيئة الدخول والمنتج:
الكتلة المشتركة SS-01، يُشار إليها بمعرّفها
إضافة قيمة مثل ⁦2.5⁩:
أضف صفاً واحداً
الحد يتغير من ⁦10⁩ إلى ⁦20⁩:
عدّل الجدول وحده: ⁦20⁩ و⁦21⁩ بدل ⁦10⁩ و⁦11⁩
صفحة الدخول تتغير:
عدّل SS-01 فقط
النتائج المسجّلة:
نتيجة لكل صف

مثال تطبيقي: حالة واحدة وصفوف بيانات كثيرة

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

شغّل الحالة صفاً صفاً وسجّل نتيجة لكل صف. فإذا تغيّر الحد من ⁦10⁩ إلى ⁦20⁩، عدّلت الجدول وحده: تحلّ ⁦20⁩ و⁦21⁩ محل ⁦10⁩ و⁦11⁩، وتذكر الرسائل الحد الجديد، وتبقى الخطوات كما هي. وإذا حُفظ الجدول نفسه ملفَّ CSV (قيم مفصولة بفواصل: جدول في ملف نصي عادي، كل صف منه في سطر)، أمكن أن يغذّي اختباراً مؤتمتاً: فمسرد ISTQB يصف الاختبار المعتمد على البيانات (Data-Driven Testing) بأنه أسلوب في كتابة النصوص البرمجية يحفظ بيانات الاختبار والنتائج المتوقعة في ملفات بيانات تستخدمها نصوص الاختبار.

حالة الاختبار TC-CART-010: أضف <qty> وحدات من منتج إلى السلة
الشرط المسبق: الكتلة المشتركة SS-01، سجّل الدخول عميلاً وافتح المنتج P-200
(مستوى المخزون كما في الصف)
الخطوات: 1. أدخل <qty> في حقل «الكمية»
2. اختر «أضف إلى السلة»
النتيجة المتوقعة: <expected>

كل صف: النوع، والكمية، والمخزون، ثم النتيجة المتوقعة
الصف R1: إيجابي، 3، 50: يُضاف، وتعرض السلة 3 × P-200
الصف R2: قيمة حدّية، 1، 50: يُضاف، وتعرض السلة 1 × P-200
الصف R3: قيمة حدّية، 10، 50: يُضاف، وتعرض السلة 10 × P-200
الصف R4: قيمة حدّية، 0، 50: رفض: «أدخل كمية من 1 إلى 10»
الصف R5: قيمة حدّية، 11، 50: رفض: «يمكنك إضافة 10 وحدات على الأكثر»
الصف R6: سلبي، 2.5، 50: رفض: «أدخل عدداً صحيحاً»، والسلة دون تغيير
الصف R7: حالة حدّية، (فارغ)، 50: رفض: «أدخل كمية من 1 إلى 10»
الصف R8: حالة حدّية، 5، 4: رفض: «بقيت 4 وحدات فقط في المخزون»، والسلة دون تغيير

جرّبها: مولّد حالات الاختبار جرّبها: مولّد مجموعات بيانات CSV

الخطوات المشتركة: اكتب التهيئة المتكررة مرة واحدة

اكتب التهيئة التي تتشاركها حالات كثيرة، مثل تسجيل الدخول وفتح منتج، مرة واحدة كتلةً من الخطوات المشتركة لها معرّفها، مثل SS-01. فإذا أُضيفت إلى صفحة الدخول خطوة لإدخال كلمة مرور لمرة واحدة (OTP)، حدّثت SS-01 فعادت كل حالة تستخدمها محدَّثة. وكثيراً ما تسمّي أدوات إدارة الاختبار ذلك الخطوات المشتركة (Shared Steps)؛ وفي الجدول الإلكتروني تؤدي الإشارة إلى معرّف الكتلة الغرض نفسه.

  • اقصر الكتلة على التهيئة والتنقل. فالسلوك الذي تفحصه الحالة يبقى في الحالة نفسها، حيث يراه من ينفّذها.
  • اختم الكتلة بنقطة تحقق، مثل «تظهر صفحة P-200»، حتى لا تُسجَّل مشكلة في التهيئة على أنها فشل للحالة.
  • قبل أن تغيّر كتلة، تحقق من الحالات التي تستخدمها: فالتغيير الذي تجريه من أجل ميزة واحدة قد يكسر الحالات الأخرى.

أنواع الحالات في الحزمة: إيجابية وسلبية وقيم حدّية وحالات حدّية

وسم كل صف بنوعه يكشف الثغرات: فإذا كانت الصفوف كلها إيجابية، فالحزمة لا تثبت إلا المسار السعيد (Happy Path) مهما كثرت صفوفها. والتوازن لا يعني أعداداً متساوية، بل أن يكون لكل قاعدة جانبها المقبول وجانبها المرفوض مغطّيين. وفي قاعدة الكمية:

  • إيجابية (Positive): مدخلات صالحة واستخدام مقصود، مثل ⁦3⁩ وحدات. يُضاف الصنف.
  • سلبية (Negative): مدخلات غير صالحة، مثل ⁦2.5⁩. تُرفض برسالة واضحة ولا تتغير السلة.
  • قيم حدّية (Boundary): أصغر القيم المسموح بها وأكبرها وجاراتها خارج النطاق مباشرةً: ⁦1⁩ و⁦10⁩ و⁦0⁩ و⁦11⁩.
  • حالات حدّية (Edge): مدخل واحد أو ظرف واحد عند أقصى طرف، مثل حقل فارغ، أو صنف يكاد ينفد: بقيت ⁦4⁩ وحدات والمطلوب ⁦5⁩.

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

بناء حزمة الانحدار وصيانتها

بيّن درس اختبار التأكيد واختبار الانحدار كيف تختار الاختبارات التي تشغّلها بعد تغيير ما؛ أما هذا القسم فعن الحزمة نفسها. تنتمي الحالة إليها حين تحمي سلوكاً يجب أن يستمر في العمل وتكون نتيجتها المتوقعة مستقرة. ضع على كل حالة وسماً بطبقتها (Tier)، مثل core لكل بناء (Build) وfull للتشغيل الليلي، مسترشداً بأولويتها، وراجع الحزمة في موعد ثابت، مثل نهاية كل إصدار.

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

جرّبها: مولّد سيناريوهات الانحدار جرّبها: كاشف حالات الاختبار المكرّرة بالذكاء الاصطناعي

أخطاء شائعة

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

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

قبل أن تكتب كتلة مشتركة، تحقق من أنها غير موجودة مسبقاً، واتفق مع المختبِرين الآخرين على بادئات المعرّفات (TC- وSS-) ووسوم النوع ووسوم الطبقة. وأشرك من يؤتمت الاختبارات: فجدول البيانات الجيد يمكن أن يصبح ملف بيانات لاختبار مؤتمت بتعديل بسيط.

ولكل حالة انحدار، سجّل سبب وجودها في الحزمة (رحلة حرجة، أو عيب سابق، أو قاعدة عمل)، ومالكها، وتاريخ آخر مراجعة لها. وفي نهاية الإصدار، راجع ما تغيّر مع المطورين ومالك المنتج، ثم حدّث الحالات وادمجها وأوقفها.

تمرين عملي

حوّل حالات رمز الخصم المنسوخة إلى حالة واحدة قابلة لإعادة الاستخدام

المطلوب

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

المادة
القاعدة: يمنح الرمز SAVE10 خصماً بنسبة 10% على الطلبات بقيمة 50.00 ريال فأكثر.
لا تميّز الرموز بين الأحرف الكبيرة والصغيرة، وتُرفض الرموز المنتهية الصلاحية مثل OLD5.

حالة TC-41: سجّل الدخول، وأضف أصنافاً بـ 200.00، وافتح السلة، وطبّق SAVE10: خصم 20.00
حالة TC-42: سجّل الدخول، وأضف أصنافاً بـ 49.99، وافتح السلة، وطبّق SAVE10: رفض
حالة TC-43: سجّل الدخول، وأضف أصنافاً بـ 200.00، وافتح السلة، وطبّق OLD5: رفض
حالة TC-44: سجّل الدخول، وأضف أصنافاً بـ 200.00، وافتح السلة، وطبّق save10: خصم 20.00
حالة TC-45: سجّل الدخول، وأضف أصنافاً بـ 200.00، وافتح السلة، وطبّق SAVE10: خصم 20.00
حالة TC-46: سجّل الدخول، وأضف تغليف هدايا إلى طلب: يُضاف تغليف الهدايا
(حُذف تغليف الهدايا من المنتج في الإصدار 4.2)
الخطوات
  1. اكتب الكتلة المشتركة للتهيئة التي تكررها كل حالة، واختمها بنقطة تحقق.
  2. اكتب حالة واحدة ذات معاملات، وحوّل الحالات من TC-41 إلى TC-45 إلى صفوف موسومة بنوعها مع نتائجها المتوقعة.
  3. أضف الصفوف التي ما زالت تنقص الحزمة المتوازنة.
  4. قرّر لكل حالة أصلية: تبقى صفاً، أو تُدمج، أو تُوقف، واختر طبقتها.
إظهار الإجابة النموذجية
الإجابة النموذجية

الكتلة المشتركة SS-07: سجّل الدخول عميلاً، وأضف أصنافاً بقيمة <cart> ريال، وافتح السلة. نقطة التحقق: يظهر إجمالي السلة <cart>.

TC-COUPON-01 «طبّق <code> على سلة بقيمة <cart> ريال». الصفوف: إيجابي، ⁦200.00⁩ مع SAVE10، خصم ⁦20.00⁩؛ قيمة حدّية، ⁦49.99⁩ مع SAVE10، رفض (الحد الأدنى للطلب)؛ سلبي، ⁦200.00⁩ مع OLD5، رفض (منتهي الصلاحية)؛ إيجابي، ⁦200.00⁩ مع save10، خصم ⁦20.00⁩.

الصفوف الناقصة: قيمة حدّية، ⁦50.00⁩ مع SAVE10، خصم ⁦5.00⁩؛ سلبي، رمز غير معروف مثل ABC123، رفض؛ حالة حدّية، رمز فارغ، رفض؛ سلبي، تطبيق SAVE10 مرة ثانية على السلة نفسها، يبقى الخصم ⁦20.00⁩ ولا يتضاعف. والقاعدة لا تذكر الرسالة التي تظهر في المحاولة الثانية، فاسأل مالك المنتج.

الحزمة: تصبح الحالات من TC-41 إلى TC-44 صفوفاً؛ وTC-45 تكرر TC-41 فتُدمج؛ وتُوقف TC-46 مع ذكر السبب «حُذف تغليف الهدايا في الإصدار ⁦4.2⁩». وتدخل TC-COUPON-01 الطبقة core: فهي تغيّر ما يدفعه العملاء.

أسئلة شائعة

هل حالة الاختبار ذات المعاملات هي نفسها الاختبار المؤتمت المعتمد على البيانات؟

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

هل يجب أن تدخل كل حالة اختبار حزمة الانحدار؟

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

كم مرة ينبغي مراجعة حزمة الانحدار؟

في موعد ثابت، مثل نهاية كل إصدار أو سبرنت، وكلما تغيّر متطلب. وانتظار أن تصبح الحزمة بطيئة جداً أو غير موثوقة يعني أن الفريق توقف عن الثقة بها بالفعل.

المراجع

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

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

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

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

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

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

للتعمّق أكثر

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

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