اختبار التأكيد واختبار الانحدار
كل تغيير في البرمجيات يطرح سؤالين. يجيب اختبار التأكيد (Confirmation Testing)، ويُسمّى أيضاً إعادة الاختبار (Re-testing)، عن الأول: هل أُصلح العيب المُبلَّغ عنه فعلاً؟ فتعيد الاختبار الذي فشل على البناء الذي يتضمن الإصلاح. ويجيب اختبار الانحدار (Regression Testing) عن الثاني: هل كسر الإصلاح، أو أي تغيير آخر، شيئاً كان يعمل؟ فتعيد تشغيل اختبارات نجحت من قبل في أجزاء لم يكن يُفترض أن تتغير.
مثال ذلك: يصلح مطوّر نموذج الدفع الذي كان يرفض أرقام الجوال المكتوبة بالصيغة +966 50 000 1234. يُدخل اختبار التأكيد الرقم نفسه مجدداً ويُتمّ الطلب، أما اختبارات الانحدار فتفحص التسجيل وتعديل الملف الشخصي وشاشة رمز التحقق لمرة واحدة (OTP)، لأنها تستخدم شيفرة فحص الرقم نفسها.
لماذا يهم
الانحدار (Regression) تراجعٌ في الجودة يسببه تغيير: ميزة كانت تعمل أمس تفشل اليوم. فالمنتجات تتشارك الشيفرة والبيانات والخدمات، لذا قد يكسر إصلاحٌ من سطر واحد شاشةً لم يلمسها أحد، ويصل عيب كهذا إلى بيئة الإنتاج بسهولة حين لا يفحص الفريق إلا العيب المُبلَّغ عنه.
ويقدّم النشاطان دليلين مختلفين. فإغلاق العيب دون اختبار تأكيد يعلن إصلاحاً قد لا يكون موجوداً، وتأكيد الإصلاح دون اختبار انحدار يوحي بإصدار آمن مع أن أحداً لم يتحقق. واختيار نطاق انحدار يناسب الوقت المتاح، وتحديد ما يُؤتمت منه، قرارٌ ستتخذه بعد كل إصلاح تقريباً.
اختبار التأكيد: هل أُصلح العيب فعلاً؟
يصف منهج ISTQB للمستوى التأسيسي اختبار التأكيد بأنه تأكيد أن العيب الأصلي قد أُصلح بنجاح. وبحسب المخاطر، تشغّل كل حالات الاختبار التي فشلت بسبب العيب وتضيف اختبارات جديدة تغطي التغييرات التي تطلّبها الإصلاح؛ وحين يضيق الوقت أو المال، تعيد على الأقل الخطوات التي أعادت إنتاج الإخفاق وتتحقق من أنه لم يعد يحدث.
ابدأ بالخطوات والبيانات والبيئة الأصلية، حتى يعني النجاح فعلاً أن الإصلاح يعمل. ثم غيّر عاملاً واحداً في كل مرة، كصيغة إدخال أخرى أو دور آخر أو القيمة الحدّية المجاورة، لأن الإصلاح كثيراً ما يغطي الحالة المُبلَّغ عنها وحدها. والحالات الحدّية (Edge Cases) من الدرس السابق مصدر جيد لهذه التنويعات.
- تحقّق من البناء أولاً: يجب أن يُذكر عند حلّ العيب البناءُ الذي يتضمن الإصلاح.
- عند النجاح: سجّل البناء والبيانات والنتيجة، ثم شغّل اختبارات الانحدار قبل إغلاق العيب.
- عند الفشل: أعد فتح العيب نفسه مع الدليل الجديد بدلاً من فتح عيب ثانٍ.
اختبار الانحدار: هل كسر التغيير شيئاً آخر؟
يعيد اختبار الانحدار تشغيل اختبارات نجحت من قبل، لاكتشاف عيوب أدخلها التغيير أو كشفها في أجزاء لم يُقصد تغييرها. وكلمة «كشفها» مهمة: فقد يُظهر الإصلاح عيباً أقدم كان العيب الأول يخفيه، مثل فحص ثانٍ لم يُنفَّذ قط لأن الفحص الأول كان يرفض المُدخل دائماً.
ويشير المنهج إلى أن الآثار قد تظهر في المكوّن الذي تغيّر أو في مكوّنات أخرى أو في أنظمة متصلة، وأن اختبار الانحدار لا يقتصر على موضوع الاختبار (Test Object) نفسه، بل قد يشمل البيئة أيضاً. والإصلاح الذي اجتاز اختبار التأكيد يحتاج مع ذلك إلى اختبار انحدار، لأن الإصلاح نفسه تغيير، وكلا النوعين مطلوب في كل مستوى اختبار يُصلَح فيه عيب أو يُجرى فيه تغيير. ومن المحفزات المعتادة:
- إصلاح العيوب والميزات الجديدة وإعادة الهيكلة (Refactoring)، أي إعادة ترتيب الشيفرة دون تغيير ما تفعله.
- ترقية المكتبات أو أُطر العمل أو قاعدة البيانات أو نظام التشغيل.
- تغييرات الإعدادات وأعلام الميزات (Feature Flags) التي تشغّل ميزة أو توقفها، وترحيل قواعد البيانات وتغييرات الأنظمة المتصلة.
تحليل الأثر: اختيار ما تعيد تشغيله
تشغيل كل الاختبارات بعد كل تغيير هو الخيار الأكثر أماناً، وهو الصحيح حين تكون الحزمة صغيرة. وينصح المنهج بإجراء تحليل الأثر (Impact Analysis) أولاً لتحديد مدى اختبار الانحدار، فهو يبيّن أجزاء البرمجية التي قد يؤثر فيها التغيير. وتزداد أهميته حين لا تعود الحزمة الكاملة تتسع للوقت المتاح. اقرأ التغيير واسأل المطور بدلاً من الاختيار من الذاكرة.
تمنحك إجابات الأسئلة الآتية نطاقاً من ثلاث حلقات: المنطقة التي تغيّرت، وما يعتمد عليها مباشرةً، ونواة صغيرة من رحلات المستخدم الحرجة تُشغَّل بعد كل تغيير. وسجّل ما تستبعده وسببه؛ فالتشغيل الكامل المجدول يلتقط ما فات الاختيار.
- ما الذي تغيّر بالضبط: الشيفرة أم بنية البيانات أم الإعدادات أم إحدى الاعتماديات؟ يخبرك بذلك طلب الدمج (Pull Request)، أي التغيير الذي يقدّمه المطور للمراجعة، وقائمة الفروق (Diff) بالأسطر التي تغيّرت.
- من يستخدمه أيضاً: الشاشات أو الواجهات البرمجية أو التقارير أو المهام أو الخدمات التي تستدعي الدالة نفسها أو تقرأ الجدول نفسه. ومصفوفة التتبع (Traceability Matrix) تبيّن الاختبارات التي تغطي متطلباً تغيّر.
- ما البيانات المخزنة التي يمسّها: السجلات المحفوظة قبل التغيير يجب أن تبقى صالحة للعمل بعده.
- ما المناطق عالية المخاطر في كل الأحوال: الدفع وتسجيل الدخول وتصدير البيانات، والمناطق التي تعطلت بعد تغييرات مشابهة.
- 1تسليم الإصلاحيذكر العيب البناء الذي يتضمن الإصلاح
- 2اختبار التأكيدويُسمّى إعادة الاختبارالخطوات والبيانات الأصلية أولاً، ثم تنويعات قريبة
فرع: ما زال يفشل: أعد فتح العيب مع الدليل الجديدفشل
بوابة: لم يعد الإخفاق المُبلَّغ عنه يحدث
- 3تحليل الأثرما الذي تغيّر، ومن يستخدمه، وما البيانات المخزنة التي يمسّها، وما المناطق عالية المخاطر
- 4اختبارات الانحدار المختارةالمنطقة المتغيرة، وما يعتمد عليها مباشرةً، والنواة التي تُشغَّل دائماً
فرع: إخفاق جديد في مكان آخر: أبلغ عن عيب جديد مرتبط بالإصلاحفشل
بوابة: لا إخفاقات جديدة
- 5الإغلاق والاحتفاظ بالاختبارأغلق العيب، وأضف اختبار التأكيد إلى حزمة الانحدار المؤتمتة
- التشغيل الكامل المجدول للانحدارليلياً أو قبل الإصدار: يلتقط ما تركه الاختيار
نوعان من الإخفاق وإجراءان مختلفان: فشل اختبار التأكيد يعيد فتح العيب نفسه، والإخفاق الجديد الذي يكشفه اختبار الانحدار يصبح عيباً جديداً مرتبطاً بالإصلاح.
جرّبها: مولّد سيناريوهات الانحدار جرّبها: المتطلبات ← حالات اختبار جرّبها: مولّد الاختبار المبني على المخاطر
مثال تطبيقي: إصلاح في شيفرة فحص مشتركة
العيب BUG-2143: في صفحة الدفع تُرفض أرقام الجوال بالصيغة الدولية، مثل +966 50 000 1234، برسالة «رقم الجوال غير صالح». يصلح البناء 3.4.2 الدالة المشتركة normalizePhone(). وسؤال «من يستخدمها أيضاً؟» يبيّن أن التسجيل وتعديل الملف الشخصي وخدمة إرسال رموز OTP بالرسائل النصية تستدعيها كذلك.
نجح اختبار التأكيد: قُبل الرقم المُبلَّغ عنه وتنويعاته وحُفظت بصيغة واحدة، وما زال الرقم القصير جداً مرفوضاً. ثم كشف اختبار الانحدار إخفاقاً جديداً: العملاء المحفوظة أرقامهم قبل الإصلاح لم تعد تصلهم رموز OTP، لأن خدمة الرسائل صارت تبحث عن الأرقام بالصيغة الجديدة. وهذا عيب جديد سببه الإصلاح، لذا يُبلَّغ عنه منفصلاً ويُربط بالعيب BUG-2143 بدلاً من إعادة فتح العيب الأصلي.
- سؤال البيانات المخزنة في تحليل الأثر هو الذي كشفه: الأرقام الجديدة عملت، ولم يفشل إلا ما حُفظ قبل التغيير.
- مقارنة استجابة واجهة API للملف الشخصي لعميل قديم على البناءين القديم والجديد تُظهر تغيّر الصيغة بنظرة واحدة.
- تسجّل الملاحظة أدناه الخطة، بما فيها ما استُبعد عمداً.
BUG-2143 | build 3.4.2 | changed: normalizePhone() in shared validation
1. CONFIRMATION (original steps, data and environment first)
[ ] checkout with +966 50 000 1234 -> accepted, order placed
[ ] 0500001234, 966500001234, with spaces -> accepted, saved as +966500001234
[ ] +966 50 000 12 (too short) -> still rejected
2. REGRESSION (selected by impact analysis)
changed area phone field at checkout: all existing test cases
dependents sign-up, profile edit, OTP by SMS: same stored format
stored data customers saved before 3.4.2 still receive their OTP
core log in, search, card payment (critical journeys)
left out wishlist and reviews: they do not use phone numbers
safety net full regression suite in the scheduled nightly runلماذا تُؤتمت اختبارات الانحدار أولاً
تُشغَّل اختبارات الانحدار مرة بعد مرة، وتكبر حزمتها مع كل إصدار، لذلك يعدّ المنهج اختبار الانحدار مرشحاً قوياً للأتمتة وينصح بالبدء فيها مبكراً. ومع التكامل المستمر (Continuous Integration) تُشغَّل مع كل تغيير، وغالباً على عدة مستويات: اختبارات المكوّنات للمنطق، واختبارات API للخدمات، وعدد قليل من الرحلات الشاملة (End-to-End).
كثيراً ما يُنفَّذ اختبار التأكيد مرة واحدة يدوياً. فاحتفظ به بتحويله إلى اختبار انحدار مؤتمت على أدنى مستوى يستطيع التعبير عنه، وهنا: اختبار مكوّن للدالة normalizePhone() بالرقم المُبلَّغ عنه وتنويعاته، حتى لا يعود العيب دون أن يلاحظه أحد.
- مرشحون جيدون: الميزات المستقرة، والنتائج المتوقعة الحتمية، ورحلات المستخدم الحرجة، والقواعد التي تُفحص بقيم بيانات كثيرة.
- مرشحون ضعفاء: الميزات التي ما زالت تتغير في كل سبرنت، والفحوص التي تُجرى مرة واحدة، والأحكام على التخطيط أو سهولة الاستخدام.
- الأتمتة تشغّل الاختبارات لكنها لا تختارها، والحزمة تحتاج إلى صيانة كأي شيفرة أخرى.
أخطاء شائعة
- إغلاق العيب بناءً على كلام المطور، دون اختبار تأكيد على البناء الذي يتضمن الإصلاح.
- إعادة اختبار القيمة المُبلَّغ عنها وحدها وتفويت التنويعات التي لا يعالجها الإصلاح.
- اعتبار نجاح اختبار التأكيد دليلاً على أن الإصدار آمن، ثم تخطّي اختبار الانحدار.
- اختيار اختبارات الانحدار من الذاكرة بدلاً من التغيير وما يعتمد عليه وبياناته.
- إعادة فتح العيب الأصلي بسبب إخفاق مختلف ظهر أثناء اختبار الانحدار، فيختلط تاريخان في سجل واحد.
- ترك حزمة الانحدار تكبر فقط، فتُبطئ الاختبارات المتقادمة والمكررة والمتخطّاة كل تشغيل.
من منظور ضمان الجودة
في الفريق، يبدأ هذا العمل حين تتحوّل حالة العيب إلى «محلول» (Resolved). اسأل المطور: أي بناء يتضمن الإصلاح، وما الذي تغيّر بالضبط، وما الذي يستخدم الشيفرة المتغيرة أيضاً، وسجّل الإجابات والنطاق الذي اخترته في سجل العيب أو في تشغيل الاختبار (Test Run)، حتى يمكن مراجعة القرار لاحقاً.
وأبلغ عن النتيجتين منفصلتين، مثلاً: «تأكّد إصلاح BUG-2143 على البناء 3.4.2. الانحدار: نجح 45 من 46 اختباراً مختاراً، وفشل واحد بعيب جديد (BUG-2150)، ولم تُشغَّل اختبارات قائمة الرغبات والمراجعات، وتُشغَّل الحزمة الكاملة الليلة». فقرارات الإصدار تُبنى على جملة كهذه، لذا يجب أن تقول ما اختُبر وما لم يُختبر.
تمرين عملي
خطّط إعادة الاختبار ونطاق الانحدار لإصلاح في رسوم الشحن
العيب BUG-3310: «الطلبات بقيمة 200.00 ريال فأكثر تُشحن مجاناً، لكن الفحص يتجاهل القسائم: سلة بقيمة 210.00 ريال مع قسيمة 20.00 ريال ما زالت تُشحن مجاناً». يصلح البناء 5.2.0 الدالة calculateShipping() في خدمة التسعير، وتستخدمها أيضاً صفحة السلة وملخص الدفع ومعاينة الطلب في تطبيق الجوال وتصدير الفواتير الليلي.
اكتب اختبارات التأكيد ونطاق الانحدار في حلقات، واذكر ما تستبعده، واختر اختباراً واحداً لأتمتته.
- اكتب اختبار التأكيد ببيانات العيب الأصلية.
- أضف تنويعات على جانبي الحد 200.00 بعد الخصم؛ فالأسعار تتدرج بخطوة 0.01، كما في القيم الحدّية في الدرس السابق.
- أجب عن أسئلة تحليل الأثر واكتب حلقات الانحدار، بما فيها ما تستبعده.
- اختر اختباراً واحداً لأتمتته وحدّد مستواه.
إظهار الإجابة النموذجية
التأكيد: 210.00 ناقص قسيمة 20.00 يساوي 190.00، فتُحتسب رسوم الشحن. التنويعات: 199.99 بعد الخصم ← تُحتسب الرسوم؛ 200.00 تماماً (220.00 ناقص 20.00) ← مجاني؛ 250.00 مع قسيمة 25% (187.50) ← تُحتسب الرسوم؛ 210.00 دون قسيمة ← ما زال مجانياً.
تحليل الأثر: تغيّر فحص الشحن في الدالة calculateShipping()، وتستخدمها صفحة السلة وملخص الدفع ومعاينة الطلب في الجوال وتصدير الفواتير؛ والبيانات المخزنة هي الطلبات المُنشأة قبل البناء 5.2.0؛ ومبالغ الدفع عالية المخاطر.
الحلقات: المنطقة المتغيرة: كل حالات اختبار الشحن والقسائم؛ ما يعتمد عليها: السلة وملخص الدفع ومعاينة الجوال تعرض الرسوم نفسها التي تعيدها واجهة API للتسعير، وتصدير الفواتير صحيح للطلبات المُنشأة قبل البناء 5.2.0 وبعده؛ النواة: تسجيل الدخول والإضافة إلى السلة والدفع بالبطاقة. المستبعد: الملف الشخصي والبحث والمراجعات، لأنها لا تستدعي calculateShipping(). شبكة الأمان: التشغيل الكامل المجدول.
الأتمتة: اختبار مكوّن أو اختبار API يعتمد على البيانات (Data-driven) للدالة calculateShipping()، أي اختبار واحد يُشغَّل مرة لكل صف من القيم، بالقيم 199.99 و200.00 والحالة الأصلية، ويُضاف إلى حزمة الانحدار في خط الأنابيب (Pipeline).
أسئلة شائعة
هل إعادة الاختبار هي نفسها اختبار الانحدار؟
لا. إعادة الاختبار، التي يسميها ISTQB اختبار التأكيد، تتحقق من إصلاح عيب محدد بإعادة الاختبارات التي فشلت. أما اختبار الانحدار فيتحقق من أن الإصلاح، أو أي تغيير آخر، لم يكسر أجزاء أخرى كانت تعمل. وبعد الإصلاح تحتاج عادةً إلى الاثنين.
هل أحتاج إلى اختبار انحدار إذا تغيّر سطر واحد فقط من الشيفرة؟
نعم، لكن حجمه يجب أن يناسب الأثر. فسطر واحد في دالة مشتركة قد يؤثر في كل من يستدعيها، بينما تغيير نص واحد في شاشة واحدة قد لا يحتاج إلى أكثر من اختبار التأكيد والنواة التي تُشغَّل دائماً. وتحليل الأثر يخبرك أي الحالتين أمامك.
هل يجب أتمتة اختبارات التأكيد؟
كثيراً ما يُجرى التأكيد الأول يدوياً، لأنه يتبع تقرير العيب ويحتاج إلى حكم بشري. وبعد ذلك، فإن إضافته إلى حزمة الانحدار المؤتمتة، على أدنى مستوى يستطيع التعبير عنه، تحمي من عودة العيب نفسه.
من يقرر نطاق الانحدار؟
عادةً يقترحه المختبِر من تحليل الأثر وقائمة المخاطر، ويؤكد المطور ما يمسّه التغيير، ويتفق عليه قائد الاختبار أو الفريق حين يكون الوقت محدوداً. وأياً كان القرار، سجّله حتى يمكن مراجعته.
المراجع
- ISTQB Certified Tester Foundation Level (CTFL) v4.0المنهج التأسيسي لاختبار البرمجيات: مستويات الاختبار وأنواعه وتقنيات تصميم الاختبارات وإدارة الاختبار والأدوات.
- ISTQB Glossaryالتعريفات القياسية لمصطلحات الاختبار — حالة الاختبار واختبار الانحدار والخطورة والأولوية وتحليل القيم الحدّية وغيرها.
- ISO/IEC/IEEE 29119-1:2022 — Software and systems engineering — Software testing — Part 1: General conceptsالمعيار الدولي لاختبار البرمجيات: المفاهيم والعمليات والتوثيق والتقنيات.
تدرّب بأدوات متقن
ولّد سيناريوهات اختبار الانحدار من وصف التغيير وقائمة الوحدات المتأثرة والمرتبطة.
حوّل قائمة متطلبات مرقّمة إلى حالات اختبار قابلة للتتبّع مع مصفوفة تربط المتطلبات بالاختبارات.
قيّم الميزات حسب الاحتمالية والأثر، ثم ولّد خطة اختبار مبنية على المخاطر ومرتّبة حسب الأولوية.
قارن استجابتي API (مثل بيئة التجريب مقابل الإنتاج) واحصل على قائمة بكل فرق بنيوي أو في القيم.
للتعمّق أكثر
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.