فريق

هندسة ضمان الجودة

نحن الفريق الذي يجد العلّة التي كان سيجدها العميل — قبل أن يجدها العميل. كل مرشح إصدار يجري عبر مصفوفة سيناريوهات المسارات الحرجة تصيب المسار السعيد، وكل مسار خطأ معروف، والمسارات غير المستكشفة التي ولّدتها اختباراتنا الخصوصية طوال الليل. الإصدار الذي لا يجتاز الجودة لا يطلق؛ والإصدار الذي يطلق بلا انحدار معروف هو العقد الذي نوقّعه.

9/10

علل تُلتقط قبل الدمج

0

علل درجة أولى في الإنتاج

500+

سيناريوهات في مصفوفة المسارات الحرجة

4 × 2 × 2

متصفحات × لغات × سمات في كل طلب سحب

لماذا الجودة

الجودة انضباط لا مرحلة

الاختبار ليس خانة تأشير؛ بل رهان بأن النظام يفعل ما يدّعي، على المسار الذي يهمّ فعلًا، تحت الشروط التي تحدث فعلًا. نهندس ذلك الرهان: المسار السعيد أصغر جزء من عملنا، لأن المسار السعيد هو الذي اختبره المطوّر. قيمتنا تعيش على مسارات الأخطاء — الاتصال الساقط في منتصف موافقة، والكتابة الجزئية أثناء failover، وحد المنطقة الزمنية الذي يُهبط تسوية في عطلة — المسارات التي لم يختبرها المطوّر، وس يجدها العميل. نجري اختبارات خصوصية تطرق الثوابت عبر آلاف المدخلات العشوائية، ومزرعة أجهزة حقيقية تجري كل طلب سحب على عتاد عمره خمس سنوات عبر 3G مُقيَّدة، وميثاق استكشافي يتيح لمختبِر بشري قضاء ساعتين أسبوعيًا خارج النص. التغطية مؤشّر متأخر؛ والمصفوفة هي العقد.

نرفض الخرافة بأن «تغطية 100%» تعني «مُختبَر». سطر كود تغطيه اختبار لا يؤكد على شيء كذبة نحكيها لأنفسنا، ومسار حرج تغطيه فقط اختبار وحدة هو مسار ينكسر في الإنتاج حين تُفشل قاعدة البيانات الفشل في تجاوز. هرمنا الاختباري مقصود: قاعدة عريضة من اختبارات الوحدة السريعة تلتقط الانحدارات الواضحة في ثوانٍ؛ وطبقة وسطى من اختبارات التكامل تلتقط عدم تطابق العقود في دقائق؛ وقمة صغيرة كلفة من اختبارات نهاية-لنهاية تغطي تدفقات المسارات الحرجة التي تهمّ. الوصول بوابة إصدار لا فكرة لاحقة — مخالفات axe-core تفشل البناء، ومستخدم VoiceOver يكمل نفس الحوالة التي يكملها المبصر. وكل حادث إنتاج يفوتنا يصبح سيناريو جديدًا في المصفوفة؛ المصفوفة سجل حيّ لكل طريقة فاجأنا بها النظام، ولن نفاجأ بالطريقة نفسها مرتين.

ماذا نبني

العقد الذي يتيح للهندسة الإطلاق السريع دون إطلاق الخوف. هذا ما نملكه من النهاية إلى النهاية.

مصفوفة سيناريوهات المسارات الحرجة

أكثر من 500 سيناريو يغطي المسار السعيد، وكل مسار خطأ معروف، والمسارات غير المستكشفة التي ولّدتها اختباراتنا الخصوصية. تجري ضد كل مرشح إصدار قبل الترقية.

اختبارات خصوصية

ثوابت عبر آلاف المدخلات العشوائية — الخطأ بمقدار واحد، وحد التقريب، وتصادم المنطقة الزمنية الذي لم يفكر اختبار مكتوب بيد في كتابته.

مزرعة أجهزة حقيقية

كل طلب سحب يجري على عتاد عمره خمس سنوات عبر 3G مُقيَّدة، عبر أربعة متصفحات، ولغتين، وسمات. انحدار على جهاز منخفض النهاية يحظر الإصدار.

تدقيق الوصول

صفر مخالفات axe-core بوابة CI؛ وWCAG 2.2 AA حدّنا الأدنى. مستخدم VoiceOver يكمل نفس الحوالة التي يكملها المبصر، بنفس عدد النقرات.

ميثاقات استكشافية

