الاختبار باستخدام curl يختبر الشيء الخطأ
طلب العداد الذي يصل دون هوية متصفح يكتب في موضعين فقط من المواضع الاثني عشر التي تطالها الزيارة المحسوبة عادةً. يجيب بـ 200. ويعيد صورة عداد صالحة. ولا شيء في أي مكان يقول إن عشرة من الاثني عشر قد تُخطّيت.
ما الغرض من المرشّح، وما كلفته
تفصل العدادات هنا الروبوتات عن البشر، ويجري هذا الفصل على أساس الهوية التي يعلنها العميل عن نفسه. قائمة العلامات قصيرة وواضحة عن قصد، والكلمة curl/ مدرجة فيها. وكذلك الهوية الفارغة، على أساس أن الطلب الذي لا يحمل user agent على الإطلاق ليس متصفحًا.
وكلا الأمرين صحيح. فالخدمة لا تخطئ حين تعامل طلب curl المجرّد على أنه روبوت؛ فهذا ما هو عليه. المشكلة أن من يشغّل curl لا يختبر في العادة ما إذا كان كشف الروبوتات يعمل. إنه يختبر ما إذا كان العدّ يعمل، وقد طلب دون أن ينتبه مسار الروبوتات.
ما يحصل عليه: يرتفع إجمالي مشاهدات اليوم بواحد، ويرتفع عمود الروبوتات بواحد، وهذا كل شيء. لا صف للزائر الفريد، إذن لا شيء عن الزوار. لا إدخال في قائمة المتصلين الآن. لا صفحة، ولا بلد، ولا متصفح، ولا نظام تشغيل، ولا جهاز، ولا ساعة. أجزاء النظام التي قد يرغب أي أحد في فحصها فعلًا هي بالضبط الأجزاء التي لم تعمل.
الإخفاق بلا أعراض
هذا هو الجزء الذي يستحق التوقف عنده. الاختبار الذي لا يقيس شيئًا يكشف عن نفسه عادةً: خطأ، أو نتيجة فارغة، أو صفر حيث يجب أن يكون رقم. هنا الاستجابة 200. والمحتوى صورة عداد حقيقية، حجمها 3,361 بايتًا. بل إن الرقم في الصورة ارتفع، لأن إجمالي المشاهدات أحد الأمرين اللذين حدثا فعلًا.
لذلك يبدو الاختبار ناجحًا. وكل ما يُبنى عليه — «مسار العدّ يعمل»، «العمود الجديد يُكتب»، «التغيير لم يكسر شيئًا» — استنتاج مأخوذ من تشغيل تخطّى معظم الكود الذي كان يُفترض أن يمرّ به.
حدث ذلك أثناء كتابة هذا المقال
النسخة الأولى من القياس الذي يقوم عليه هذا المقال طلبت /c/<number>. وهذا ليس عنوان صورة عداد؛ فالعنوان الحقيقي يحمل التصميم وامتدادًا، /c/<number>-<design>.png. وأعاد الطلب 404.
طبع السكربت ثلاث مرات: يكتب في 0 من 12 موضعًا. وهذا صحيح، وهو أيضًا بالضبط ما سيبدو عليه مرشّح روبوتات يعمل للوهلة الأولى. كان الرمز 404 موجودًا في المخرجات، في الجدول نفسه، قبل الأصفار بصف واحد. وبقي دون أن يُقرأ دقيقة كاملة لأن الأصفار كانت الجزء المثير للاهتمام وكانت مطابقة للمتوقع.
إنه الخطأ نفسه الذي يتناوله هذا المقال، لكن في مستوى أعلى: قياس أعطى إجابة معقولة لسبب لم يتحقق منه أحد. ولم يُكتشف إلا لأن السكربت عدّ الصفوف في اثني عشر جدولًا بدلًا من الوثوق بالطلب — فالطلب الذي يفشل والطلب الذي يُرشَّح يبدوان متطابقين من الخارج.
ما الذي يجب فعله بدلًا من ذلك
أرسل هوية متصفح. خيار واحد، -A مع سلسلة user agent حقيقية، فيكتب الطلب نفسه في عشرة من المواضع الاثني عشر بدلًا من اثنين.
وعُدّ شيئًا على الجانب الآخر. رمز الاستجابة يقول إن الطلب وصل؛ ولا يقول شيئًا عمّا فعله الطلب. في كل ما يكون الغرض منه الأثر الجانبي — عداد، أو طابور، أو سطر في سجل، أو صف في مكان ما — يجب أن ينظر الاختبار إلى الأثر الجانبي. عدّ الصفوف قبل الطلب وبعده في كل الجداول المعنية استغرق هنا عشرين سطرًا، وحوّل نتيجة ملتبسة إلى نتيجة واضحة مرتين: مرة للمرشّح، ومرة للرمز 404.
بقي موضعان من الاثني عشر فارغين حتى مع هوية المتصفح: عمود الروبوتات، وهذا صحيح، وقائمة مصادر الإحالة، التي لم تسجّل مصدر الإحالة المُرسَل. أما الثاني فلا تفسير له هنا، لأنه لم يُتتبَّع بعد. ونذكره لأن البديل هو نشر جدول من أحد عشر صفًا والادعاء بأنها اثنا عشر.