القائمة

واجهة برمجة صندوق بريد مؤقت للاختبارات الآلية: أنشئ، استقصِ، تحقق

استخدم واجهة برمجة صندوق بريد مؤقت في الاختبارات الآلية: أنشئ صندوقا عبر HTTP، واستقص رسالة التأكيد، واستخرج الرمز، ونظف في CI.

تاريخ النشر

  • الأتمتة
  • صندوق بريد اختباري
  • التكامل المستمر

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

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

لماذا نستخدم واجهة صندوق بريد في الاختبارات؟

لأن البديل إما صندوق بشري حقيقي وإما لا شيء.

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

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

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

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

ما نقاط النهاية التي يحتاجها الاختبار فعلا؟

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

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

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

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

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

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

كيف نستقصي الرمز دون تذبذب؟

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

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

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

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

كيف نوصله بمجموعة اختبارات الطرف إلى الطرف أو CI؟

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

اجعل العميل صغيرا وقابلا للحقن. فوحدة واحدة تغلف النداءات الأربعة، ويعتمد الاختبار على تلك الوحدة، لا على HTTP خام مبعثر في المجموعة. وهذا يتيح إحلال بديل في اختبارات الوحدة، وتوجيه المجموعة نفسها إلى مزود آخر دون إعادة كتابة التحققات.

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

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

والمسار المحيط بالرمز، لا ميكانيكا قراءته، يغطيه اختبار مسار التحقق من البريد، وخطوة التحليل تحديدا موضوع اختبار OTP في اختبارات الطرف إلى الطرف.

العزل والتنظيف

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

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

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

الحدود والتحفظات

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

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

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

الخطوات التالية

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

تابع القراءة

أدلة بريد مؤقت (بريد لمرة واحدة / بريد 10 دقائق)

أدلة بريد مؤقت (بريد لمرة واحدة / بريد 10 دقائق)

لا تُدرج هنا إلا المقالات المتعلقة بموضوع هذه الصفحة.