كيف تكتب تقرير خطأ (Bug Report)
لتقرير الخطأ مهمة واحدة: أن يتيح لشخص لم يكن حاضراً إعادة إنتاج المشكلة وفهم أثرها وإصلاحها دون أن يسألك سؤالاً واحداً. التقارير التي تحقق ذلك تُصلَح؛ والتقارير التي لا تحققه تُوسم بـ «تعذّر إعادة الإنتاج» وتُغلق. والفرق ليس مهارة كتابية — بل تضمين الحقائق الصحيحة بالترتيب الصحيح.
يمنحك هذا الدليل بنية التقرير الذي يُتصرَّف بناءً عليه، ونموذجاً لـ Jira أو GitHub Issues أو أي متتبّع، ومثالاً كاملاً، وشرحاً واضحاً للحقلين اللذين يخلط الناس بينهما أكثر: الخطورة والأولوية.
ما الذي يحتويه تقرير الخطأ الجيد
- العنوان — العَرَض في سطر واحد محدد: «إتمام الشراء يعيد 500 عندما تحتوي السلة على منتج مخفّض» أفضل من «إتمام الشراء معطّل».
- البيئة — إصدار التطبيق أو البناء، والمتصفح/نظام التشغيل أو الجهاز، وبيئة API (اختبار أو إنتاج)، والحساب أو الدور المستخدم.
- الشروط المسبقة — ما يجب أن يكون صحيحاً قبل الخطوات: مستخدم مسجّل الدخول ولديه منتجات في السلة، أو علم ميزة محدد.
- خطوات إعادة الإنتاج — مرقّمة وقليلة ودقيقة. ضمّن البيانات التي استخدمتها (أو ما يعادلها مولّداً) والطلب إذا كان خطأ في API.
- النتيجة المتوقعة — ما كان ينبغي أن يحدث، ويفضّل مع إشارة إلى المتطلب أو التصميم.
- النتيجة الفعلية — ما حدث بدلاً من ذلك، منقولاً بدقة: الرسالة، ورمز الحالة، والقيمة الخاطئة.
- الأدلة — لقطة شاشة أو تسجيل، وطلب HTTP واستجابته، وأسطر من سجل وحدة التحكم أو الخادم، وتتبّع المكدس.
- التكرار — دائماً، أو متقطع (كم مرة)، أو عند أول تحميل فقط.
- الخطورة والأولوية — مدى سوء الخطأ ومدى سرعة وجوب إصلاحه (انظر أدناه).
جرّبها: مولّد وصف الأخطاء بالذكاء الاصطناعي جرّبها: مولّد عناوين الأخطاء بالذكاء الاصطناعي
نموذج تقرير خطأ
Title: Checkout returns 500 when the cart contains a discounted item
Environment: Web app 4.12.0 · Chrome 128 / Windows 11 · staging · customer role
Severity: Major Priority: High Frequency: Always
Preconditions:
- Logged in as a verified customer
- Cart contains one item with an active 20% discount (SKU A-100)
Steps to reproduce:
1. Open /checkout
2. Select "Card" as the payment method
3. Click "Place order"
Expected result:
Order is created (201), confirmation page shows the discounted total 199.20
Actual result:
Page shows "Something went wrong". POST /api/v1/orders returns 500:
{"error":{"code":"INTERNAL","requestId":"9f1c…"}}
Evidence:
- screenshot-checkout-500.png
- request/response captured (attached)
- server log: TypeError: cannot read "rate" of undefined (discount.ts:41)
Notes:
Works when the cart has no discounted item. Started after release 4.12.0.جرّبها: مولّد وصف الأخطاء بالذكاء الاصطناعي جرّبها: فاحص طلبات HTTP
الخطورة مقابل الأولوية
تقيس الخطورة (Severity) الأثر على النظام أو المستخدم: ما مقدار ما تعطّل ولمن. وتقيس الأولوية (Priority) الإلحاح بالنسبة للعمل: متى يجب إصلاحه مقارنةً بالأعمال الأخرى. يحددهما أشخاص مختلفون وكثيراً ما يختلفان.
خطأ إملائي في اسم الشركة على صفحة تسجيل الدخول خطورته تافهة لكن أولويته عالية. وتصدير إداري يعمل مرة كل ربع سنة ويُسقط صفوفاً دون تنبيه خطورته حرجة (Critical، لأنه فقدان بيانات) لكن أولويته منخفضة حتى يقترب موعد تشغيله التالي. وتسجيل الاثنين، كلٌّ على حدة، هو ما يتيح للفريق التخطيط بصدق.
- الخطورة — حاجب (المسار الأساسي غير قابل للاستخدام ولا حل بديل)، وحرج (فقدان بيانات أو تلفها، أو ثغرة أمنية، أو فشل دفع، أو تعطّل وظيفة رئيسية لمعظم المستخدمين)، ورئيسي (وظيفة مهمة معطّلة مع وجود حل بديل، أو تأثر عدد قليل من المستخدمين)، وثانوي (عيب وظيفي صغير أو شكلي أو حالة حدّية)، وتافه (خطأ إملائي أو تفصيل شكلي لا يُذكر) — افحص من الأعلى واختر أول مستوى ينطبق.
- الأولوية — قصوى / عالية (إصلاح قبل الإصدار أو الآن)، ومتوسطة (السبرنت القادم)، ومنخفضة (قائمة الانتظار).
جرّبها: اقتراح خطورة الخطأ بالذكاء الاصطناعي جرّبها: اقتراح أولوية الخطأ بالذكاء الاصطناعي
قبل الإبلاغ: اعزل الخطأ
- أعد إنتاجه مرتين. إذا حدث مرة واحدة فسجّله كمتقطع ودوّن ما اختلف.
- قلّل الخطوات إلى الحد الأدنى الذي ما زال يسببه. أزل كل ما لا يغيّر النتيجة.
- غيّر متغيراً واحداً في كل مرة — متصفح مختلف، أو حساب مختلف، أو بيانات مختلفة — لإيجاد المحفّز.
- تحقق مما إذا كان مبلَّغاً عنه مسبقاً: ابحث في المتتبّع عن رسالة الخطأ ونقطة النهاية.
- التقط الأدلة وهي على الشاشة: الطلب، والاستجابة، ووحدة التحكم، والرسالة بنصها.
جرّبها: محلّل رسائل الأخطاء بالذكاء الاصطناعي جرّبها: محلّل استجابات API
الأخطاء التي تجعل التقارير تُعاد
- لا خطوات، بل وصف للعَرَض فقط.
- «لا يعمل» كنتيجة فعلية، دون رسالة أو رمز أو لقطة شاشة.
- عدة أخطاء في تقرير واحد — كل خطأ يحتاج إلى دورة حياته الخاصة.
- رأي في العنوان («هذا فظيع») بدلاً من العَرَض.
- بيانات عملاء حقيقية ملصقة في التقرير. استخدم بيانات اختبار مولّدة تعيد إنتاج الشكل نفسه.
- بيئة ناقصة — الخطأ الذي يظهر فقط على Safari في iOS يهدر يوماً كاملاً إن لم يُذكر ذلك.
الإبلاغ عن أخطاء API
في عيوب API، إعادة الإنتاج هي الطلب نفسه. ضمّن الطريقة وعنوان URL والترويسات (مع حجب الرموز) والجسم، والاستجابة الكاملة — الحالة والترويسات والجسم — ومعرّف الطلب إن كانت الواجهة تعيده. وأمر cURL هو الشكل الأكثر قابلية للنقل: يستطيع المطوّر لصقه ورؤية الفشل فوراً.
الأسئلة الشائعة
ما الفرق بين الخطورة والأولوية؟
الخطورة هي مدى سوء تأثير الخطأ على النظام أو المستخدمين؛ والأولوية هي مدى إلحاح العمل على إصلاحه. قد يكون خطأ شكلي في الصفحة الرئيسية منخفض الخطورة وعالي الأولوية.
كم خطوة يجب أن يحتوي تقرير الخطأ؟
أقل عدد يعيد إنتاج المشكلة بموثوقية — عادةً ما بين ثلاث وسبع. يجب أن تكون كل خطوة إجراءً واحداً يستطيع شخص غريب تنفيذه.
هل أرفق لقطة شاشة؟
نعم كلما كان الخطأ مرئياً. وفي أخطاء API أرفق الطلب والاستجابة بدلاً منها؛ وفي الانهيارات أرفق تتبّع المكدس أو أسطر السجل.
ما الذي يجعل عنوان الخطأ جيداً؟
العَرَض والمكان والشرط في سطر واحد: «صفحة تسجيل الدخول تعرض شاشة فارغة بعد إدخال رمز OTP خاطئ ثلاث مرات».
هل يستطيع الذكاء الاصطناعي كتابة تقارير الأخطاء؟
يستطيع الذكاء الاصطناعي تحويل ملاحظات أولية أو رسالة خطأ أو طلب ملتقط إلى تقرير منظّم بعنوان واضح وخطورة مقترحة. ويظل المختبِر يتحقق من الخطوات والأثر قبل الإبلاغ.
ماذا لو لم أستطع إعادة إنتاج الخطأ باستمرار؟
أبلغ عنه على أي حال، وضع علامة «متقطع»، واذكر معدل حدوثه، وأرفق كل دليل من المرات التي حدث فيها — السجلات والطوابع الزمنية ومعرّفات الطلبات. تظهر الأنماط من عدة تقارير.
المراجع
- ISTQB Certified Tester Foundation Level (CTFL) v4.0المنهج التأسيسي لاختبار البرمجيات: مستويات الاختبار وأنواعه وتقنيات تصميم الاختبارات وإدارة الاختبار والأدوات.
- ISTQB Glossaryالتعريفات القياسية لمصطلحات الاختبار — حالة الاختبار واختبار الانحدار والخطورة والأولوية وتحليل القيم الحدّية وغيرها.
تمرين عملي
أعد كتابة تقرير خطأ ضعيف عن إخفاق في دفع الفواتير
تختبر الإصدار 7.3.0 من الخدمات المصرفية عبر الإنترنت لبنك خيالي في بيئة ما قبل الإنتاج (staging). صادف زميلٌ مشكلةً أثناء اختبار دفع الفواتير، فترك المسودة أدناه في المتتبّع دون أن يرفعها، وطلب منك إكمالها. وقد أعدت إنتاج المشكلة بنفسك بعد ذلك، وتجد في المادة ملاحظاتك، والمتطلب، والطلب الذي نسخه زميلك من المتصفح.
حوّل المسودة إلى تقارير يستطيع المطوّر التصرف بناءً عليها دون أن يسألك سؤالاً واحداً. قرّر أولاً ما الذي يُعدّ في المسودة عيباً مستقلاً، وما الذي ينتمي إلى التقرير الرئيسي، وما الذي ليس عيباً أصلاً. ثم اكتب التقرير الكامل لإخفاق الدفع بكل حقول الدليل — العنوان، والبيئة، والشروط المسبقة، وخطوات إعادة الإنتاج، والنتيجة المتوقعة، والنتيجة الفعلية، والأدلة، والتكرار، والخطورة والأولوية — مع ملاحظات بما عزلته. أما العيب الثاني فيكفيه عنوان مع خطورة وأولوية مقترحتين.
تكفي الورقة والقلم، وخصّص لذلك نحو 25 دقيقة. تفكّك أداة «محلّل أوامر cURL» الأمر المنسوخ إلى ترويساته لتقرر ما تُبقي عليه، وتعيد أداة «مولّد أوامر cURL» بناء أمر نظيف. وإن أردت مقارنةً بعد ذلك، فأداة «مولّد وصف الأخطاء بالذكاء الاصطناعي» من قائمة أدوات الدليل (تتطلب تسجيل الدخول) تصوغ تقريراً من الملاحظات نفسها — الصقها دون الرمز وملفات تعريف الارتباط، واحكم على مسودتها بمقياس نسختك، لا العكس.
بنك خيالي، خدمات مصرفية عبر الإنترنت. الإصدار 7.3.0 قيد الاختبار في بيئة staging.
وبيئة الإنتاج وبيئة UAT ما زالتا تعملان بالإصدار 7.2.4.
المتطلب BILL-3: دفع فاتورة
يدفع العميل لجهة مفوترة محفوظة أي مبلغ من 1.00 إلى 10,000.00 ريال، بمنزلتين عشريتين
على الأكثر، من أحد حساباته. وعند النجاح تظهر الدفعة في سجل الحساب برقم مرجعي، وتعرض
صفحة التأكيد الرقم نفسه.
--- مسودة تركها زميل في المتتبّع (لم تُرفع) ---
العنوان: دفع الفواتير معطّل تماماً!!! عاجل
الوصف: حاولت دفع فاتورة الكهرباء ولا يعمل، خطأ في كل مرة. وزر الدفع مقطوع بالعربية
على الجوال، ورسالة الخطأ بلا فائدة، يجب أن تقول ما المشكلة. أصلحوه بأسرع وقت.
الطلب (Copy as cURL من المتصفح):
curl 'https://staging.bank.example/api/v2/bill-payments' \
-H 'accept: application/json' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ0ZXN0LWN1c3QtMDcifQ...' \
-H 'content-type: application/json' \
-b 'SESSION=7f3c9a1e52d84b0c; _ga=GA1.2.884120.1727' \
-H 'sec-ch-ua-platform: "Windows"' \
-H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/129.0.0.0' \
--data-raw '{"billerId":"BLR-ELEC-01","fromAccount":"ACC-TEST-0007","amount":"250.75"}'
الاستجابة: 500
{"error":{"code":"INTERNAL","message":"Unexpected error","requestId":"b7e2-41c9"}}
--- ملاحظاتك من إعادة الإنتاج (staging، البناء 7.3.0، عميل أفراد، الواجهة العربية) ---
المسار: «المدفوعات» ثم «دفع فاتورة» ثم الجهة المفوترة ثم الحساب ثم «المبلغ»،
ثم «ادفع الفاتورة».
المحاولة 1: Chrome 129 / Windows 11، الحساب test-cust-07، الجهة «الكهرباء»، 250.00:
دُفعت، وظهر الرقم المرجعي، ونقص الرصيد 250.00.
المحاولة 2: مثل المحاولة 1 بمبلغ 250.75: شريط أحمر نصه «حدث خطأ ما. يُرجى المحاولة
لاحقاً.» وأعاد POST /api/v2/bill-payments الرمز 500 بالاستجابة أعلاه.
لا دفعة في السجل، والرصيد لم يتغير.
المحاولة 3: تكرار للمحاولة 2: النتيجة نفسها.
المحاولة 4: Firefox 131 / Windows 11، test-cust-07، «الكهرباء»، 250.75: النتيجة نفسها.
المحاولة 5: Chrome، الحساب test-cust-12، الجهة «المياه»، 99.50: النتيجة نفسها.
المحاولة 6: Chrome، test-cust-07، «الكهرباء»، 1000.00: دُفعت، وظهر الرقم المرجعي.
المحاولة 7: بيئة UAT (البناء 7.2.4)، Chrome، uat-cust-03، «الكهرباء»، 250.75:
دُفعت، وظهر الرقم المرجعي.
عارض سجلات الخادم، معرّف الطلب b7e2-41c9 (الاستثناء وأول إطار من كود التطبيق):
java.lang.NumberFormatException: For input string: "250.75"
at bank.payments.AmountMapper.toMinorUnits(AmountMapper.java:58)
البحث في المتتبّع عن "bill-payments" و"NumberFormatException": لا عيب مفتوح.
فحص الجوال: شريط أجهزة Chrome بعرض 360 px. في الواجهة العربية تُقطع تسمية زر
«ادفع الفاتورة» في منتصف الكلمة، وتتسع عند 412 px. وتسمية الزر الإنجليزية
تتسع عند 360 px. والضغط على الزر ما زال يعمل.- اقرأ المسودة واكتب كل مشكلة مستقلة تذكرها. وقرّر لكل منها: تقرير خاص بها، أم جزء من التقرير الرئيسي، أم ليست عيباً.
- قارن المحاولات في ملاحظاتك متغيراً واحداً في كل مرة: المتصفح، والحساب، والجهة المفوترة، والمبلغ. واكتب ما الذي يحفّز الإخفاق، وما الذي لا يغيّر شيئاً.
- اكتب العنوان: العَرَض والمكان والشرط في سطر واحد، بلا رأي.
- اكتب البيئة والشروط المسبقة وأقل عدد ممكن من الخطوات المرقّمة بالبيانات الدقيقة، ثم النتيجة المتوقعة مع الإشارة إلى المتطلب BILL-3، والنتيجة الفعلية منقولةً بدقة.
- نظّف الأدلة: أبقِ ما يعيد إنتاج الطلب فقط، وضع عنصراً نائباً مكان رمز Bearer، واحذف ملفات تعريف الارتباط (Cookies)، وأسقط الترويسات التي يضيفها المتصفح من تلقاء نفسه.
- حدّد التكرار والخطورة والأولوية بحسب مقاييس الدليل، ولكل منها جملة تبرير واحدة؛ ثم اكتب العنوان والخطورة والأولوية للعيب الثاني.
إظهار الإجابة النموذجية
فرز المسودة (الخطوة 1). تخلط المسودة ثلاث مشكلات. أولاها أن دفع الفاتورة يخفق لبعض المبالغ: هذا هو العيب الرئيسي، وله تقريره الخاص. وثانيتها أن تسمية زر الدفع مقطوعة في الواجهة العربية عند العرض الضيق: عيب مستقل له سببه وإصلاحه ودورة حياته، فله تقرير خاص أيضاً. وثالثتها «رسالة الخطأ بلا فائدة»: الرسالة العامة سلوك معقول أمام خطأ غير متوقع في الخادم، والمتطلب BILL-3 لا يقول شيئاً عن صياغة رسائل الخطأ، وبعد إصلاح الرمز 500 لن تظهر الرسالة لهذه الدفعات أصلاً. فهي ليست عيباً؛ وإن رأيت أن صياغتها يجب أن تتغير فاطرحها على مالك المنتج اقتراحَ تحسين مستقلاً. أما الطلب المنسوخ والاستجابة ذات الرمز 500 فليسا مشكلتين مستقلتين: بعد تنظيفهما (الخطوة 5) يدخلان التقرير الرئيسي دليلاً. والباقي لا يدخل أي تقرير: «معطّل تماماً» و«عاجل» و«بأسرع وقت» رأي، و«خطأ في كل مرة» ادعاء غير مقيس تنقضه المحاولتان 1 و6.
عزل المحفّز (الخطوة 2). لا تختلف المحاولتان 1 و2 إلا في المبلغ: الدفع بمبلغ 250.00 ينجح وبمبلغ 250.75 يفشل، والمحاولة 3 تكرر المحاولة 2 بالنتيجة نفسها، فالأمر ليس حادثة عابرة. وتغيير المتصفح (المحاولة 4) لا يغيّر شيئاً. وتغيّر المحاولة 5 الحساب والجهة المفوترة والمبلغ معاً وتفشل مع ذلك، فالإخفاق لا يحتاج إلى أيٍّ من تلك القيم بعينها. وتنجح المحاولة 6 (1000.00) كما نجحت المحاولة 1. فالمحفّز إذن مبلغ جزؤه العشري غير صفري. ونجحت المحاولة 7 على الإصدار 7.2.4، وهذا يشير إلى انحدار (Regression) دخل مع الإصدار 7.3.0؛ لكن بيئة UAT تختلف عن staging في أكثر من البناء، فاذكره قرينةً قوية لا حقيقةً مثبتة. وسطر السجل يدلّ المطوّر على موضع البحث (AmountMapper.java:58)، لكن المختبِر يقدّمه دليلاً، لا تشخيصاً في العنوان.
التقرير النموذجي للعيب الرئيسي. العنوان: «دفع فاتورة» يعيد 500 ولا يُنشئ دفعة عندما يكون للمبلغ جزء عشري غير صفري، مثل 250.75. البيئة: الخدمات المصرفية عبر الإنترنت 7.3.0 في بيئة staging، على Chrome 129 / Windows 11، وأُعيد إنتاجه أيضاً على Firefox 131 / Windows 11، بالواجهة العربية ودور عميل أفراد، وحسابا الاختبار test-cust-07 وtest-cust-12. الخطورة: حرج (Critical). الأولوية: عالية (High). التكرار: دائماً — فشلت المحاولات الأربع كلها بمبلغ كهذا (المحاولات من 2 إلى 5)، ونجح المبلغان الخاليان من الكسور كلاهما.
الشروط المسبقة: مستخدم مسجّل الدخول بدور عميل أفراد (مثل test-cust-07)، ولديه جهة مفوترة محفوظة («الكهرباء»، BLR-ELEC-01) وحساب (ACC-TEST-0007) رصيده يغطي المبلغ. خطوات إعادة الإنتاج: 1. افتح «المدفوعات» ثم «دفع فاتورة». 2. اختر الجهة المفوترة «الكهرباء» والحساب ACC-TEST-0007. 3. أدخل 250.75 في حقل «المبلغ». 4. انقر «ادفع الفاتورة».
النتيجة المتوقعة: تُنشأ الدفعة، وتعرض صفحة التأكيد رقماً مرجعياً، وتظهر الدفعة في سجل الحساب بالرقم نفسه، وينقص الرصيد 250.75 (المتطلب BILL-3: أي مبلغ من 1.00 إلى 10,000.00 ريال بمنزلتين عشريتين على الأكثر). النتيجة الفعلية: يظهر شريط أحمر نصه «حدث خطأ ما. يُرجى المحاولة لاحقاً.»، ويعيد POST /api/v2/bill-payments رمز الحالة 500 مع الجسم {"error":{"code":"INTERNAL","message":"Unexpected error","requestId":"b7e2-41c9"}}؛ ولا تظهر أي دفعة في السجل، والرصيد لم يتغير.
الأدلة: لقطة شاشة للشريط؛ والاستجابة أعلاه؛ وسطر سجل الخادم لمعرّف الطلب b7e2-41c9، وهو java.lang.NumberFormatException: For input string: "250.75" في bank.payments.AmountMapper.toMinorUnits(AmountMapper.java:58)؛ والطلب أمرَ cURL منظّفاً: curl 'https://staging.bank.example/api/v2/bill-payments' -H 'accept: application/json' -H 'authorization: Bearer [REDACTED]' -H 'content-type: application/json' --data-raw '{"billerId":"BLR-ELEC-01","fromAccount":"ACC-TEST-0007","amount":"250.75"}'. وُضع [REDACTED] مكان رمز Bearer لأن كل من يستطيع قراءة المتتبّع يستطيع استخدامه ما دام صالحاً، ويضع المطوّر مكانه رمزاً لحساب اختبار خاص به. ويُحذف الخيار -b كله أيضاً: فهو يحمل ملف تعريف ارتباط الجلسة، وهو قابل للاستخدام بالقدر نفسه، وملف تعريف ارتباط التحليلات _ga. ففي الأمر المنسوخ قد تأتي ملفات تعريف الارتباط في -b لا في ترويسة، فافحص الموضعين عند الحجب. وتُحذف ترويسات accept-language وsec-ch-ua-platform وuser-agent لأن المتصفح يضيفها من تلقاء نفسه، والمحاولة 4 تُظهر أن المتصفح لا يغيّر النتيجة. وتبقى ترويستا accept وcontent-type لأنهما تصفان ما يُرسَل في الطلب وما يُتوقَّع في الاستجابة؛ ولولا content-type لوسم curl جسم --data-raw بالنوع application/x-www-form-urlencoded. وفي العمل الفعلي شغّل الأمر المنظّف مرة واحدة برمز جديد خاص بك قبل إرفاقه: فإن أعاد الرمز 500 نفسه، فلم يكن أي شيء مما حذفته لازماً.
ملاحظات: المبالغ الخالية من الكسور تنجح (250.00 و1000.00)، والإخفاق لا يتعلق بالمتصفح ولا بالحساب ولا بالجهة المفوترة (المحاولتان 4 و5). والدفعة نفسها بمبلغ 250.75 تنجح في بيئة UAT التي تعمل بالإصدار 7.2.4، فالأرجح أن الإصدار 7.3.0 أدخل العيب؛ ولأن UAT تختلف عن staging في أكثر من البناء، فهذه قرينة قوية لا دليل قاطع. ولم يُعثر على عيب مفتوح عند البحث عن bill-payments وNumberFormatException.
لماذا حرج: انزل على مقياس الخطورة في الدليل من الأعلى. لا ينطبق حاجب (Blocker)، لأن دفع الفواتير ما زال يعمل للمبالغ الخالية من الكسور. وينطبق حرج: فهذا فشل دفع، ولا يستطيع العميل دفع المبلغ الدقيق لأي فاتورة فيها كسور. وقد تحتج بعض الفرق بأنه حاجب لأن كثيراً من الفواتير الحقيقية فيها كسور؛ ومع هذا التبرير يمكن الدفاع عن أيٍّ من المستويين، أما رئيسي (Major) أو ما دونه فلا، لأن الدفعات تفشل. ولماذا عالية: بيئة الإنتاج ما زالت تعمل بالإصدار 7.2.4، وهو البناء الذي تنجح عليه الدفعة نفسها في بيئة UAT، فإطلاق 7.3.0 بهذا العيب سيجعل كل دفعة فاتورة لمبلغها جزء عشري غير صفري تفشل لدى العملاء، ويجب إصلاحه قبل الإصدار. ولو كان 7.3.0 قد وصل إلى الإنتاج لكانت الأولوية قصوى (Highest). وأنت بصفتك المختبِر تقترح الأولوية، ويقررها اجتماع فرز العيوب أو مالك المنتج.
التقرير الثاني. العنوان: تسمية زر «ادفع الفاتورة» مقطوعة في الواجهة العربية عند عرض 360 px لنافذة العرض. البيئة: الخدمات المصرفية عبر الإنترنت 7.3.0 في بيئة staging، وشريط أجهزة Chrome بعرض 360 px؛ وتتسع التسمية عند 412 px، وتتسع التسمية الإنجليزية عند 360 px. الخطورة: ثانوي (Minor)، فهو عيب شكلي والزر ما زال يعمل. الأولوية: متوسطة (Medium) مقترحة (السبرنت القادم)، لأنه الإجراء الرئيسي في الصفحة لمستخدمي الواجهة العربية على الهواتف الضيقة؛ وقد يرفعها مالك المنتج إلى عالية قبل الإصدار. أرفق لقطتي شاشة عند 360 px و412 px، وإن استطعت فتأكد على هاتف حقيقي بهذا العرض واذكر طرازه: فمحاكاة الجهاز ليست الجهاز نفسه.
بعد الإصلاح: يعيد اختبار التأكيد (Confirmation testing) الخطوات نفسها بالمبلغين 250.75 و99.50. وأضف فحوص انحدار حول التغيير: مبالغ خالية من الكسور، وحدود المتطلب BILL-3 (1.00 و10,000.00 مقبولان، و0.99 و10,000.01 مرفوضان)، ومبلغاً بمنزلة عشرية واحدة مثل 250.5 (مقبول)، وآخر بثلاث منازل مثل 250.755 (مرفوض، لأن BILL-3 يسمح بمنزلتين على الأكثر).
راجع عملك. تقريرك كامل إذا استطاع مطوّر لم يرَ المسودة أن يعيد إنتاج الإخفاق من خطواتك وحدها؛ وإذا ذكر العنوان العَرَض والمكان والشرط بلا رأي؛ واستخدمت الخطوات مبلغاً دقيقاً واحداً وتركت بقية المحاولات للملاحظات؛ وأشارت النتيجة المتوقعة إلى BILL-3؛ ونقلت النتيجة الفعلية الشريط ورمز الحالة ومعرّف الطلب بدقة؛ وحُجب رمز Bearer واختفت ملفات تعريف الارتباط؛ وحُددت الخطورة والأولوية كلٌّ على حدة مع سبب؛ ولم يدخل هذا التقريرَ عيبُ الزر ولا الشكوى من صياغة رسالة الخطأ. وبمصطلحات ISTQB فإن ما لاحظته إخفاق (Failure): رمز الحالة 500 والدفعة الغائبة؛ والتقرير يعطي المطوّر ما يحتاجه ليجد العيب (Defect) الكامن وراءه، وسطر السجل دليل لا تشخيصك.
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.
جزء من مسار تعلم ضمان الجودة
قبل هذا الموضوع
الأدوات المذكورة في هذا الدليل
حوّل الملاحظات الأولية إلى تقرير خطأ كامل: خطوات إعادة الإنتاج، والمتوقّع مقابل الفعلي، والبيئة، ودرجة الخطورة، وقائمة تحقق للمرفقات.
ولّد عناوين أخطاء واضحة وقابلة للبحث من وصف غير مرتّب باستخدام الذكاء الاصطناعي من متقن.
احصل على درجة خطورة مقترحة (Blocker / Critical / Major / Minor / Trivial) مع التبرير من الذكاء الاصطناعي من متقن.
احصل على أولوية مقترحة (P0–P3) تراعي أثر العمل والمستخدمين المتأثرين والمواعيد النهائية ودرجة الخطورة، من الذكاء الاصطناعي من متقن.
اشرح تتبّعات المكدس (stack traces) ورسائل الأخطاء، وحدّد الأسباب الجذرية المحتملة وخطوات التصحيح التالية باستخدام الذكاء الاصطناعي من متقن.
اطّلع بالضبط على ما يرسله عميلك: الطريقة والترويسات والاستعلام والجسم وعنوان IP ومعلومات TLS.
حلّل استجابة API: البنية وأنواع الحقول وقيم null والتكرارات والأحجام ومشكلات جودة البيانات المحتملة.
مصنع متكامل لبيانات الاختبار الاصطناعية: مستخدمون وعملاء وشركات وعناوين وأرقام وتواريخ وسلاسل نصية بصيغة JSON أو CSV أو SQL أو XML.