الخطأ والعيب والإخفاق والسبب الجذري
الخطأ (Error)، ويسمى أيضاً (Mistake)، فعل بشري يؤدي إلى نتيجة غير صحيحة. والعيب (Defect)، ويسمى أيضاً (Fault) أو (Bug)، هو الخلل الذي يتركه الخطأ في أحد منتجات العمل (Work products)، مثل متطلب أو الشيفرة أو سكربت اختبار. والإخفاق (Failure) هو ما تلاحظه حين لا يفعل النظام أثناء تشغيله ما يجب عليه، أو يفعل ما لا ينبغي له. أما السبب الجذري (Root cause) فهو السبب الأعمق الذي أدى إلى وقوع الخطأ.
مثال: ينسخ مطور شرط التحقق من الاسم من نموذج قديم يدعم الإنجليزية فقط (خطأ)، فتصبح شيفرة التسجيل لا تقبل إلا الحروف اللاتينية (عيب). وحين تكتب عميلة اسمها بالحروف العربية يرفضه النموذج (إخفاق). ولم تكن معايير القبول وبيانات الاختبار المشتركة تضم إلا أسماء إنجليزية، فلم ينتبه أحد إلى هذه الثغرة (سبب جذري).
لماذا يهم
الكلمة الصحيحة تحدد الخطوة التالية. فالإخفاق دليل تستطيع عرضه، والعيب شيء على المطور أن يحدد موضعه، والسبب الجذري هو ما يجب على الفريق تغييره ليمنع العيب المشابه التالي. والتقرير الذي يصف الإخفاق بدقة — المدخلات والنتيجة المتوقعة والنتيجة الفعلية — يتيح للمطور أن يجد العيب الحقيقي بدلاً من مطاردة تخمينك.
وهذه الفروق تحمي حكمك أيضاً. فالاختبار الناجح لا يثبت أن الشيفرة صحيحة، لأن بعض العيوب لا يسبب إخفاقاً. والاختبار الفاشل لا يثبت أن المنتج معيب، لأن الخلل قد يكون في البيئة أو في بيانات الاختبار أو في الاختبار نفسه.
من الخطأ إلى العيب إلى الإخفاق
يصف منهج ISTQB للمستوى التأسيسي سلسلة: يرتكب الناس أخطاءً، والأخطاء تُنتج عيوباً، والعيوب قد تؤدي إلى إخفاقات. يقع الخطأ في ذهن شخص أو بين يديه، ويستقر العيب في منتج عمل حتى يزيله أحد، ويحدث الإخفاق وقت التشغيل حين يُنفَّذ الجزء المعيب في ظروف تكشفه.
والعيوب ليست في الشيفرة وحدها. فالمتطلب الذي يناقض متطلباً آخر، وسكربت الاختبار الذي يفحص الحقل الخطأ، وملف البناء الذي يحزم مكتبة قديمة، كلها عيوب أيضاً. والعيب الذي لا يُكتشف في منتج عمل مبكر كثيراً ما يُنتج عيوباً لاحقة: فالمتطلب الخاطئ يقود إلى شيفرة خاطئة وإلى اختبارات توافقها.
- الخطأ (Mistake): سوء فهم متطلب، أو كتابة
>بدلاً من>=، أو نسيان حالة. - العيب (Fault / Bug): يمكن اكتشافه بالمراجعة دون تشغيل أي شيء.
- الإخفاق: لا يمكن ملاحظته إلا أثناء تشغيل النظام.
- بعض الفرق تقول «Bug» للعيب وللإخفاق معاً، و«Error» لرسالة في السجل. في التقارير، حدّد أيّهما تقصد.
عيوب بلا إخفاقات، وإخفاقات بلا عيوب
المنهج صريح: بعض العيوب يسبب إخفاقاً في كل مرة تُنفَّذ فيها الشيفرة، وبعضها في ظروف محددة فقط، وبعضها لا يسبب إخفاقاً أبداً. ويبقى العيب كامناً (Latent) حين لا تُنفَّذ شيفرته أبداً، أو لا تُنفَّذ بالبيانات التي تكشفه. لذلك فالاختبار الناجح دليل وليس برهاناً.
والأخطاء والعيوب ليست السبب الوحيد للإخفاقات. يذكر المنهج الظروف البيئية، مثل الإشعاع أو المجالات الكهرومغناطيسية التي تؤثر في البرامج الثابتة (Firmware). أما في الاختبار اليومي فالأسباب الواقعة خارج الشيفرة التي تختبرها أبسط من ذلك: خادم اختبار متوقف، أو بيئة تجريبية لطرف ثالث تتجاوز مهلة الاستجابة، أو شهادة منتهية الصلاحية. وبعضها يعود إلى خطأ بشري في مكان آخر — فالقيمة الخاطئة في إعدادات النشر عيب في ذلك الملف — لكن المسؤول عنه وطريقة إصلاحه مختلفان.
- في ظروف محددة فقط: حساب تاريخ لا يتعطل إلا يوم 29 فبراير.
- عيب كامن: عيب تقريب في عملة لم يفعّلها المتجر بعد.
- عيب محجوب (Masked): عيب في الخطوة 3 من الدفع لا يمكن أن يظهر ما دام عيب آخر يُفشل الخطوة 2 في كل مرة. ويسمي مسرد ISTQB ذلك حجب العيوب (Defect masking).
- البيئة: إرسال نموذج يعيد
503 Service Unavailableبينما يُعاد نشر خدمة البريد الإلكتروني في بيئة الاختبار.
السبب الجذري: لماذا وقع الخطأ
السبب الجذري هو السبب الأساسي لحدوث مشكلة، وكثيراً ما يكون موقفاً أدى إلى الخطأ. ويذكر المنهج أسباباً معتادة لأخطاء البشر: ضغط الوقت، وتعقيد منتجات العمل أو العمليات أو البنية التحتية أو التفاعلات، والإرهاق، ونقص التدريب. إصلاح العيب يزيل مشكلة واحدة، أما معالجة سببه الجذري فقد تمنع عيوباً مشابهة أو تقلل تكرارها.
يبدأ تحليل السبب الجذري عادةً عند وقوع إخفاق أو اكتشاف عيب، ويواصل السؤال «لماذا؟» حتى يصل إلى شيء يستطيع الفريق تغييره. افترض أن ثلاثة عيوب في سبرنت واحد عرضت الأوقات بمنطقة زمنية خاطئة. كل إصلاح يزيل عيباً واحداً، لكن السبب الجذري — غياب قاعدة متفق عليها لتخزين الأوقات وعرضها، وغياب بيانات اختبار من مناطق زمنية مختلفة — سيظل يُنتج عيوباً جديدة حتى يغيّره الفريق.
الإيجابية الكاذبة والسلبية الكاذبة
والاختبارات قد تخطئ أيضاً. يسمي مسرد ISTQB نتيجة الاختبار التي تبلّغ عن عيب غير موجود إيجابية كاذبة (False positive)، والنتيجة التي لا تكشف عيباً موجوداً فعلاً سلبية كاذبة (False negative). و«إيجابية» هنا تعني «قال الاختبار إن هناك مشكلة». ويسميهما المسرد أيضاً نتيجة فشل كاذب (False-fail result) ونتيجة نجاح كاذب (False-pass result).
- إيجابية كاذبة: يفشل اختبار الدفع لأن بيانات الاختبار تستخدم قسيمة خصم انتهت صلاحيتها الأسبوع الماضي، والمنتج يرفضها رفضاً صحيحاً. وثمنها وقت يضيع في التحقيق.
- سلبية كاذبة: ينجح اختبار السعر لأنه يتحقق فقط من ظهور إجمالي ما، لا من صحة الإجمالي. لا يبدو شيء خاطئاً بينما يصل العيب إلى المستخدمين.
- قبل الإبلاغ عن إخفاق، استبعد الاختبار نفسه: أعد تشغيله، وراجع البيانات والبيئة والنتيجة المتوقعة، وقارن المخرجات المتوقعة بالفعلية جنباً إلى جنب. وقبل أن تثق بالنجاح، اقرأ ما يتحقق منه الاختبار فعلاً.
مثال تطبيقي: اسم عربي مرفوض عند التسجيل
المتطلب R-07: «يقبل حقل الاسم الكامل الحروف العربية والإنجليزية والمسافات، من 2 إلى 60 حرفاً». تسجّل مختبِرة باسم Sara Alqahtani فيُنشأ الحساب. وبالاسم نفسه مكتوباً بالحروف العربية يردّ النموذج: «Name contains invalid characters». هذا هو الإخفاق.
تبلّغ المختبِرة عن المدخلات والنتيجة المتوقعة والنتيجة الفعلية، ويجد المطور بالتنقيح (Debugging) العيب المبيّن أدناه. وحين أعاد أحد الإرسالات أثناء الجلسة 503 Service Unavailable، أعادت تشغيل الاختبار بعد تعافي البيئة وأبلغت المسؤول عن البيئة بدلاً من الإبلاغ عن عيب في التسجيل.
- العيب: النمط لا يقبل إلا الحروف اللاتينية والمسافات.
- الخطأ: نسخه المطور من نموذج قديم للنشرة البريدية يدعم الإنجليزية فقط دون الرجوع إلى R-07.
- السبب الجذري: معايير القبول وبيانات الاختبار المشتركة لم تتضمن إلا أسماء إنجليزية.
- سلبية كاذبة ظهرت في الطريق: اختبار API كان يرسل اسماً عربياً منذ أسابيع، لكنه لا يتحقق إلا من رمز الحالة
200، بينما كان جسم الاستجابة يقولinvalid_name. - بعد الإصلاح: اختبار التأكيد (Confirmation testing) بالاسمين، وإضافة أمثلة عربية إلى معايير القبول وبيانات الاختبار.
// signup/validate.js
const NAME_PATTERN = /^[A-Za-z ]{2,60}$/; // Latin letters and spaces only
NAME_PATTERN.test('Sara Alqahtani'); // true -> account created
NAME_PATTERN.test('سارة القحطاني'); // false -> "Name contains invalid characters"- 1السبب الجذريالموقف الذي أدى إلى الخطأمعايير القبول وبيانات الاختبار المشتركة لا تضم إلا أسماء إنجليزية
بوابة: يؤدي إلى
- 2الخطأ (Error)فعل بشريينسخ المطور نمط الاسم من نموذج قديم يدعم الإنجليزية فقط
بوابة: يُنتج
- 3العيب (Defect)في منتج عمل: الشيفرةفحص التسجيل لا يقبل إلا الحروف اللاتينية والمسافات
/^[A-Za-z ]{2,60}$/فرع: لا يُنفَّذ أبداً باسم عربي: يبقى العيب كامناً ولا يقع إخفاق
بوابة: يُنفَّذ باسم مكتوب بالحروف العربية
- 4الإخفاق (Failure)يُلاحَظ أثناء تشغيل النظاميُرفض اسم صالح: «Name contains invalid characters»فشل
عودة إلى الخطوة 1 يبدأ تحليل السبب الجذري من الإخفاق ويواصل السؤال «لماذا؟»
- إخفاق بلا عيب في شيفرة التسجيل
503 Service Unavailableبينما يُعاد نشر خدمة البريد في بيئة الاختبار
جرّبها: أداة اختبار Regex جرّبها: مولّد وصف الأخطاء بالذكاء الاصطناعي
أخطاء شائعة
- كتابة «في دالة التحقق خطأ» بينما ما لاحظته إخفاق. فالرسالة على الشاشة جزء من الإخفاق، والشيفرة الخاطئة هي العيب، والخطأ كان فعلاً بشرياً: أبلغ عمّا رأيته واترك تحديد موضع العيب للتنقيح.
- اعتبار الاختبار الناجح برهاناً على عدم وجود عيب.
- الإبلاغ عن كل اختبار فاشل على أنه عيب في المنتج دون استبعاد البيئة وبيانات الاختبار والاختبار نفسه.
- إصلاح العيب دون السؤال عن سبب وقوعه، فيعود النوع نفسه من العيوب.
- تسمية شخص سبباً جذرياً. فعبارة «مطور مهمل» لا تغيّر شيئاً، أما المتطلبات الغامضة أو الأمثلة الناقصة أو ضغط الوقت فيمكن تغييرها.
من منظور ضمان الجودة
في الفريق، يرى المختبِرون الإخفاقات أولاً عادةً ويبلّغون عنها، ويبحث المطورون بالتنقيح عن العيب، ويبحث الفريق عن السبب الجذري للعيوب الأهم: الخطيرة منها، والتي وصلت إلى الإنتاج، والمتكررة. تقريرك يغذّي كل خطوة، فسجّل البناء والبيئة والبيانات والخطوات والنتيجتين المتوقعة والفعلية، والدليل، مثل لقطة شاشة أو سطر من السجل.
قبل الإبلاغ اسأل: هل يتكرر الإخفاق في بيئة سليمة؟ هل ما زالت النتيجة المتوقعة هي ما يقوله المتطلب؟ هل يتحقق الاختبار من الشيء الصحيح؟ وبعد الإصلاح أعد الاختبار بالبيانات الأصلية، واقترح ما كان سيمنع العيب: معيار قبول أوضح، أو بند في قائمة تحقق المراجعة، أو بيانات اختبار أفضل. وفي المراجعات تكتشف العيوب مباشرةً، قبل أن يوجد أي إخفاق.
تمرين عملي
صنّف سبع ملاحظات من جلسة اختبار واحدة
كُتبت الملاحظات السبع التالية خلال جلسة اختبار واحدة لصفحة الدفع في صيدلية إلكترونية. صنّف كل ملاحظة: خطأ، أو عيب، أو إخفاق، أو سبب جذري، أو إخفاق سببه البيئة، أو إيجابية كاذبة، أو سلبية كاذبة، ثم اذكر ما ستفعله بعد ذلك.
1. في سلة بها 25 صنفاً، يشمل إجمالي الطلب أول 20 صنفاً فقط.
2. الحلقة التي تجمع أسعار السلة تعمل 20 مرة على الأكثر.
3. أخذ المطور حداً للسلة قدره 20 صنفاً من ملاحظة تصميم قديمة.
4. لم تُحدَّث ملاحظة التصميم حين ألغى مالك المنتج هذا الحد.
5. يفشل اختبار برسالة "connection refused": حاوية قاعدة البيانات لم تُشغَّل.
6. ينجح اختبار بسلة من 25 صنفاً؛ فهو يتحقق فقط من ظهور أي إجمالي.
7. يتوقع اختبار رسوم توصيل 15 ريالاً؛ والمنتج يعرض 10 ريالات، وهي الرسوم المعتمدة الأسبوع الماضي.- أعطِ كل ملاحظة تصنيفاً واحداً.
- رتّب الملاحظات من 1 إلى 4 في سلسلة حسب ترتيب وقوعها.
- للملاحظات من 5 إلى 7، اكتب ما ستتحقق منه وما ستفعله قبل الإبلاغ عن أي شيء.
إظهار الإجابة النموذجية
1 إخفاق: الإجمالي الملاحَظ خاطئ. و2 العيب في الشيفرة. و3 الخطأ، أي الفعل البشري الذي أنتج العيب. و4 السبب الجذري: ثغرة في العملية سمحت لملاحظة قديمة بالبقاء بعد تغيير المتطلب.
حسب ترتيب الوقوع: 4 ← 3 ← 2 ← 1. يصف التقرير 1 (السلة بالضبط والإجمالي المتوقع والإجمالي الفعلي)، ويجد المطور 2 بالتنقيح، ويعالج الفريق 4 بمراجعة ملاحظات التصميم كلما تغيّر متطلب.
5 إخفاق سببه البيئة لا شيفرة الدفع. وهو أيضاً، بوصفه نتيجة لاختبار الدفع، إيجابية كاذبة، لأنه يشير إلى عيب ليس في شيفرة الدفع، فهذا التصنيف مقبول كذلك. وفي الحالتين لا تسجّل عيباً في الدفع: شغّل حاوية قاعدة البيانات، وأعد الاختبار، وأبلغ المسؤول عن البيئة.
6 سلبية كاذبة: ينجح الاختبار رغم وجود العيب، لأنه يتحقق فقط من ظهور إجمالي. أضف تحققاً من الإجمالي المتوقع بالضبط.
7 إيجابية كاذبة: يفشل الاختبار والمنتج صحيح. أكّد التغيير مع مالك المنتج، ثم حدّث النتيجة المتوقعة إلى الرسوم الجديدة.
أسئلة شائعة
هل الـ Bug هو نفسه العيب؟
في مصطلحات ISTQB نعم: Bug وFault مرادفان للعيب (Defect). لكن الناس في الكلام اليومي يقولون «Bug» أيضاً عن الإخفاق الذي رأوه. في التقرير، صف الإخفاق الذي لاحظته واترك تحديد موضع العيب للتنقيح.
من يجد السبب الجذري: المختبِر أم المطور؟
عادةً الفريق معاً. يجد المطور العيب بالتنقيح، لكن السبب الجذري كثيراً ما يكمن في المتطلبات أو العملية أو التواصل، لذا يحتاج التحليل إلى المنتج والتطوير والاختبار. ويقدّم المختبِر الحقائق: أين اكتُشف العيب وكيف، وأيّ الاختبارات لم تكشفه.
إذا فشل اختبار لأن البيئة متوقفة، فهل هذا إخفاق؟
نعم، فالنظام لم يتصرف كما هو متوقع. لكن سببه ليس عيباً في الشيفرة التي تختبرها، فلا تسجّله عيباً في المنتج. أبلغ المسؤول عن البيئة، وأعد تشغيل الاختبار حين تعود البيئة سليمة.
هل الإيجابية الكاذبة خطأ سكربت الاختبار دائماً؟
لا. المنتج ليس معيباً بحكم التعريف، لكن السبب قد يكون السكربت، أو نتيجة متوقعة قديمة، أو بيانات الاختبار، أو البيئة. حدّد أيّها، وصحّحه، ودوّن ملاحظة حتى لا يكلّف الإنذار الكاذب نفسه وقتاً مرة أخرى.
المراجع
- ISTQB Certified Tester Foundation Level (CTFL) v4.0المنهج التأسيسي لاختبار البرمجيات: مستويات الاختبار وأنواعه وتقنيات تصميم الاختبارات وإدارة الاختبار والأدوات.
- ISTQB Glossaryالتعريفات القياسية لمصطلحات الاختبار — حالة الاختبار واختبار الانحدار والخطورة والأولوية وتحليل القيم الحدّية وغيرها.
تدرّب بأدوات متقن
اختبر التعابير النمطية مباشرةً مع إبراز التطابقات ومجموعات الالتقاط ومعاينة الاستبدال.
قارن نصّين سطراً بسطر أو كلمةً بكلمة مع إبراز الاختلافات.
مقارنة مستندي JSON دلالياً وإبراز القيم المضافة والمحذوفة والمتغيرة.
حوّل الملاحظات الأولية إلى تقرير خطأ كامل: خطوات إعادة الإنتاج، والمتوقّع مقابل الفعلي، والبيئة، ودرجة الخطورة، وقائمة تحقق للمرفقات.
اشرح تتبّعات المكدس (stack traces) ورسائل الأخطاء، وحدّد الأسباب الجذرية المحتملة وخطوات التصحيح التالية باستخدام الذكاء الاصطناعي من متقن.
للتعمّق أكثر
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.