ساعتان أسبوعيًا لكل مختبِر، خارج النص، يصطاد المسارات التي لا تراها الأتمتة. النتائج تُغذّي المصفوفة؛ وما يجده إنسان مرة يصبح سيناريو آليًا للأبد.

بوابات الإصدار

المصفوفة، واختبارات الخصوصية، وتدقيق الوصول، وميزانية الأداء — كلها خضراء، أو لا إطلاق. الإصدار الذي لا يجتاز الجودة لا يطلق، والتوقيع لنا.

كيف نعمل

حلقتنا سيناريو أولًا: المصفوفة هي المواصفة. هذه دورة واحدة من المواصفة إلى بوابة الإصدار.

1

حلّل المواصفة

يقرأ مهندسو الجودة المواصفة مع المطوّر قبل أن يُكتب الكود؛ نشترك في تأليف سيناريوهات القبول بـ Gherkin، فتبقى المواصفة قابلة للتنفيذ من اليوم الأول.

2

اكتب السيناريوهات

المسار السعيد، وكل مسار خطأ معروف، وكل حالة حدّية تقتضيها المواصفة. المصفوفة مسجَّلة في المستودع، مُراجَعة كالكود، وتجري في كل طلب سحب.

3

أتمت المسار السعيد

سيناريوهات نهاية-لنهاية تجري على مزرعة متصفحات حقيقية في كل طلب سحب؛ وانحدار في تدفق حرج يحظر الدمج، بصرف النظر عمّن أدخله.

4

اختبر الخصوصية للثوابت

اختبارات خصوصية تطرق الثوابت عبر آلاف المدخلات العشوائية؛ الخطأ بمقدار واحد وحد التقريب الذي لم يفكر اختبار مكتوب بيد في كتابته.

5

بحث استكشافي

ساعتان أسبوعيًا لكل مختبِر، خارج النص، يصطاد المسارات التي لا تراها الأتمتة. النتائج تصبح سيناريوهات جديدة في المصفوفة؛ وما يجده إنسان مرة يصبح آليًا للأبد.

6

وقّع أو احظر الإصدار

المصفوفة، واختبارات الخصوصية، وتدقيق الوصول، وميزانية الأداء — كلها خضراء، أو لا إطلاق. التوقيع لنا، وذراع الرجع لـ DevOps.

تعريف الجاهز

لا يُطلق الإصدار إلا حين يتحقق كل هذا

انحدار ملتقط

مصفوفة سيناريوهات المسارات الحرجة خضراء مقابل مرشح الإصدار، على أربعة متصفحات، ولغتين، وسمات.

حالات حدّية مغطاة

اختبارات الخصوصية طرقت الثوابت عبر آلاف المدخلات العشوائية؛ والخطأ بمقدار واحد وحد التقريب ملتقطان قبل الدمج.

وصول متحقَّق منه

صفر مخالفات axe-core، وعناوين VoiceOver وTalkBack مدمجة، والنوع الدينامي متحقَّق منه، وخطة اختبار قارئ الشاشة مكتملة دون مساعدة.

ثنائي اللغة متحقَّق منه

نص إنجليزي وعربي دُمج بمراجعين أصليين؛ وتخطيط RTL متحقَّق منه في المتصفح على جهاز منخفض النهاية، لا مفترض.

ميزانية أداء محقَّقة

أداء Lighthouse ≥ 90، وأول رسم محتوى تحت الميزانية، وزمن الاستجابة p99 داخل غلاف SLO — على جهاز منخفض النهاية عبر 3G مُقيَّدة.

الأدوات ولماذا نستخدمها

مُملّة عن قصد. اختيرت كل أداة لنمط فشلها لا لعرضها الترويجي.

Playwright

اختبار نهاية-لنهاية عبر المتصفحات على متصفح حقيقي؛ نثق بالاختبارات التي تُحمِّل التطبيق الفعلي لا كعبًا.

Maestro

اختبار نهاية-لنهاية للهاتف على مزرعة أجهزة حقيقية؛ عتاد عمره خمس سنوات عبر 3G مُقيَّدة؛ وانحدار على جهاز منخفض النهاية يحظر الإصدار.

fast-check

اختبارات خصوصية تطرق الثوابت عبر آلاف المدخلات العشوائية؛ الخطأ بمقدار واحد الذي لم يفكر اختبار مكتوب بيد في كتابته.

axe-core

تنقيط وصول آلي وبوابة CI؛ وصفر مخالفات يُفرَض قبل الدمج. مستخدم بلوحة المفاتيح فقط ضمن خطة الاختبار لا «تحسين إضافي».

