الاختبار اليدوي مقابل الاختبار الآلي
الاختبار اليدوي هو شخص يشغّل المنتج ويحكم على النتيجة؛ والاختبار الآلي هو نص برمجي يشغّل المنتج ويقارن النتيجة بقيمة متوقعة. ولا يحل أحدهما محل الآخر. الأتمتة هي الطريقة الوحيدة لإعادة فحص آلاف الأشياء مع كل تغيير؛ والإنسان هو الطريقة الوحيدة لملاحظة ما لم يفكر أحد في فحصه.
يقارن هذا الدليل بينهما في الأبعاد التي تهم الفريق — التكلفة عبر الزمن، وسرعة التغذية الراجعة، وأنواع العيوب التي يجدها كل منهما، والصيانة، والمهارات المطلوبة — ويقدم قاعدة لتقسيم جهد الاختبار بينهما تصمد عملياً.
ما الذي يعنيه كل مصطلح فعلاً
يغطي الاختبار اليدوي نشاطين مختلفين. الاختبار اليدوي المكتوب يتبع حالات اختبار مكتوبة خطوة بخطوة ويسجل النجاح أو الفشل؛ وهو قابل للتكرار لكنه بطيء، وهو الجزء من الاختبار اليدوي الذي تحل الأتمتة محله. أما الاختبار الاستكشافي، الذي عرّفه سيم كانر وطوّره جيمس باخ وإليزابيث هندريكسون، فهو تعلّم وتصميم اختبار وتنفيذ متزامن: يقرر المختبِر الخطوة التالية مما كشفته الخطوة السابقة. وهو ليس «اختباراً بلا خطة» — فللجلسة ميثاق وإطار زمني وملاحظات — وهو الجزء الذي لا تستطيع الأتمتة أن تحل محله.
الاختبار الآلي هو تنفيذ فحوص مكتوبة مسبقاً بواسطة أداة: اختبارات الوحدة، واختبارات الواجهات البرمجية، واختبارات واجهة المستخدم عبر Selenium أو Cypress أو Playwright أو Appium، ونصوص الأداء. الأداة لا تقرر ما يُفحص؛ بل قرر ذلك شخص، مرة واحدة، حين كُتب النص. ولذلك لا تجد الأتمتة إلا العيوب التي توقعها أحد — وهذا بالضبط ما وُجدت حزمة الانحدار لأجله، وبالضبط سبب عجزها عن أن تكون الاستراتيجية كلها.
جنباً إلى جنب
الاختبار اليدوي
حالات اختبار مكتوبة تُتَّبع خطوة بخطوة، وجلسات استكشافية
- منحنى التكلفة:
- القدر نفسه تقريباً في كل تشغيل
- سرعة التغذية الراجعة:
- ساعات أو أيام، حين يتوفر مختبِر
- ما يجده:
- العيوب الجديدة ومشكلات قابلية الاستخدام والمسارات المربكة والافتراضات الخاطئة في المتطلبات
- الاتساق:
- يتفاوت الإنسان: ضعف في الانحدار وقوة في الاستكشاف
- الصيانة:
- تحتاج حالات الاختبار إلى تحديث أيضاً، لكن الحالة القديمة تفشل بلطف
- التغطية:
- الحكم، يدوي فقط: التخطيط والصياغة والنبرة وإحساس إمكانية الوصول و«هل هذا منطقي»
- المهارات:
- للاختبار الاستكشافي: مختبِرون بمعرفة بالمنتج والمجال
الاختبار الآلي
فحوص مكتوبة مسبقاً تنفّذها أداة
- منحنى التكلفة:
- أكثر في البداية (الكتابة والبنية التحتية) وأقل في كل تشغيل: لا تسترد تكلفتها إلا للفحوص التي تعمل مرات كثيرة
- سرعة التغذية الراجعة:
- دقائق، عند كل إيداع
- ما يجده:
- الانحدارات: أشياء كانت تعمل وتوقفت
- الاتساق:
- يعمل النص البرمجي بالطريقة نفسها كل مرة
- الصيانة:
- تنكسر النصوص حين يتغير المنتج، وخاصة نصوص واجهة المستخدم؛ وميزانية الصيانة جزء من التكلفة الحقيقية
- التغطية:
- الحجم، آلي فقط: ألف تركيبة بيانات وكل متصفح وكل ليلة
- المهارات:
- مهندسون يكتبون كوداً قابلاً للصيانة
قد تكون المهارتان لدى شخصين مختلفين، أو لدى الشخص نفسه في أيام مختلفة.
- منحنى التكلفة — يكلّف الاختبار اليدوي القدر نفسه تقريباً في كل تشغيل؛ وتكلّف الأتمتة أكثر في البداية (الكتابة والبنية التحتية) وأقل في كل تشغيل، فلا تسترد تكلفتها إلا للفحوص التي تعمل مرات كثيرة.
- سرعة التغذية الراجعة — تبلّغ الحزمة الآلية خلال دقائق عند كل إيداع؛ وتستغرق الجولة اليدوية ساعات أو أياماً وتحدث حين يتوفر مختبِر.
- ما يجده كل منهما — تجد الأتمتة الانحدارات: أشياء كانت تعمل وتوقفت. ويجد الاختبار اليدوي والاستكشافي العيوب الجديدة ومشكلات قابلية الاستخدام والمسارات المربكة والافتراضات الخاطئة في المتطلبات.
- الاتساق — يعمل النص البرمجي بالطريقة نفسها كل مرة؛ ويتفاوت الإنسان، وهذا ضعف في الانحدار وقوة في الاستكشاف.
- الصيانة — تنكسر النصوص حين يتغير المنتج، وخاصة نصوص واجهة المستخدم؛ وميزانية الصيانة جزء من التكلفة الحقيقية. وحالات الاختبار اليدوية تحتاج إلى تحديث أيضاً، لكن الحالة القديمة تفشل بلطف.
- تغطية الحكم — التخطيط والصياغة والنبرة وإحساس إمكانية الوصول و«هل هذا منطقي» — يدوية فقط. وتغطية الحجم — ألف تركيبة بيانات وكل متصفح وكل ليلة — آلية فقط.
- المهارات — تحتاج الأتمتة إلى مهندسين يكتبون كوداً قابلاً للصيانة؛ ويحتاج الاختبار الاستكشافي إلى مختبِرين بمعرفة بالمنتج والمجال. وهما شخصان مختلفان أو الشخص نفسه في أيام مختلفة.
متى يتفوق الاختبار اليدوي
- الميزات الجديدة — الجولة الأولى على شيء لم يعمل من قبل، حيث لا يزال السلوك المتوقع قيد الاكتشاف.
- قابلية الاستخدام والتوطين — هل يُقرأ التخطيط العربي بشكل صحيح من اليمين إلى اليسار، وهل رسالة الخطأ منطقية، وهل المسار مربك.
- الواجهات غير المستقرة — واجهة المستخدم التي تتغير كل سبرنت تجعل أتمتة الواجهة مستنقع صيانة حتى تستقر.
- الفحوص لمرة واحدة — ترحيل، أو إصلاح بيانات، أو تحقق يوم الإصدار لن يتكرر أبداً.
- الجلسات الاستكشافية — مطاردة محددة الوقت ومبنية على ميثاق للعيوب التي لم تتوقعها أي حالة؛ وهي أعلى عائد من العيوب في الساعة ينتجه مختبِر ماهر.
جرّبها: مولّد سيناريوهات الاختبار جرّبها: مولّد حالات الاختبار
متى تتفوق الأتمتة
- الانحدار — كل فحص يجب أن ينجح مع كل إصدار مكانه حزمة تعمل في CI؛ وإعادة تشغيله بالبشر أغلى طريقة لأداء أقل الاختبارات قيمة.
- فحوص الواجهات البرمجية والعقود — طلبات دقيقة واستجابات دقيقة ومواصفة للمقارنة: الهدف المثالي للأتمتة، أرخص وأكثر استقراراً من اختبارات واجهة المستخدم.
- الحالات المبنية على البيانات — الخطوات نفسها على مئات المدخلات: القيم الحدّية والعملات والإعدادات المحلية والصيغ.
- تعدد المتصفحات والأجهزة — الرحلة نفسها على كل متصفح مدعوم وكل حجم شاشة، وهو ما لا يستطيع فريق تحمّله يدوياً.
- الأداء والحمل — مستحيل يدوياً: توليد حركة متزامنة وقياسها أتمتة بحكم التعريف.
جرّبها: مولّد سيناريوهات الانحدار جرّبها: مولّد اختبارات الانحدار بالذكاء الاصطناعي جرّبها: مولّد حالات اختبار من OpenAPI جرّبها: مدقّق عقود API جرّبها: مولّد اختبارات الطلبات المتزامنة
تقرير ما يُؤتمت: الهرم وقاعدة بسيطة
هرم الاختبار — اختبارات وحدة كثيرة، واختبارات واجهات برمجية وتكامل أقل، واختبارات واجهة مستخدم شاملة قليلة — نموذج تكلفة: ينبغي أن يعيش الفحص في أدنى مستوى يمكن التعبير عنه فيه، لأن المستويات الأدنى أسرع وأكثر استقراراً وأرخص صيانة. وقاعدة العمل المختبَرة على مستوى الواجهة البرمجية لا تحتاج إلى اختبار واجهة مستخدم؛ وينبغي ألا يوجد اختبار واجهة مستخدم إلا لمسار يمكن أن يفشل في واجهة المستخدم.
ولأي فحص منفرد القاعدة هي: أتمِته إذا كان سيعمل مرات كثيرة، وله نتيجة متوقعة محددة، ويختبر شيئاً مستقراً بما يكفي حتى لا يحتاج النص إلى إعادة كتابة كل سبرنت. التكرار والحتمية والاستقرار. والفحص الذي يخفق في أي من الثلاثة يُستحسن أن يؤديه إنسان، أو ألا يُؤدى بعد.
- ابدأ الأتمتة على مستوى الواجهة البرمجية؛ وأضف رحلات واجهة المستخدم للمسارات الأهم فقط.
- أبقِ الحزمة سريعة — الحزمة التي تستغرق ساعة تتوقف عن العمل مع كل تغيير وتتحول بهدوء إلى تقرير ليلي لا يقرأه أحد.
- احذف الاختبارات المتقلبة أو أصلحها فوراً؛ فالحزمة التي تحمرّ أحياناً بلا سبب تدرّب الفريق على تجاهل الأحمر.
- راجع الحزمة بحثاً عن التكرارات والفحوص الميتة كل ربع سنة؛ فالأتمتة تتراكم.
جرّبها: محسّن حالات الاختبار بالذكاء الاصطناعي جرّبها: كاشف حالات الاختبار المكرّرة بالذكاء الاصطناعي
كيف تجمع الفرق بينهما
النمط الناجح ليس نسبة مئوية بل تقسيم عمل. حزمة الانحدار الآلية تحرس ما يعمل بالفعل وتعمل مع كل تغيير في خط الأنابيب — GitLab CI أو GitHub Actions أو ما يعادلهما — فيعرف المطور خلال دقائق أن تغييراً كسر شيئاً. ويقضي المختبِرون وقتهم قبل الحزمة: يراجعون المتطلبات، ويصممون الحالات للميزة الجديدة، ويجرون جلسات استكشافية عليها، ويسلّمون الحالات الجديرة بالحفظ إلى الأتمتة حين تستقر الميزة.
ومكان أدوات الذكاء الاصطناعي هو مرحلة الصياغة في كليهما: توليد حالات اختبار مرشحة من قصة أو مواصفة واجهة برمجية، واقتراح الحالات السلبية والحدّية، وصياغة سيناريوهات الانحدار لتغيير ما. إنها تختصر الكتابة؛ ويبقى اختيار ما يُحفظ والحكم الاستكشافي مع المختبِر.
الأسئلة الشائعة
هل يمكن للاختبار الآلي أن يحل محل الاختبار اليدوي؟
يحل محل الانحدار اليدوي المكتوب — تكرار فحوص معروفة يدوياً — وينبغي أن يفعل. ولا يستطيع أن يحل محل الاختبار الاستكشافي أو الحكم على قابلية الاستخدام أو مراجعة المتطلبات، لأن النص البرمجي لا يفحص إلا ما توقعه أحد. والفرق التي «أتمتت كل شيء» لديها عادة حزمة انحدار قوية وعدد متزايد من عيوب الإنتاج التي لم يكتب أحد نصاً لها.
ما النسبة المئوية للاختبارات التي ينبغي أتمتتها؟
لا توجد نسبة صحيحة؛ فالتقسيم يتبع المنتج. المنتج المستقر الغني بالواجهات البرمجية قد يشغّل 90% من فحوصه آلياً؛ والمنتج ذو واجهة المستخدم سريعة التغير والمكوّن القوي لقابلية الاستخدام قد يشغّل أقل بكثير. والسؤال الأفضل هو: هل كل فحص يعمل مع كل إصدار مؤتمت، وهل تحصل كل ميزة جديدة على اهتمام استكشافي.
هل الاختبار المولّد بالذكاء الاصطناعي يدوي أم آلي؟
لا هذا ولا ذاك — إنه مساعدة في تصميم الاختبار. تصوغ أداة الذكاء الاصطناعي حالات اختبار أو سيناريوهات أو تقارير عيوب من وصف؛ ويختارها الإنسان ويصححها، ثم تُنفَّذ إما يدوياً أو بالأتمتة كأي حالة أخرى.
أي أداة أتمتة ينبغي أن نستخدم؟
الأداة التي يستطيع مهندسوكم صيانتها. يدعم Selenium أوسع مجموعة من المتصفحات واللغات؛ وCypress وPlaywright أسرع في الكتابة والتصحيح لتطبيقات الويب الحديثة؛ ويغطي Appium تطبيقات الجوال الأصلية. وللواجهات البرمجية، لغة إطار اختبار المنتج نفسه هي الأفضل عادة. والأداة أقل أهمية من إبقاء الحزمة سريعة ومستقرة وصغيرة.
كيف نقيس ما إذا كان التقسيم صحيحاً؟
رقمان: الزمن من الإيداع إلى نتيجة الانحدار (ينبغي أن يكون دقائق)، وحصة عيوب الإنتاج التي كان يمكن لفحص آلي موجود أن يلتقطها (ينبغي أن تنخفض مع الوقت). إذا كان الأول طويلاً فالحزمة بطيئة جداً أو ثقيلة بواجهة المستخدم؛ وإذا كان الثاني مرتفعاً فالحزمة لا تغطي ما يهم.
المراجع
- ISTQB Certified Tester Foundation Level (CTFL) v4.0المنهج التأسيسي لاختبار البرمجيات: مستويات الاختبار وأنواعه وتقنيات تصميم الاختبارات وإدارة الاختبار والأدوات.
- Agile Testing: A Practical Guide for Testers and Agile Teams (Lisa Crispin, Janet Gregory)أرباع الاختبار الرشيق وكيف يعمل المختبرون داخل فريق التسليم — أساس «الاختبار في الطبقة الصحيحة».
- Explore It! Reduce Risk and Increase Confidence with Exploratory Testing (Elisabeth Hendrickson)منهج الاختبار الاستكشافي: المواثيق والاستدلالات لتنويع المدخلات والحالات، وكيف يكمّل الاختبارات المكتوبة.
- Lessons Learned in Software Testing: A Context-Driven Approach (Cem Kaner, James Bach, Bret Pettichord)دروس عملية في الإبلاغ عن الأخطاء وتصميم الاختبارات والأتمتة وإدارة الاختبار — مدرسة الاختبار المدفوع بالسياق.
- Selenium Documentationالتوثيق الرسمي لأتمتة المتصفح عبر WebDriver، بما فيه الانتظار والمحدِّدات وGrid.
- Cypress Documentationالتوثيق الرسمي لاختبار الويب الشامل واختبار المكونات في المتصفح باستخدام Cypress.
- Appium Documentationالتوثيق الرسمي لأتمتة التطبيقات الأصلية والهجينة وتطبيقات الويب على iOS وAndroid.
- GitLab CI/CDكيف تُعرَّف خطوط الأنابيب والمهام والمخرجات — حيث تعمل حزمة الانحدار الآلية عند كل تغيير.
تمرين عملي
قرّر ما يُؤتمت في إصدار حجز تذاكر السينما
أنت أحد المختبِرَين في منتج لحجز تذاكر السينما (مثال خيالي): تطبيق ويب وواجهة برمجية (REST API) تستخدمها تطبيقات الجوال أيضاً. يصدر الفريق إصداراً كل أسبوعين، وينضم مهندس أتمتة الشهر القادم، ويريد مدير المنتج أن يعرف ما الذي ينبغي أن يؤتمته المهندس أولاً. تعرض المادة أدناه حال خط الأنابيب وحزمة واجهة المستخدم الحالية، وقاعدة التسعير، وما يتغير في هذا الإصدار، وعشرة فحوص مرشّحة، وثلاثة أسئلة.
صنّف الفحوص العشرة بقاعدة الدليل — التكرار والحتمية والاستقرار — وبهرم الاختبار إلى: يُؤتمت الآن (على مستوى الوحدة أو الواجهة البرمجية أو واجهة المستخدم، ومتى يعمل)، أو يدوي مكتوب، أو جلسة استكشافية، أو لمرة واحدة، أو ليس بعد. اكتب سبباً في سطر واحد لكل فحص، ثم أجب عن الأسئلة الثلاثة. يكفي القلم والورق؛ ويساعدك مولّد القيم الحدّية في أحد الفحوص. خصّص لذلك 20–30 دقيقة.
حجز تذاكر السينما (مثال خيالي) - تطبيق ويب وواجهة REST API تستخدمها تطبيقات الجوال أيضاً
إصدار كل أسبوعين. الفريق: مختبِران و4 مطورين؛ وينضم مهندس أتمتة الشهر القادم.
خط الأنابيب: يشغّل GitLab CI اختبارات الوحدة التي كتبها المطورون مع كل إيداع (4 دقائق).
حزمة واجهة المستخدم اليوم: 38 فحصاً بـ Selenium، 55 دقيقة، تعمل ليلياً. ونحو مرة في
الأسبوع يحمرّ تشغيل دون عطل فعلي (مشكلة توقيت في فحص خريطة المقاعد)، ولا يعيد أحد تشغيله.
قاعدة التسعير PR-7 (لم تتغير منذ سنتين؛ تقرر API السعر وتعرضه واجهة المستخدم)
بالغ (من 13 إلى 64): 45.00 ريال. طفل (من 3 إلى 12): 25.00 ريال.
كبير السن (65 فأكثر): 30.00 ريال. دون 3 سنوات: مجاناً بلا مقعد.
الثلاثاء: كل تذكرة مدفوعة بـ 20.00 ريال.
في هذا الإصدار
جديد: «الحجز الجماعي» - من 6 إلى 20 مقعداً في طلب واحد. شاشاته ما زالت تتغير؛
وغيّر المصمم اختيار المقاعد الجماعي مرتين في هذا السبرنت. وفيما عدا خطوة
الدفع (أدناه) لا تتغير شاشات الحجز العادي.
تغيير: يُستبدل مزوّد الدفع في 15 أكتوبر؛ ويُوقف المزوّد القديم في اليوم نفسه.
موعد: «نهاية أسبوع الفيلم الضخم» في 24 أكتوبر - يفتح بيع تذاكر فيلم واحد الساعة 10:00
ويتوقع الفريق زواراً أكثر بكثير من يوم عادي.
الفحوص المرشّحة
K1 تسجيل الدخول، واختيار فيلم ومقعدين، والدفع ببطاقة اختبار، ورؤية رمز QR للتذكرة
K2 GET /api/screenings/{id}/seats يعيد خريطة المقاعد مع حالة كل مقعد
كما تصفها مواصفة OpenAPI
K3 سعر كل تركيبة من العمر واليوم يتبع القاعدة PR-7
K4 المقعد الذي يدفع عميل ثمنه لا يستطيع عميل ثانٍ حجزه
K5 منتقي المقاعد قابل للاستخدام على شاشة هاتف بعرض 320 بكسل ويُقرأ صحيحاً
بالعربية (RTL)
K6 الحجز الجماعي: اكتشف ما هو مربك أو معطّل قبل أن يصبح التصميم نهائياً
K7 بعد تبديل المزوّد في 15 أكتوبر، الطلبات المفتوحة الـ 1,214 كلها ما زالت موجودة
K8 الدفع يعمل على Chrome وFirefox وSafari وEdge، على حاسوب مكتبي وعلى هاتف
K9 يبقى الموقع مستجيباً عندما يصل 2,000 عميل الساعة 10:00 مع فتح بيع تذاكر الفيلم
K10 كل رسالة خطأ في صفحة الدفع مفهومة وتخبر العميل بما يفعله
الأسئلة
Q1 يقول مدير المنتج: «أتمتوا كل شيء، وعندها لن نحتاج إلى الاختبار اليدوي».
أجب في ثلاث جمل أو أربع.
Q2 أي رقمين تتابعهما لتعرف ما إذا كان التقسيم صحيحاً، وماذا ينبغي أن يفعل
كل منهما مع الوقت؟
Q3 ما الذي تغيّره في حزمة واجهة المستخدم الحالية، ولماذا؟- اقرأ المادة. ولكل فحص مرشّح أجب عن أسئلة القاعدة الثلاثة: هل سيعمل مرات كثيرة؟ وهل له نتيجة متوقعة محددة؟ وهل ما يختبره مستقر بما يكفي؟
- صنّف كل فحص — يُؤتمت الآن، أو يدوي مكتوب، أو جلسة استكشافية، أو لمرة واحدة، أو ليس بعد — مع سبب في سطر واحد. ولكل فحص تؤتمته، سمِّ المستوى (الوحدة أو الواجهة البرمجية أو واجهة المستخدم) ومتى يعمل: مع كل إيداع، أو ليلياً، أو قبل موعد محدد.
- حيث يجمع فحص بين جزء حتمي وجزء يعتمد على الحكم، افصل بينهما وقل أين يذهب كل جزء.
- أجب عن الأسئلة من Q1 إلى Q3.
إظهار الإجابة النموذجية
نظرة عامة. تُؤتمت ستة فحوص: K1 (واجهة المستخدم)، وK2 وK3 وK4 (الواجهة البرمجية)، وK8 (واجهة المستخدم على شبكة متصفحات)، وK9 (نص برمجي للحمل). تجتاز الخمسة الأولى الأسئلة الثلاثة كلها؛ أما K9 فلا يعمل إلا قبل موعد محدد وبعد التغييرات الخطرة، لكن اختبار الحمل لا يمكن أداؤه يدوياً أصلاً، فيُؤتمت حالما تُحدَّد له نتيجة متوقعة متفق عليها. وتبقى أربعة مع الإنسان: K5 وK10 حكم، وK6 استكشافي، وK7 يعمل مرة واحدة. و«ليس بعد» هو الجواب عن أتمتة الحجز الجماعي: تنتظر حتى يصبح التصميم نهائياً (انظر K6). ويقرر هرم الاختبار المستوى: يعيش الفحص في أدنى مستوى يمكن التعبير عنه فيه، لذلك K2 وK3 وK4 اختبارات واجهة برمجية لا تحتاج إلى اختبار واجهة مستخدم، ولا يشغّل متصفحاً من الفحوص المؤتمتة إلا K1 وK8. وإن اختلف تصنيفك فراجعه مقابل الأسباب أدناه؛ فالاختيار المختلف مع سبب مكتوب مقبول، أما الفحص المؤتمت «لأن ذلك ممكن» فغير مقبول.
K1: يُؤتمت على مستوى واجهة المستخدم، بوصفه الرحلة الشاملة الوحيدة في خط الأنابيب. يعمل مع كل تغيير في GitLab CI وقبل كل إصدار (التكرار)، وينتهي بنتيجة محددة (تذكرة برمز QR للمقعدين المختارين)، ولا تتغير شاشات الحجز في هذا الإصدار فيما عدا خطوة الدفع (الاستقرار). وستتغير خطوة الدفع مرة واحدة في 15 أكتوبر: خطّط لهذه الصيانة ليوم التبديل (بطاقة اختبار المزوّد الجديد وشاشاته) بدلاً من وصف المسار بعدم الاستقرار. وأبقِ النص البرمجي مقتصراً على الرحلة؛ فالأسعار وحالة المقاعد والتوافر تُفحص في مستوى أدنى.
K2: يُؤتمت على مستوى الواجهة البرمجية، مع كل إيداع. فطلب دقيق واستجابة دقيقة ومواصفة OpenAPI للمقارنة هي الهدف المثالي للأتمتة، وتطبيقات الجوال تعتمد على هذا العقد، فأي حقل أُعيدت تسميته أو حُذف يعطّلها يوم نشره. يستغرق الفحص ثوانيَ ومكانه بجانب اختبارات الوحدة في GitLab CI.
K3: يُؤتمت على مستوى الواجهة البرمجية، مبنياً على البيانات، مع كل إيداع؛ وليس اختبار واجهة مستخدم، لأن الواجهة البرمجية تقرر السعر ولا يفعل تطبيق الويب سوى عرضه. واختبار الوحدة الذي يكتبه المطورون لحساب السعر مستوى صحيح بالقدر نفسه، لأنه أدنى مستوى يمكن التعبير فيه عن القاعدة. فالقاعدة PR-7 لم تتغير منذ سنتين (الاستقرار)، والسعر المتوقع دقيق (الحتمية)، ويُفحص مع كل إصدار (التكرار). والصفوف هي الحدود بين الفئات العمرية ونوعا اليوم، والأسعار بالريال: في يوم غير الثلاثاء، العمر 2 ← مجاناً بلا مقعد، و3 ← 25.00، و12 ← 25.00، و13 ← 45.00، و64 ← 45.00، و65 ← 30.00؛ وفي يوم الثلاثاء الأعمار نفسها ← مجاناً، ثم 20.00 للخمسة الباقية. وأضف صفوفاً عند أطراف اليوم بالمنطقة الزمنية للسينما: الاثنين 23:59، والثلاثاء 00:00، والثلاثاء 23:59، والأربعاء 00:00. وقبل كتابة هذه النتائج المتوقعة اسأل مالك المنتج عن معنى «الثلاثاء»: أهو يوم العرض أم يوم الحجز؟ وسجّل الإجابة؛ فالفحص الذي لا نتيجة متوقعة محددة له ليس جاهزاً للأتمتة.
K4: يُؤتمت على مستوى الواجهة البرمجية، في حالتين: المقعد المحجوز بينما يدفع عميل ثمنه يُرفض لعميل ثانٍ (طلبان متتاليان)، وحجزان للمقعد نفسه يُرسلان في اللحظة نفسها ينتهيان بنجاح واحد ورفض واحد بالضبط (مثلاً 201 Created و409 Conflict). والنتيجة محددة وإن لم يكن التوقيت كذلك، والفحص مهم مع كل إصدار لأن المقعد المحجوز مرتين يكلّف استرداداً للمبالغ وثقةً. ويدوياً، لا يستطيع مختبِران بمتصفحين أن يجعلا نقرتيهما تقعان في الملّي ثانية نفسها، فتنجح الحالة الثانية دون أن يُختبر التزامن فعلاً؛ وتوليد طلبات متزامنة أتمتة بحكم التعريف. شغّله ليلياً أو مع كل إيداع في خدمة الحجز.
K8: يُؤتمت على مستوى واجهة المستخدم، ليلياً وقبل كل إصدار، لا مع كل إيداع. فهو رحلة K1 نفسها تُعاد على المتصفحات الأربعة، على حاسوب مكتبي وعلى هاتف، عبر شبكة متصفحات (browser grid) بأجهزة حقيقية أو محاكاة: نص برمجي واحد وثماني تهيئات. ويدوياً ستكون الرحلة نفسها مكررة ثماني مرات كل أسبوعين، وهو عمل متكرر وحتمي، أي ما ترسله القاعدة بالضبط إلى الأتمتة؛ ولأن K1 مؤتمت بالفعل، فالتكلفة الإضافية تهيئة لا كود جديد. وهو أبطأ من بقية الحزمة، ولذلك لا يوقف كل إيداع.
K9: يُؤتمت، بنص برمجي للحمل يرسل طلبات HTTP الخاصة بخريطة المقاعد وصفحة الدفع دون متصفح؛ فاختبار الحمل أتمتة بحكم التعريف، إذ لا يمكن إنتاج 2,000 عميل الساعة 10:00 يدوياً. يعمل قبل 24 أكتوبر ثم بعد أي تغيير في كود حجز المقاعد أو الدفع، على بيئة Staging بحجم بيئة الإنتاج، لا على الإنتاج، ولا يعمل أبداً على نظام لا يملكه الفريق، كمزوّد الدفع، دون إذن مكتوب. وأعطه نتيجة متوقعة محددة قبل تشغيله، مثلاً زمن الاستجابة ونسبة الأخطاء اللذين يقبلهما الفريق لخريطة المقاعد ولصفحة الدفع؛ وإلا أنتج أرقاماً بلا حكم.
K5: يدوي مكتوب، مع كل إصدار، على هاتف حقيقي بالإعدادات المحلية العربية. فعبارتا «قابل للاستخدام» و«يُقرأ صحيحاً من اليمين إلى اليسار» حكمان لا قيمة متوقعة تُقارَنان بها، فيخفق الفحص في الحتمية. اكتب قائمة تحقق قصيرة (تسميات المقاعد مقروءة، وأرقام المقاعد بترتيبها نفسه في قاعة العرض، والمقعد المختار ظاهر، والسعر في مكانه الصحيح) ليكون الفحص قابلاً للتكرار. ويمكن لمقارنة لقطات الشاشة لاحقاً أن تحرس التخطيط من التغييرات غير المقصودة، لكنها تُظهر فقط أن شيئاً تغيّر؛ أما كون النتيجة قابلة للاستخدام فيبقى حكماً للإنسان.
K6: جلسة استكشافية محددة الوقت ومبنية على ميثاق، مثلاً: «استكشف الحجز الجماعي من 6 إلى 20 مقعداً، بما في ذلك تغيير المقاعد والدفع، لاكتشاف السلوك المربك أو المعطّل»، في جلسة من 60–90 دقيقة مع ملاحظات. فلا نتيجة متوقعة محددة بعد، إذ لا يزال السلوك المتوقع قيد الاكتشاف، والشاشات غير مستقرة؛ فهذه هي الجولة الأولى على ميزة جديدة، وهي التي يعطيها الدليل للإنسان. وعندما يصبح التصميم نهائياً، اكتب الحالات الجديرة بالحفظ وسلّم المستقر منها إلى الأتمتة، وغالباً رحلة حجز جماعي واحدة بجانب K1.
K7: لمرة واحدة، يدوياً أو باستعلام يُستخدم مرة ثم يُهمل، وليس في الحزمة. يعمل مرة واحدة في 15 أكتوبر، فيخفق في التكرار، والنص البرمجي سيكلّف أكثر من الفحص نفسه. ومع ذلك أدِّه بعناية: سجّل معرّفات الطلبات الـ 1,214 قبل التبديل، وقارن القائمة، لا العدد وحده، بعده، واحفظ النتيجة مع ملاحظات الإصدار.
K10: مراجعة يدوية مكتوبة، مع فصل الجزء الحتمي عنها. فكون الرسالة مفهومة وتخبر العميل بما يفعله لا يمكن مقارنته بقيمة متوقعة؛ يقرأ المختبِر كل رسالة في سياقها، بالإنجليزية والعربية، مرة مع كل إصدار أو كلما تغيّر نص. أما الجزء الحتمي فيذهب إلى الأتمتة: أن تعيد الواجهة البرمجية رمز الخطأ المتفق عليه (فحص واجهة برمجية بجانب K2)، وأن تعرض كل حالة خطأ رسالة أصلاً (خطوة في رحلة واجهة المستخدم بجانب K1).
السؤال Q1. تحل الأتمتة محل الانحدار اليدوي المكتوب، أي تكرار فحوص معروفة يدوياً، وينبغي أن تفعل: K1 وK2 وK3 وK8 هي ذلك بالضبط، أما K9 وحالة التزامن في K4 فلا يمكن أداؤهما يدوياً أصلاً. ولا تستطيع أن تحل محل الاختبار الاستكشافي (K6)، ولا الحكم على قابلية الاستخدام والتوطين (K5 وK10)، ولا مراجعة المتطلبات، لأن النص البرمجي لا يفحص إلا ما توقعه أحد حين كُتب. والفريق الذي يؤتمت كل شيء ينتهي بحزمة انحدار قوية وعدد متزايد من عيوب الإنتاج التي لم يكتب أحد نصاً لها. أما الوعد الواقعي فمختلف: حين تحرس الحزمة ما يعمل بالفعل مع كل تغيير، ينتقل وقت المختبِرين إلى ما قبلها: المتطلبات، والميزات الجديدة، والجلسات الاستكشافية.
السؤال Q2. الأول: الزمن من الإيداع إلى نتيجة الانحدار، وينبغي أن يكون دقائق وأن ينخفض: اليوم تجيب اختبارات الوحدة خلال 4 دقائق لكن حزمة واجهة المستخدم تجيب صباح اليوم التالي، فالمطور الذي يكسر صفحة الدفع يعرف ذلك بعد يوم. والثاني: حصة عيوب الإنتاج التي كان يمكن لفحص آلي موجود أن يلتقطها، وينبغي أن تنخفض مع الوقت؛ فإن بقيت مرتفعة فالحزمة لا تغطي ما يهم مهما كانت خضراء.
السؤال Q3. أصلح فحص خريطة المقاعد المتذبذب (Flaky) أو احذفه هذا الأسبوع: فالحزمة التي تحمرّ مرة في الأسبوع دون عطل فعلي تدرّب الفريق على تجاهل الأحمر، وكون أحد لا يعيد تشغيلها يدل على أن ذلك حدث فعلاً. وراجع الفحوص الـ 38 وانقل كل فحص لقاعدة عمل، أي الأسعار وحالة المقاعد والتوافر، من المتصفح إلى مستوى الواجهة البرمجية حيث يعمل في ثوانٍ؛ فالقاعدة المختبَرة على مستوى الواجهة البرمجية لا تحتاج إلى اختبار واجهة مستخدم. وأبقِ في حزمة واجهة المستخدم الرحلات التي يمكن أن تفشل في واجهة المستخدم فقط، بدءاً بـ K1 ثم الحجز الجماعي لاحقاً، لتعمل في دقائق مع كل تغيير في GitLab CI بدلاً من مرة كل ليلة؛ ولا يبقى ليلياً إلا التشغيل على المتصفحات المتعددة (K8). وراجع الحزمة بحثاً عن التكرارات والفحوص الميتة كل ربع سنة، وأعطِ مهندس الأتمتة بقية هذه القائمة بهذا الترتيب عملاً لشهره الأول.
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.
جزء من مسار تعلم ضمان الجودة
قبل هذا الموضوع
الموضوعات التالية
الأدوات المذكورة في هذا الدليل
ولّد حالات اختبار منظّمة (المعرّف والعنوان والشروط المسبقة والخطوات والنتيجة المتوقّعة والأولوية) من وصف الميزة وقائمة الحقول.
ولّد سيناريوهات اختبار عالية المستوى تغطي الجوانب الوظيفية والسلبية والأمنية وسهولة الاستخدام والتوافق لأي ميزة.
ولّد سيناريوهات اختبار الانحدار من وصف التغيير وقائمة الوحدات المتأثرة والمرتبطة.
ولّد مجموعة اختبارات انحدار من وصف التغيير أو ملخّص الفروقات (diff) أو ملاحظات الإصدار باستخدام الذكاء الاصطناعي من متقن.
ولّد مصفوفة حالات اختبار منظّمة (إيجابية وسلبية ومصادقة وقيم حدّية) من مواصفة OpenAPI / Swagger.
حسّن حالات الاختبار الموجودة: خطوات أوضح، ونتائج متوقّعة أدق، وشروط مسبقة مفقودة، وبنية أفضل، باستخدام الذكاء الاصطناعي من متقن.
اعثر على حالات الاختبار المكرّرة والمتداخلة في مجموعة اختبار واحصل على توصيات الدمج من الذكاء الاصطناعي من متقن.
التحقق من مطابقة زوج طلب/استجابة API لعقد OpenAPI الخاص به: المسار والطريقة والمعاملات والجسم ومخطط الاستجابة.
ولّد سكربتات اختبار التزامن (k6 وJMeter JMX وLocust وArtillery وNode.js) بإعدادات افتراضية آمنة لنقطة نهاية مستهدفة.