حالات اختبار قابلة لإعادة الاستخدام وحالات الانحدار
حالة الاختبار القابلة لإعادة الاستخدام (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 و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
أنواع الحالات في الحزمة: إيجابية وسلبية وقيم حدّية وحالات حدّية
وسم كل صف بنوعه يكشف الثغرات: فإذا كانت الصفوف كلها إيجابية، فالحزمة لا تثبت إلا المسار السعيد (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)- اكتب الكتلة المشتركة للتهيئة التي تكررها كل حالة، واختمها بنقطة تحقق.
- اكتب حالة واحدة ذات معاملات، وحوّل الحالات من TC-41 إلى TC-45 إلى صفوف موسومة بنوعها مع نتائجها المتوقعة.
- أضف الصفوف التي ما زالت تنقص الحزمة المتوازنة.
- قرّر لكل حالة أصلية: تبقى صفاً، أو تُدمج، أو تُوقف، واختر طبقتها.
إظهار الإجابة النموذجية
الكتلة المشتركة 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 Glossaryالتعريفات القياسية لمصطلحات الاختبار — حالة الاختبار واختبار الانحدار والخطورة والأولوية وتحليل القيم الحدّية وغيرها.
- ISTQB Certified Tester Foundation Level (CTFL) v4.0المنهج التأسيسي لاختبار البرمجيات: مستويات الاختبار وأنواعه وتقنيات تصميم الاختبارات وإدارة الاختبار والأدوات.
تدرّب بأدوات متقن
ولّد حالات اختبار منظّمة (المعرّف والعنوان والشروط المسبقة والخطوات والنتيجة المتوقّعة والأولوية) من وصف الميزة وقائمة الحقول.
ولّد ملفات CSV بأعمدة وأنواع بيانات وأعداد صفوف وفواصل مخصصة.
ولّد القيم الحدّية حول الحدود: min-1 وmin وmin+1 وmax-1 وmax وmax+1 للأعداد الصحيحة بأي عرض.
ولّد حالات اختبار سلبية لحقول النماذج وواجهات API: قيم فارغة وnull ونوع خاطئ وطول زائد وحقن وصيغة غير صالحة.
ولّد سيناريوهات اختبار الانحدار من وصف التغيير وقائمة الوحدات المتأثرة والمرتبطة.
اعثر على حالات الاختبار المكرّرة والمتداخلة في مجموعة اختبار واحصل على توصيات الدمج من الذكاء الاصطناعي من متقن.
للتعمّق أكثر
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.