k6

اختبارات حمل عند الذروة × 3 ببيانات واقعية؛ يبقى زمن الاستجابة p99 داخل غلاف SLO أو يفشل البناء.

Allure

تقارير اختبار تربط الفشل بالسيناريو والمدخل واللقطة — فيستطيع المطوّر إعادة الإنتاج بنقرتين.

BrowserStack / Firebase Test Lab

مزرعة أجهزة حقيقية عبر أربعة متصفحات، ولغتين، وسمات، على عتاد عمره خمس سنوات؛ وانحدار على جهاز منخفض النهاية يحظر الإصدار.

GitHub Actions matrix

كل طلب سحب يجري المصفوفة عبر المتصفحات واللغات والسمات وأصناف الأجهزة بالتوازي؛ والاختبار المُهتزّ يعيد ثلاثًا قبل أن يفشل البناء.

كيف نتواصل

حيث تلتقي الجودة ببقية الشركة

الواجهة الأمامية

نشترك في تأليف سيناريوهات القبول بـ Gherkin؛ والجودة يكتب التدفقات مقابل مكتبة المكوّنات لا تفرّع Cypress منفصل. وانحدار في تدفق حرج يحظر الدمج، بصرف النظر عمّن أدخله.

الأنظمة الخلفية

اختبارات الخصوصية والعقد تُكتب بالاشتراك؛ والجودة تملك مصفوفة سيناريوهات المسارات الحرجة التي تجري ضد كل مرشح إصدار. تغيير المخطط الذي يكسر سيناريو لا يُدمج.

الهاتف

تدفقات Maestro تجري على مزرعة الأجهزة الحقيقية في كل طلب سحب؛ والجودة تملك مصفوفة سيناريوهات المسارات الحرجة التي تجري ضد كل مرشح إصدار قبل بدء الإطلاق التدرّجي على المتجر.

DevOps

مجموعة اختبار التدفق الحرج تجري ضد كل مرحلة كناري قبل الترقية؛ والجودة تملك مصفوفة السيناريوهات، وDevOps يملك الإطلاق التدرّجي الذي يجريها. التوقيع لنا؛ وذراع الرجع لهم.

أسئلة تُطرح علينا

لماذا لا تطاردون تغطية 100%؟

التغطية مؤشّر متأخر. سطر يغطيه اختبار لا يؤكد على شيء كذبة نحكيها لأنفسنا؛ ومسار حرج يغطيه فقط اختبار وحدة هو مسار ينكسر في الإنتاج حين تُفشل قاعدة البيانات الفشل في تجاوز. نطارد المصفوفة لا النسبة.

ما اختبارات الخصوصية؟

اختبارات تذكر فيها ثابتًا ويرمي الإطار آلاف المدخلات العشوائية عليه. الخطأ بمقدار واحد، وحد التقريب، وتصادم المنطقة الزمنية الذي لم يفكر اختبار مكتوب بيد في كتابته — يجدها الإطار بمجرد الحجم.

هل ما زال الاختبار الاستكشافي موجودًا؟

نعم — ساعتان أسبوعيًا لكل مختبِر، خارج النص، يصطاد المسارات التي لا تراها الأتمتة. النتائج تُغذّي المصفوفة؛ وما يجده إنسان مرة يصبح سيناريو آليًا للأبد. لا نؤتمت قيمة الفضول البشري بعيدًا.

هل يمكن أن يطلق إصدار دون توقيع الجودة؟

لا. المصفوفة، واختبارات الخصوصية، وتدقيق الوصول، وميزانية الأداء كلها بوابات؛ وأيٌّ منها أحمر يحظر الإطلاق. التوقيع لنا، وذراع الرجع لـ DevOps.

ما الذي يحظر الإصدار تمامًا؟

انحدار في تدفق مسارات حرجة، أو مخالفة axe-core، أو انحدار أداء يتجاوز الميزانية، أو اختبار مُهتزّ لا يستقر في ثلاث إعادات، أو علة درجة أولى معروفة. ما عداه حوار؛ وهذه ليست كذلك.

مهمتنا

نجد العلّة التي كان سيجدها العميل، قبل أن يجدها العميل. نهندس الرهان بأن النظام يفعل ما يدّعي، على المسار الذي يهمّ فعلًا، تحت الشروط التي تحدث فعلًا — ولن نفاجأ بالطريقة نفسها مرتين، لأن كل حادث يفوتنا يصبح سيناريو في المصفوفة للأبد.