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