كيف كان عليّ أن أصبح أتمتة صغيرة: ما شعرت به ، وبنيته المعمارية والبنية التحتية الرائعة والرائعة للاختبار التلقائي من خلال أعين مطور مرّ.
مقدمة
كما يقولون ، أنا لست طبيبة نساء ، لقد مشيت للتو وقررت أن أنظر. لذلك ، بالنسبة للمبتدئين ، سأقول عن أسباب الكتابة. يبدو لي أن أخصائيًا سيتعامل مع المشكلة بترتيب من حجمها أسرع ولن يجمع أكبر عدد من أشعل النار في طريقه. لكنه لن يكون مهتما مثلي ، ولن يكون لديك شيء تقرأه.
سبب آخر دفعني إلى الكتابة: لفترة طويلة لم أفهم ما الذي كان مميزًا جدًا بشأن البنية التحتية للاختبارات التلقائية. علاوة على ذلك ، لم يفهم الكثير من المديرين من PM وما فوقها تمامًا ما هو الكوني هناك ولماذا يكتب المطورون اختبارات وحدة لأحدهم أو اثنين ، وللمنافسين ، يتم أخذ اللاعبين الفرديين ، الذين يكتبون الاختبارات بشكل أبطأ ، ويقومون بإصلاح شيء باستمرار تكون فرصة اجتياز جميع المواصفات المالية أقل من 100٪ ، بشرط أن تكون العينة كبيرة بدرجة كافية.
المشكلة
في اليوم الثالث ، انخفضت المواصفات المشكلة في مشروع السكك الحديدية. قبل أسبوع من ذلك ، قرر مهندس الأتمتة الوحيد لدينا العمل في شيكاغو ولم نجد بعد أخصائيًا جديدًا. لذلك ، كان لا بد لي من نشمر عن سواعدي والتظاهر ليكون QA. حول كيف كان ومحاولة معرفة.
المشكلة تبدو غير ضارة جدا. ولكن بالنسبة للمبتدئين ، القليل من الخلفية ووصف البيئة. لدينا العديد من محددات العناوين في برنامجنا. بصراحة ، هذا هو واحد من الكيانات الرئيسية للمنصة. محددات الذهاب إلى جوجل api للبيانات. في الاختبارات التلقائية ، يتم إيقاف جميع الطلبات من أجل توفير الأموال وتسريع الاختبارات. بالإضافة إلى ذلك ، تمت إضافة القليل من المنطق لإعطاء نفس سطر العنوان المطلوب تقريبًا دون الانتقال إلى الخدمات الخارجية.
ما الذي تم كسره: نقوم بإدخال العنوان المطلوب في شريط العناوين ، ويظهر مربعًا منسدلًا به عدة خيارات ، ونختار العنوان المطلوب و ... يتم إدراج قيمة العنصر المجاور في الإدخال. دائما.
طريق طويل إلى الحقيقة
الفرضيات الأولى والنهج الساذج
بدون مزيد من اللغط ، قمت بأخذ أقرب اختبار للسقوط ، ووجدت السطر الذي تم اختيار العنوان منه ، وبدأت في فحصه بعناية والجيران. يبدو السطر غير ضار: new_order_page.destination_address.select(baker_street)
. لكننا نفهم أنه وراء الكود الجميل ، هناك دائمًا مجموعة من التصميمات الصغيرة الغريبة والأفكار غير السارة.
ذكرت بسرعة أن كل هذا الاقتصاد يعمل على SitePrism . هذا الشيء يجعل من الممكن لف الصفحة والعناصر الموجودة عليها في أساليب الفصل والطبقة ، على التوالي. بالنسبة للنقرات والإجراءات الأخرى ، فإن Capybara و RSpec مسؤولون. لكن ليس لديهم شك ، فهي موثوقة ، مثل الأسطول المدني بأكمله. وإذا كان الأمر كذلك ، فإن الفرضية الأولى تقترح نفسها على الفور: إما أن يقوم شخص ما بكتابة محددات سيئة للمنشور ، أو قام شخص ما بلف التصميم في المقدمة.
الجزء الأول من الفرضية اختفى بسرعة ، تتم كتابة محددات تماما. لم يتم xpath
مع اختيار li
الثالث داخل العنصر ولم يتغير الرمز نفسه في العام الماضي.
ومع ذلك ، في منطقة أسلوب select
، تراكمت المنطق مع regexps لتحديد الخيار المطلوب من القائمة المنسدلة. بالطبع ، أنا غاضب من regexps والذهاب للتحقق منها. أقضي نصف ساعة وأنا أفهم أن كل شيء يعمل بشكل جيد. بالضبط يتم تحديد الخط المطلوب. click
يسمى عليه. وكل شيء يجب أن تعمل. أي أن الجزء الثاني من فرضية التخطيط يختفي أيضًا. لكن الفكر يظهر حول منحنى js
. بعد كل شيء ، فإن العنصر الموجود في الصفحة التي لدينا هو مخصص ، js
حوله بالترتيب ، وعلاوة على ذلك ، في هذا js
تم ترقيعه مؤخراً.
شبيبة هو المسؤول
هذا هو السبب القياسي لجميع القضايا الغامضة. شيء من هذا القبيل "انتقل إلى js
، لأنه بالفعل صدمت قذيفة." ويبدو ، في حالتي ، لا يمكن الاستغناء عن js
. بشكل عام ، دون التفكير مرتين ، أركض إلى الفريق الأمامي وأوجه إصبعي إلى اختبارات السقوط ، قائلة "كل شيء يعمل من جانبنا ، يرجى إصلاح جانبكم".
لكن ، الرجال من داندي ليسوا ملكة جمال ، فهم يتجولون هناك لبضع ساعات ، ويجدون بعض الأخطاء التي لا تتعلق بالسرد ويقولون إن js
ليست مسؤولة! في الوقت نفسه ، يرمون معلومات مهمة تفيد بأن طلبًا واحدًا للاختيار لا يكفي وأنه يقدم طلبًا آخر ، وهو الجواب الذي يطابق تماماً محتويات الإدخال غير الصحيحة.
لم أكن أتوقع مثل هذا التحول. علينا أن نعود ونكتشف كيف يعمل نموذج الطلبات الزائفة بالنسبة لنا.
نهج شامل
لذلك ، لا يوجد مكان آخر ننتظر فيه المساعدة ، موسكو تقف وراءنا وأشياء من هذا القبيل.
بادئ ذي بدء ، نحن ننظر في طرق طلبات موكا لجوجل. بتعبير أدق ، أولاً نبحث عن مكان حدوث ذلك. هذه ليست مهمة تافهة. اتضح أن لدينا وحدة MockServices::Base
، وهي المسؤولة عن محاكاة الطلبات المختلفة باستخدام VCR . إنه راكع في وحدة التحكم الأساسية ، وبسبب اسم الخدمة المسؤولة عن الطلبات الخارجية ، لا يمكن العثور عليه.
حسنا ، وجدت موكي. الآن نحن ننظر إلى تنفيذها. يصبح الطلب الأول مبتلًا: يتم أخذ المعلومات من params
واستبدالها بالقالب مع الإجابة. فقط في حالة التحقق من محتويات params
، وكما هو متوقع ، هناك كل شيء يأتي كما يجب.
طريقة موكا للطلب التالي هي أكثر إثارة للاهتمام. يظهر نوع من mock_data
هناك. هذه ليست params
ونحن بحاجة لمعرفة من أين يأتي هذا التاريخ. بعد أن تراجعت بعمق خمس مرات ، تم الكشف عن أن هذه البيانات مأخوذة من RequestStore باستخدام المفتاح x_mock_data
. بالفعل أكثر إثارة للاهتمام.
نعود إلى الاختبار الأصلي ونلاحظ وجود شيء set_mock_header
، والذي يضيف ، عند الفحص الدقيق ، بعض البيانات إلى نفس RequestStore
. أكثر إثارة للاهتمام!
في مكان ما في هذه اللحظة ، يحدث تنافر إدراكي في الرأس: من ناحية ، إنه السبب المحتمل للمشكلة ، المتغيرات العالمية التي أعطانا طلب جانبي كسرها. ولكن هناك فارق بسيط: خادم المواصفات المالية والمواصفات المالية نفسها عمليتان مستقلتان (في الواقع ، يكون الخادم على الأقل 3 عمليات) ، وبالتالي ، لا يمكن أن يتقارب المدين مع الائتمان بأي شكل من الأشكال ، لأنه لم يتم إدخال أي متغيرات عالمية بين العمليات في هذا العالم حتى الآن. ومع خادم ويب متعدد الخيوط ، ستكون لعبة شرسة ، لن تنجح فعليًا. يعني أنا أجوف شيء وأنه من الضروري البحث.
نحن ننظر إلى أبعد من ذلك ونجد bm
معينة ، والتي وضعتها الرؤوس. تفضل وادرك أن bm
هو BrowserMob . بعد ذلك تعثرت قليلاً ، لأنه وكيل على Java في غلاف روبي. مجرد بيانو في الأدغال.
نبدأ في الانتقال إلى أبعد من ذلك ونفهم أنه بالنسبة للمتغيرات "العامة" بين العميل مع rspec
والخادم مع التطبيق (على سبيل المثال ، puma ) ، يتم استخدام رؤوس X-Mock-Data
في الطلب. المشكلة هي أن التطبيق لا ينبغي أن يعرف أي شيء عن هؤلاء القراء. لهذا الغرض ، تحتاج إلى وكيل من خلاله سيتم نقل جميع الطلبات والتي ستهتم بإعداد الرؤوس. ماكرة ، لن تقول أي شيء.
نذهب لاختبار ونكتشف أن هذا الشيء لا يعمل. لا يمكن رؤية الرؤوس: لا في الطلبات ولا في الردود. لكن RequestStore يتم ملؤها على جانب rspec
وفارغة على جانب خادم الويب. هذا يعني بالتأكيد - إنه في الوكيل.
بعد ذلك ، في ما بعد ، اتضح أننا لا set_mock_header
فقط العناوين التي set_mock_header
، ولكن أيضًا كل ما يستخدم set_mock_header
أعلاه.
ممتاز. يبقى أن نفهم كيفية إصلاح هذا.
نحن نتعامل مع وكيل
نحذف نقاط الحفر في المنطقة التي يتم فيها تشغيل ملف jar
ومن ثم التحكم فيه من خلال روبي. من الأفضل الانتباه إلى طريقة تحديد وكيل المتصفح. نستخدم Chrome ونمرر معلومات الوكيل في واحدة من الوسائط المتعددة لسطر الأوامر عند بدء تشغيله. ميزة البروكسي هي أننا نستخدم ملف pac
الذي نقوم بإنشائه من القالب بحيث لا يُسمح بحركة المرور من مآخذ الويب من خلال البروكسي.
في مكان ما هنا ، هناك رغبة في الذهاب إلى google وما هو موجود على Chrome باستخدام تهيئة الخادم الوكيل. اتضح أنه ليس عليك أن تذهب بعيدًا وفي الإصدار 72+ "انتهى" الرجال من عمله. في هذه المناسبة ، حتى أنهم جلبوا علة منفصلة . تعليقي المفضل:
"هل يمكنك التوقف عن إزالة وظيفة؟"
الحزن هو أنه يعتبر ميزة وفي المستقبل يعدون بمزيد من القصدير من حيث "السرية".
باختصار ، لم يعد Chrome يدعم file:
البروتوكول في وسيطة proxy-pac-url
. الحلول أفضل من الأخرى:
- قم بتمرير وسيطة
js
، والتي ستقوم بقراءة ملف pac
وتحويله إلى base64: --proxy-pac-url='data:application/x-javascript-config;base64,'$(base64 -w0 /path/to/pac/script)
؛ - قم برفع خادم الويب الخاص بك في بيثون من أجل توزيع ملف واحد وفقًا لبروتوكول "صحيح" أكثر ، وهو مدعوم في وسيطة
pac
proxy ؛ - قم بإيقاف تشغيل
NetworkService
ثم file:
يجب أن يعمل البروتوكول ، لكنهم يعدون أنه سيتم "إصلاح" في المستقبل أيضًا.
من المؤكد أن الخيارين الأولين لم يُلهمني ، والثالث ، الغريب ، ساعد.
فرحة قصيرة العمر
من دواعي سروري أن تم العثور على اتصال صعبة بين المنسدلة الخمول والكروم المحدثة ، لم أكن سعيدا لفترة طويلة. لقد اتضح أن CI قام بتحديث ليس فقط chrome ، ولكن أيضًا كل الحزم المجاورة ، والآن لدينا المزيد من الاختبارات التي Selenium::WebDriver::Error::NoSuchDriverError
بسبب خطأ غير معروف. مع التكوين الكروم ، إصدارات المكتبة وتنفيذ المواصفات الموازية.
ولكن هذه هي المهمة ليوم العمل التالي ...
التطلع إلى المستقبل: ساعد disable-dev-shm-usage
الوسيطة disable-dev-shm-usage
هناك.
النتائج
لا تأنيب الأتمتة. يبدو أنه يعاني أكثر من غيره من الظروف الخارجية المستقلة عنه.
من الأفضل أن تكون صديقًا لمهندس الأتمتة مع المطورين ، بحيث يقومون بتنظيم بنيتهم الأساسية مع تفضيل والمحظيات مع الإصدارات الثابتة وبيئة اختبار تسيطر عليها. بالنسبة لي ، هذا أفضل من المعاناة من CI المسجلة الملكية ، كل منها له عكازات متطورة للغاية ومقاعد تحت الماء ، والتي سوف تتعرف عليها فقط بعد الدمج الدقيق لتطبيقك واختباراتك مع بيئة شخص آخر.