أين يجب تشغيل كل اختبار في خط أنابيبك؟

تضغط على زر الدفع وتنتظر. تمر خمس دقائق. عشر دقائق. لا يزال خط الأنابيب قيد التشغيل. أخيرًا، يفشل — لكن الخطأ ناتج عن اختبار وحدة كان يجب أن يُنفَّذ في أول ثلاثين ثانية. لقد أهدرت للتو عشر دقائق من وقتك وموارد الحوسبة.

هذا هو التوتر الأساسي في تصميم خطوط الأنابيب: إذا أجريت اختبارات كثيرة جدًا في البداية، سينتظر المطورون وقتًا طويلاً للحصول على التغذية الراجعة. وإذا أجريت عددًا قليلاً جدًا، ستتسرب الأعطال الحرجة إلى بيئة التجهيز أو الإنتاج. الحل ليس تشغيل كل شيء في كل مكان، بل وضع كل نوع من الاختبارات في المرحلة التي يُحقق فيها أقصى قيمة بأقل تكلفة.

المبدأ: السريع والرخيص أولاً

القاعدة بسيطة: قم بتشغيل الاختبارات السريعة والرخيصة في البداية. وقم بتشغيل الاختبارات البطيئة والمكلفة لاحقًا، وفقط بعد اجتياز الاختبارات السابقة.

"رخيص" هنا يعني منخفض في وقت الحوسبة، وإعداد البيئة، وتحضير البيانات. اختبار الوحدة الذي يستغرق ميلي ثانية ولا يحتاج إلى قاعدة بيانات هو رخيص. اختبار النهاية إلى النهاية الذي يُشغِّل بيئة كاملة، ويُحمِّل البيانات، ويُحاكي رحلة مستخدم هو مكلف.

"سريع" يعني حلقة التغذية الراجعة. يجب أن يعرف المطور خلال دقيقة أو دقيقتين ما إذا كان تغييره قد كسر شيئًا أساسيًا. الانتظار ثلاثين دقيقة لاكتشاف خطأ منطقي أساسي غير مقبول.

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

مرحلة بمرحلة: أين تنتمي الاختبارات

مرحلة الالتزام: اختبارات الوحدة واختبارات العقود

يُلخِّص المخطط الانسيابي التالي التوزيع الموصى به للاختبارات عبر مراحل خط الأنابيب:

flowchart TD A[مرحلة الالتزام] --> B[مرحلة البناء] B --> C[مرحلة التجهيز] C --> D[مرحلة الإنتاج] A --> A1[اختبارات الوحدة] A --> A2[اختبارات العقود] B --> B1[اختبارات التكامل] B --> B2[اختبارات العقود] C --> C1[اختبارات النهاية إلى النهاية] C --> C2[اختبارات الدخان] D --> D1[اختبارات الدخان] D --> D2[المعاملات الاصطناعية]

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

تقوم بعض الفرق أيضًا بتشغيل اختبارات العقود في هذه المرحلة. إذا كان التغيير يمس واجهة أو عقد API، فإن التحقق منه مبكرًا يمنع المفاجآت في المراحل اللاحقة. اختبارات العقود عادةً ما تكون سريعة بما يكفي لتشغيلها جنبًا إلى جنب مع اختبارات الوحدة.

ما لا يجب تشغيله هنا: اختبارات التكامل، اختبارات النهاية إلى النهاية، أو أي اختبار يتطلب قاعدة بيانات، خدمة خارجية، أو بيئة كاملة. تلك تنتمي إلى مراحل لاحقة.

مرحلة البناء: اختبارات التكامل واختبارات العقود مرة أخرى

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

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

غالبًا ما تُجرى اختبارات العقود مرة أخرى هنا، ضد القطعة الأثرية المبنية. يضمن هذا أن الكود المترجم لا يزال يفي بالعقد، وليس فقط الكود المصدري.

مرحلة التجهيز: اختبارات النهاية إلى النهاية واختبارات الدخان

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

اختبارات النهاية إلى النهاية بطيئة ومكلفة. تشغيلها لكل تغيير بسيط يهدر الوقت. احتفظ بها للتغييرات التي تمس المسارات الحرجة أو تُقدم وظائف جديدة.

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

مرحلة الإنتاج: اختبارات الدخان والمعاملات الاصطناعية

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

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

ما لا يجب فعله

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

قاعدة جيدة: إذا اجتاز اختبار مرحلة سابقة، لا تكرره في مرحلة لاحقة إلا إذا كان تغيير البيئة قد يؤثر على النتيجة. اختبارات الوحدة لا تعتمد على البيئة، لذا لا تحتاج إلى التشغيل مرة أخرى. اختبارات الدخان تعتمد على النشر، لذا يجب تشغيلها في كل بيئة جديدة.

الاختبار القائم على المخاطر في خط الأنابيب

يعتمد وضع الاختبارات أيضًا على المخاطر. التغيير في نظام الدفع أو منطق المصادقة يستحق طبقات أكثر من الاختبارات. التغيير في لون زر أو خطأ مطبعي في تسمية يحتاج فقط إلى اختبارات وحدة واختبار دخان.

هذا هو الاختبار القائم على المخاطر المُطبق على خط الأنابيب: كلما زادت مخاطر التغيير، زادت طبقات الاختبار التي يجب أن يجتازها. وكلما انخفضت المخاطر، زادت سرعة تحركه عبر خط الأنابيب.

تقوم بعض الفرق بتنفيذ ذلك عن طريق وضع علامات على التغييرات أو استخدام سياسات الفروع. المسارات الحرجة تتطلب اختبارات النهاية إلى النهاية في بيئة التجهيز. المسارات غير الحرجة تتخطاها. هذا يُبقي خط الأنابيب سريعًا للتغييرات منخفضة المخاطر مع الحفاظ على الأمان للتغييرات عالية المخاطر.

قائمة مراجعة عملية لوضع الاختبارات

  • اختبارات الوحدة تُجرى في مرحلة الالتزام. سريعة، لا تبعيات، تغذية راجعة فورية.
  • اختبارات العقود تُجرى في مرحلة الالتزام والبناء. تحقق من الواجهات مبكرًا وضد القطعة الأثرية.
  • اختبارات التكامل تُجرى في مرحلة البناء. تتحقق من الاتصالات بالتبعيات باستخدام الحاويات أو البدائل الاختبارية.
  • اختبارات النهاية إلى النهاية تُجرى فقط في مرحلة التجهيز. تغطي رحلات المستخدم الحرجة، وليس كل ميزة.
  • اختبارات الدخان تُجرى في مرحلتي التجهيز والإنتاج. فحوصات سلامة سريعة بعد كل نشر.
  • المعاملات الاصطناعية تُجرى بشكل دوري في الإنتاج. تكتشف الانتكاسات بمرور الوقت.
  • لا تكرر الاختبارات عبر المراحل إلا إذا كان تغيير البيئة مهمًا.
  • اضبط طبقات الاختبار بناءً على المخاطر. التغييرات عالية المخاطر تحصل على تغطية أكبر.

الخلاصة

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