تخمين الأخطاء
تخمين الأخطاء (Error Guessing) تقنية اختبار مبنية على الخبرة: تتوقّع الأخطاء التي يُرجَّح أن يقع فيها الناس أثناء بناء ميزة ما، والعيوب التي تتركها تلك الأخطاء، والإخفاقات التي تسببها، ثم تصمّم اختبارات موجّهة إليها مباشرةً. ويذكرها منهج ISTQB للمستوى التأسيسي (CTFL v4.0) إلى جانب الاختبار الاستكشافي والاختبار المبني على قوائم التحقق.
مثال: لا يذكر أي متطلب النقر المزدوج على زر «تأكيد الطلب»، لكن نماذج كثيرة ترسل الطلب نفسه مرتين حين يُضغط الزر بسرعة. فتنقر عليه نقراً مزدوجاً. فإذا ظهر طلبان، فقد كشف التخمين عيباً لم يُشِر إليه أي قسم تكافؤ ولا جدول قرار.
لماذا يهم
تختبر التقنيات المبنية على المواصفات ما يقوله المتطلب، لكن كثيراً من العيوب المكلفة يقع فيما لا يقوله: إرسال مزدوج، وجلسة تنتهي أثناء الدفع، وقائمة فارغة لمستخدم جديد. والتقنيات المبنية على الخبرة تكمّل تقنيات الصندوق الأسود والصندوق الأبيض، لأنها قد تكشف عيوباً تفوت تلك التقنيات.
وبالنسبة إلى المختبِر، يستثمر تخمين الأخطاء تاريخ عيوب الفريق. لكنه إن مورس عشوائياً اعتمد على ذاكرة شخص واحد ولم يستطع أحد أن يقول ما الذي غُطّي؛ وهذا الدرس يجعله قابلاً للتكرار.
ماذا تخمّن: الأخطاء والعيوب والإخفاقات
فكّر على امتداد السلسلة التي تعلمتها في درس الخطأ والعيب والإخفاق: ينسى المطور أن العميل قد لا يملك أي طلب (خطأ)، فلا يكون في الشيفرة فرع للقائمة الفارغة (عيب)، فتنهار صفحة سجل الطلبات لعميل جديد (إخفاق). والاختبار رخيص: افتح سجل الطلبات بحساب عميل جديد تماماً.
أساس الاختبار هنا معرفة المختبِر لا مواصفة مكتوبة، ولذلك يصعب قياس التغطية. وبعض الفرق تطلق «تخمين الأخطاء» على أي نقر غير مخطط له؛ أما هنا فيعني اختبارات مشتقة من توقّع صريح لما يُرجَّح أن يخفق. ويذكر المنهج ثلاثة مصادر لهذه المعرفة:
- كيف عمل التطبيق في الماضي: تاريخ عيوبه ووحداته الهشّة.
- الأخطاء التي يميل المطورون إلى ارتكابها:
>بدلاً من>=، وغياب فحص القيمةnull، وإصلاح طُبّق على نسخة من الشيفرة دون أخرى. - الإخفاقات في التطبيقات المشابهة: نماذج التسجيل وصفحات الدفع واستيراد الملفات تخفق بطرق مألوفة.
قائمة بالأخطاء الشائعة
يجمع المنهج الأخطاء والعيوب والإخفاقات في ستة مجالات. استخدمها عناوين لقائمتك؛ يذكر كل بند أمثلة المنهج، ثم أفكاراً للتجربة.
- المدخلات: مدخل صحيح لا يُقبل، ووسائط (Parameters) خاطئة أو ناقصة. جرّب
O'Brien، ومسافات في البداية، أو طلب API ينقصه حقل يرسله التطبيق دائماً. - المخرجات: صيغة خاطئة أو نتيجة خاطئة. جرّب مبالغ تحتاج إلى تقريب، ونصاً عربياً في ملف PDF، وشاشات قد تعرض
null. - المنطق: حالات مفقودة أو عامل (Operator) خاطئ. جرّب الحالة التي لم يذكرها أحد، كطلب عليه خصم واسترداد جزئي معاً.
- الحساب: مُعامَل خاطئ (Operand) أو عملية حسابية خاطئة. جرّب الضريبة على سعر بعد الخصم، والقسمة على عدد قد يكون صفراً.
- الواجهات: وسائط غير متطابقة أو أنواع غير متوافقة. جرّب رقماً يُرسل نصاً، وتاريخاً ينتقل بين نظامين بصيغة أخرى.
- البيانات: تهيئة غير صحيحة أو نوع خاطئ. جرّب مستخدماً جديداً بلا أي سجل سابق، وقيمة أكبر من سعة عمودها.
جرّبها: مولّد الاختبارات السلبية جرّبها: مولّد مجموعات الأحرف الخاصة
هجمات الأعطال: التخمين انطلاقاً من قائمة
هجوم الأعطال (Fault Attack) هو الطريقة المنهجية لتطبيق تخمين الأخطاء: تُنشئ قائمة بالأخطاء والعيوب والإخفاقات المحتملة أو تحصل عليها، ثم تصمّم اختبارات تكشف تلك العيوب أو تُحدث تلك الإخفاقات. ويصف مسرد ISTQB الهجوم بأنه محاولة موجّهة ومركّزة لإجبار إخفاقات محددة على الحدوث. وهو ليس هجوماً أمنياً: توجّهه إلى منتجك أنت، في بيئة الاختبار.
كل بند، مستمدّ من الخبرة أو من بيانات العيوب أو من المعرفة الشائعة بأسباب إخفاق البرمجيات، فرضية عن موضع ضعف في المنتج. والهجوم يحوّلها إلى اختبار ببيانات محددة ونتيجة متوقعة:
ID FL-07
Area المنطق (حالة مفقودة)
Hypothesis إرسال النموذج مرتين يُنشئ سجلين
Evidence وُجد مرتين في سجل العيوب لدينا: DEF-112 وDEF-240
Attack نقر مزدوج على «ادفع»؛ Enter مرتين؛ رجوع ثم إعادة إرسال
Expected طلب واحد ودفعة واحدة؛ ويُتجاهَل الإرسال الثاني
Applies to كل نموذج يُنشئ شيئاً أو يدفع ثمنه أو يرسلهمثال تطبيقي: استيراد الموظفين من ملف CSV
المتطلب: «يستطيع مسؤولو الموارد البشرية استيراد الموظفين من ملف CSV يضم الأعمدة employee_id وfull_name وemail وhire_date (بصيغة DD/MM/YYYY). تُستورد الصفوف الصالحة، وتُدرج الصفوف غير الصالحة في تقرير أخطاء مع رقم كل صف. ويعرض ملخص عدد الصفوف المستوردة وعدد المرفوضة».
الاختبارات المبنية على المواصفة موجودة بالفعل. والآن اكتب هجوماً لكل مجال، مع النتيجة المتوقعة، أو سؤالاً حين يسكت المتطلب.
| مجال الخطأ | الخطأ المرجّح | الهجوم على الاستيراد | النتيجة المتوقعة |
|---|---|---|---|
| المدخلاتمدخل صحيح لا يُقبل؛ وسائط خاطئة أو ناقصة | المحلّل لا يتوقع BOM ولا فاصلة بين علامتي تنصيص | BOM قبل employee_id؛ و"Al-Harbi, Sara" | يُتعرَّف على صف العنوان؛ ويُخزَّن الاسم كاملاً |
| المخرجاتصيغة خاطئة، نتيجة خاطئة | ترقيم الصفوف دون احتساب صف العنوان | ملف فيه صفوف مرفوضة | أرقام الصفوف تطابق الملف؛ والعنوان هو الصف 1 |
| المنطقحالات مفقودة، عامل خاطئ | لم يُحسب حساب المعرّفات المكررة | employee_id نفسه مرتين؛ ومعرّف موجود مسبقاً | المتطلب ساكت: رفض أم تحديث أم تخطٍّ؟ |
| الحسابمُعامَل خاطئ، عملية خاطئة | صف العنوان محسوب في المجاميع | 100 صف بيانات، 3 منها غير صالحة | 97 مستورداً، و3 مرفوضة |
| الواجهاتوسائط غير متطابقة، أنواع غير متوافقة | التاريخ يُقرأ بالشهر أولاً في مكان ما بين الشاشة وقاعدة البيانات | تاريخ التعيين 03/04/2026 | 3 أبريل 2026 في استجابة API وفي قاعدة البيانات |
| البياناتتهيئة غير صحيحة، نوع خاطئ | الملف الفارغ أو السطر الفارغ الأخير غير مُعالَج | ملف فيه العنوان فقط؛ وملف ينتهي بسطر فارغ | 0 مستورد دون انهيار؛ ولا يُبلَّغ عن السطر الفارغ |
- المتطلب ساكت: سؤال لمالك المنتج لا نتيجة متوقعة
- المدخلات: علامة ترتيب البايتات (BOM) قبل
employee_id، كما تحفظها بعض برامج الجداول، والاسم بين علامتي تنصيص"Al-Harbi, Sara"← يُتعرَّف على صف العنوان ويُخزَّن الاسم كاملاً. - المخرجات: صفوف مرفوضة ← أرقام الصفوف في تقرير الأخطاء تطابق الملف، حيث العنوان هو الصف 1.
- المنطق:
employee_idنفسه مرتين، أو معرّف موجود مسبقاً ← المتطلب ساكت: رفض أم تحديث أم تخطٍّ؟ اسأل مالك المنتج. - الحساب: 100 صف بيانات، 3 منها غير صالحة ← 97 مستورداً و3 مرفوضة، ولا يُحسب صف العنوان.
- الواجهات: تاريخ التعيين
03/04/2026← 3 أبريل 2026 لا 4 مارس، في استجابة API وقاعدة البيانات، لا على الشاشة فقط. - البيانات: ملف فيه صف العنوان فقط ← «0 مستورد» دون انهيار؛ وملف ينتهي بسطر فارغ ← لا يُبلَّغ عن السطر الفارغ على أنه صف غير صالح.
جرّبها: مولّد مجموعات بيانات CSV جرّبها: مولّد مجموعات بيانات Unicode
كيف تجعل تخمين الأخطاء منهجياً
يصبح تخمين الأخطاء طريقة للفريق لا موهبة لشخص واحد حين تُكتب القائمة وتُغذّى بالأدلة وتُصان:
- اجمع الأدلة: الأسباب الجذرية للعيوب من الاختبار والإنتاج، وتذاكر الدعم، ومخاوف المطورين بشأن التغيير.
- احتفظ بقائمة أعطال واحدة مشتركة، مقسّمة على المجالات الستة؛ ولكل بند فرضية ودليل وهجوم نموذجي.
- اختر البنود التي تناسب التغيير، الأرجح حدوثاً والأشد ضرراً أولاً؛ ودوّن ما تتخطاه.
- هاجم ضمن وقت محدد؛ وسجّل البند والبيانات والنتيجة، ليمكن الإبلاغ عن الهجوم وتكراره.
- حدّث القائمة: أضف الأنماط الجديدة، واحذف البنود التي لا تجد شيئاً أبداً، وحوّل الهجمات التي تظل تكشف عيوباً إلى اختبارات انحدار أو بنود في قوائم التحقق (موضوع الدرس التالي).
- 1اجمع الأدلةالأسباب الجذرية من الاختبار والإنتاج، وتذاكر الدعم، ومخاوف المطورين
- 2احتفظ بقائمة الأعطالمقسّمة على المجالات الستة؛ وكل بند فرضية مع دليلها
- 3اختر ما يناسب التغييرالأرجح والأشد ضرراً أولاً؛ ودوّن ما تتخطاه
- 4هاجمبيانات محددة ونتيجة متوقعة، ضمن وقت محدد
- 5سجّلالبند والبيانات والنتيجة وأي عيب اكتُشف
- 6حدّث القائمةأضف الأنماط الجديدة، واحذف البنود التي لا تجد شيئاً، وحوّل الهجمات المثمرة إلى اختبارات انحدار أو قوائم تحقق
عودة إلى الخطوة 2 القائمة المحدَّثة تخدم التغيير التالي
طريقة عملية لتطبيق التقنية؛ ولا يفرض منهج ISTQB هذه الخطوات.
أخطاء شائعة
- التخمين دون كتابة أي شيء، فلا يمكن الإبلاغ عنه ولا تكراره بعد الإصلاح ولا التعلّم منه.
- استخدام تخمين الأخطاء بدلاً من التقنيات المبنية على المواصفات؛ فهو يكمّلها ولا يحلّ محلها.
- نسخ قائمة عامة وعدم تكييفها أبداً مع تاريخ عيوب المنتج نفسه.
- التوقف عند «قد يتعطل هذا» دون بيانات محددة ونتيجة متوقعة.
- الإبلاغ بعبارة «اختُبر بتخمين الأخطاء» كأنها تغطية مقيسة، بدلاً من ذكر البنود التي هوجمت.
من منظور ضمان الجودة
في الفريق، يجري تخمين الأخطاء في ثلاث لحظات. في جلسات التحسين (Refinement) تتحول بنود القائمة إلى أسئلة: «ماذا لو استُورد الملف نفسه مرتين؟». وفي تصميم الاختبار تضيف هجمات موجّهة إلى جانب الحالات المبنية على المواصفة، وتربط كلاً منها ببند القائمة. وبعد الإصدار تعود العيوب التي تسرّبت إلى الإنتاج إلى القائمة.
اسأل المطورين عن الجزء الذي هم أقل ثقة به في التغيير. وفي تقرير الخطأ اذكر الهجوم ودليله، كي يغطي الإصلاح النمط كله، مثل كل نموذج يُرسَل مرتين. وفي ملخص الاختبار اذكر البنود التي هوجمت والتي تُخطّيت، ليرى مالك المنتج المخاطر المتبقية.
تمرين عملي
ابنِ قائمة أعطال لرفع صورة الملف الشخصي
يقول تطبيق اجتماعي: «يستطيع المستخدمون رفع صورة للملف الشخصي (JPG أو PNG، حتى 5 ميغابايت). تُقصّ الصورة إلى مربع وتُعرض في رأس الصفحة وبجانب تعليقات المستخدم».
اكتب بنداً واحداً في قائمة الأعطال لكل مجال: الخطأ المرجّح، وهجوماً محدداً، والنتيجة المتوقعة أو سؤالاً. ثم اختر ثلاثة هجمات تنفذها أولاً وبيّن السبب. ولا تهاجم إلا بيئة اختبار مسموحاً لك باستخدامها.
- دوّن ما لا يقوله المتطلب.
- اكتب فرضية واحدة لكل مجال.
- حوّل كل فرضية إلى هجوم ببيانات محددة.
- رتّب الهجمات بحسب الاحتمال والضرر.
إظهار الإجابة النموذجية
ما لا يذكره المتطلب: حدّ أدنى لأبعاد الصورة، وما يراه المستخدم أثناء معالجة الصورة أو عند إخفاق الرفع، وكيف تُعرض صور الهاتف التي تحمل بيانات الدوران. وحيث لا ترد النتيجة المتوقعة أدناه في المتطلب، فأكّدها مع مالك المنتج.
المدخلات. الخطأ المرجّح: يُحكم على نوع الملف من امتداده، بمقارنة تميّز بين الأحرف الكبيرة والصغيرة. الهجوم: photo.PNG، وملف PDF أُعيدت تسميته إلى photo.jpg ← يُقبل الأول ويُرفض الثاني، لأن المحتوى هو ما يُفحص لا الامتداد.
المخرجات. الخطأ المرجّح: تجاهل اتجاه الدوران المخزّن في البيانات الوصفية لصورة الهاتف. الهجوم: ارفع صورة كهذه ← تظهر معتدلة لا مائلة على جانبها.
المنطق. الخطأ المرجّح: عمليات الرفع المتداخلة غير مرتّبة. الهجوم: ارفع صورة جديدة بينما السابقة لا تزال قيد المعالجة ← تفوز الصورة الأحدث حتى لو انتهت معالجة الأقدم بعدها، ولا صورة مكسورة أبداً.
الحساب. الخطأ المرجّح: القصّ يفترض صورة شبه مربعة. الهجوم: صورة بانورامية 4000 × 300 بكسل وصورة 1 × 1 بكسل ← قصّ مربع في المنتصف دون تمطيط؛ واسأل عن حدّ أدنى للأبعاد.
الواجهات. الخطأ المرجّح: لا يُعالَج خطأ خدمة التخزين أو تجاوزها المهلة. الهجوم: حاكِ إخفاق خدمة التخزين أو تجاوزها المهلة في بيئة الاختبار ← رسالة واضحة، وتبقى الصورة القديمة.
البيانات. الخطأ المرجّح: لا قيمة افتراضية لمن لا صورة له، أو نسخة قديمة مخزنة مؤقتاً. الهجوم: مستخدم بلا صورة، وصورة استُبدلت بعد التعليق ← صورة بديلة افتراضية؛ والصورة الجديدة على التعليقات القديمة، لا نسخة مخزنة مؤقتاً.
ابدأ بـ: فحص المحتوى (خطر أمني أيضاً)، وإخفاق خدمة التخزين (مستخدمون بلا صورة)، والدوران (كثير من صور الملفات الشخصية تأتي من الهواتف). ولا بأس بترتيب آخر يبرّره الاحتمال والأثر.
أسئلة شائعة
هل تخمين الأخطاء هو الاختبار الاستكشافي نفسه؟
لا، وإن كانا يُستخدمان معاً كثيراً. يصمّم تخمين الأخطاء الاختبارات انطلاقاً من توقّع للأخطاء والعيوب والإخفاقات المرجّحة. أما الاختبار الاستكشافي فيصمّم الاختبارات وينفذها ويقيّمها في الوقت نفسه بينما تتعرّف على المنتج، وكثيراً ما يستخدم المستكشف تخمين الأخطاء ليختار ما يجربه بعد ذلك. وكلاهما من التقنيات المبنية على الخبرة في منهج ISTQB.
هل يستطيع المبتدئ تخمين الأخطاء دون خبرة طويلة؟
نعم، باستعارة الخبرة. ابدأ بالمجالات الستة في هذا الدرس، واقرأ تاريخ عيوب فريقك وتقارير العيوب لميزات مشابهة، واسأل المطورين عمّا يقلقهم. وتكبر قائمتك مع كل عيب تكتشفه.
ما الفرق بين قائمة الأعطال وقائمة التحقق؟
بينهما تداخل. قائمة الأعطال منظّمة حول الإخفاقات المرجّحة وتُستخدم لتصميم الهجمات. أما قائمة التحقق (Checklist) فهي قائمة بشروط اختبار يجب تغطيتها، وقد تستند إلى الخبرة نفسها. وعملياً، كثيراً ما تتحول الهجمات التي تظل تكشف عيوباً إلى بنود في قائمة تحقق؛ والاختبار المبني على قوائم التحقق هو موضوع الدرس التالي.
كيف أُبلغ عن التغطية في تخمين الأخطاء؟
يصعب قياس تغطيته لأن القائمة لا تكتمل أبداً، فأبلغ عمّا فعلت: البنود التي هاجمتها، وبأي بيانات، وأيها كشف عيوباً، وأيها تخطيته ولماذا. فيحصل الفريق على صورة صادقة للمخاطر المتبقية.
المراجع
- ISTQB Certified Tester Foundation Level (CTFL) v4.0المنهج التأسيسي لاختبار البرمجيات: مستويات الاختبار وأنواعه وتقنيات تصميم الاختبارات وإدارة الاختبار والأدوات.
- ISTQB Glossaryالتعريفات القياسية لمصطلحات الاختبار — حالة الاختبار واختبار الانحدار والخطورة والأولوية وتحليل القيم الحدّية وغيرها.
تدرّب بأدوات متقن
ولّد حالات اختبار سلبية لحقول النماذج وواجهات API: قيم فارغة وnull ونوع خاطئ وطول زائد وحقن وصيغة غير صالحة.
ولّد حالات حدّية (edge cases) للسلاسل النصية والأرقام والتواريخ والملفات والقوائم والتزامن انطلاقاً من تعريف الحقول.
ولّد مدخلات مليئة بالأحرف الخاصة: علامات الاقتباس، والأحرف الوصفية لـ SQL/HTML/JSON، وأحرف التحكم، والرموز التعبيرية، وحيل المسارات.
ولّد سلاسل نصية اختبارية بترميز Unicode عبر الخطوط (العربية والديفاناغارية وCJK والسيريلية) والرموز التعبيرية وعلامات الدمج وصيغ التطبيع.
ولّد ملفات CSV بأعمدة وأنواع بيانات وأعداد صفوف وفواصل مخصصة.
للتعمّق أكثر
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.