14 दिसंबर को सेंट पीटर्सबर्ग में एक रैली में, मैं (आर्टेम सोकॉइट्स), अपने सहयोगी दिमित्री मार्कोलोव के साथ मिलकर सेबरटेक में ऑटोटेस्ट के लिए मौजूदा बुनियादी ढांचे के बारे में बात की। हमारे भाषण की एक वापसी इस पोस्ट में है।

सेलेनियम क्या है
सेलेनियम एक वेब ब्राउज़र ऑटोमेशन टूल है। आज, यह उपकरण WEB स्वचालन के लिए मानक है।

विभिन्न प्रोग्रामिंग भाषाओं के लिए कई क्लाइंट हैं जो सेलेनियम वेबड्राइवर एपीआई का समर्थन करते हैं। वेबड्राइवर एपीआई के माध्यम से, जेएसएन वायर प्रोटोकॉल के माध्यम से, चयनित ब्राउज़र के ड्राइवर के साथ एक इंटरैक्शन होता है, जो बदले में, पहले से ही वास्तविक ब्राउज़र के साथ काम करता है, जो हमें आवश्यक क्रियाएं करता है।
आज, क्लाइंट का स्थिर संस्करण सेलेनियम 3. एक्स है।

साइमन स्टीवर्ट, वैसे,
सेलेनियमकोनफ जापान सम्मेलन में सेलेनियम 4.0 पेश करने का वादा किया था।
सेलेनियम जीआरआईडी
2008 में, फिलिप हनरिगू ने सेलेनियम जीआरआईडी को विभिन्न ब्राउज़रों के समर्थन के साथ ऑटोटेस्ट के लिए एक बुनियादी ढांचा बनाने की घोषणा की।

सेलेनियम जीआरआईडी में एक हब और नोड्स (नोड्स) होते हैं। नोड सिर्फ एक जावा प्रक्रिया है। यह हब के साथ एक ही मशीन पर हो सकता है, यह दूसरी मशीन पर हो सकता है, यह डॉकटर कंटेनर में हो सकता है। एक हब अनिवार्य रूप से ऑटोटेस्ट्स के लिए एक बैलेंसर है, जो उस नोड को निर्धारित करता है जिसमें किसी विशेष परीक्षण का निष्पादन भेजा जाना चाहिए। आप इससे मोबाइल एमुलेटर कनेक्ट कर सकते हैं।
सेलेनियम जीआरआईडी आपको विभिन्न ऑपरेटिंग सिस्टम और ब्राउज़रों के विभिन्न संस्करणों पर परीक्षण चलाने की अनुमति देता है। यह बड़ी संख्या में ऑटोटेस्ट चलाते समय भी महत्वपूर्ण रूप से बचाता है, यदि, निश्चित रूप से, ऑटोटेस्ट को मावेन-सर्फ-प्लगइन या अन्य समानांतरकरण तंत्र का उपयोग करके समानांतर में चलाया जाता है।
बेशक, सेलेनियम जीआरआईडी में इसकी कमियां हैं। मानक कार्यान्वयन का उपयोग करते समय, किसी को निम्नलिखित समस्याओं का सामना करना पड़ता है:
- हब और नोड का निरंतर पुनरारंभ। यदि हब और नोड का उपयोग लंबे समय तक नहीं किया जाता है, तो बाद के कनेक्शन के साथ, स्थिति संभव है जब, नोड पर एक सत्र बनाते समय, यह एक ही सत्र टाइमआउट में बंद हो जाता है। काम को बहाल करने के लिए, एक पुनरारंभ की आवश्यकता होती है;
- नोड्स की संख्या पर सीमा। भारी परीक्षण और ग्रिड सेटिंग्स पर निर्भर करता है। एक डफ के साथ नृत्य के बिना, यह कई दर्जन जुड़े हुए नोड्स के साथ धीमा करना शुरू कर देता है;
- अल्प कार्यक्षमता;
- सेवा के पूर्ण विराम के बिना अद्यतन करने की असंभवता।
SberTech पर प्रारंभिक ऑटोटेस्ट इन्फ्रास्ट्रक्चर
इससे पहले SberTech में UI-ऑटो परीक्षणों के लिए निम्न बुनियादी ढाँचा था। उपयोगकर्ता ने जेनकिन्स पर असेंबली शुरू की, जो प्लगइन का उपयोग करके, वर्चुअल मशीन को आवंटित करने के लिए ओपनस्टैक की ओर मुड़ गया। वीएम को एक विशेष "छवि" और वांछित ब्राउज़र के साथ चुना गया था, और उसके बाद ही इस वीएम पर ऑटोटेस्ट चलाया गया था।
यदि आप क्रोम या फ़ायर्फ़ॉक्स ब्राउज़रों में परीक्षण चलाना चाहते हैं, तो डॉकर कंटेनर बाहर खड़े थे। लेकिन जब IE के साथ काम करते हैं, तो आपको "साफ" वीएम उठाना पड़ता था, जिसमें 5 मिनट लगते थे। दुर्भाग्य से, इंटरनेट एक्सप्लोरर हमारी कंपनी में एक प्राथमिकता वाला ब्राउज़र है।

मुख्य समस्या यह थी कि IE में ऑटोटेस्ट्स चलाते समय इस दृष्टिकोण को बहुत समय लगता था। मुझे समय पर कम से कम कुछ कमी हासिल करने के लिए, परीक्षणों को अलग-अलग करना पड़ा और समानांतर में विधानसभाओं को शुरू करना पड़ा। हम आधुनिकीकरण के बारे में सोचने लगे।
नई अवसंरचना आवश्यकताएँ
स्वचालन, विकास और DevOps (Heisenbug, SQA Days, CodeOne, SeleniumConf और अन्य) पर विभिन्न सम्मेलनों का दौरा करते हुए, हमने धीरे-धीरे नए बुनियादी ढांचे के लिए आवश्यकताओं की एक सूची बनाई:
- प्रतिगमन परीक्षण चलाने के लिए समय कम करें;
- ऑटोटेस्ट्स के लिए एक एकल प्रवेश बिंदु प्रदान करें, जो स्वचालन विशेषज्ञ के लिए उनके डिबगिंग की सुविधा प्रदान करेगा। दुर्लभ मामले नहीं होते हैं जब सब कुछ स्थानीय रूप से काम करता है, और जैसे ही परीक्षण पाइपलाइन में आते हैं - निरंतर गिरता है।
- क्रॉस-ब्राउज़र संगतता और मोबाइल ऑटोमेशन (Appium- परीक्षण) प्रदान करने के लिए।
- बैंक के क्लाउड आर्किटेक्चर से चिपके रहते हैं: डॉक कंटेनर को ओपनशिफ्ट में प्रबंधित किया जाना चाहिए।
- मेमोरी और सीपीयू की खपत कम करें।
मौजूदा समाधानों का संक्षिप्त विवरण
कार्यों को परिभाषित करने के बाद, हमने बाजार पर मौजूदा समाधानों का विश्लेषण किया। हमने जिन मुख्य चीजों की जांच की,
उनमें एरोकोब टीम (
सेलेनॉइड एंड मून), अल्फलाब सॉल्यूशंस (अल्फा लेबोरेटरी),
जेडब्ल्यू-ग्रिड (एविटो) और
ज़लेनियम के उत्पाद थे ।
सेलेनॉइड का मुख्य नुकसान ओपनशिफ्ट (कुबेरनेट्स पर एक आवरण) के लिए समर्थन की कमी थी। अल्फलाब निर्णय के बारे में हैबे
पर एक लेख है । यह वही सेलेनियम ग्रिड निकला।
लेख में एविटो के समाधान का वर्णन किया गया है। हमने हाइजेनबग सम्मेलन में इस पर रिपोर्ट देखी। यह भी विपक्ष था कि हमें पसंद नहीं था। ज़लेनियम एक खुला स्रोत परियोजना है, बिना समस्याओं के भी।
हमारे द्वारा विचार किए गए समाधानों के पेशेवरों और विपक्षों को तालिका में संक्षेपित किया गया है:

नतीजतन, हमने एयरोक्यूब - सेलेनॉइड के एक उत्पाद का विकल्प चुना।
सेलेनॉइड बनाम चंद्रमा
चार महीने के लिए, हमने सेलेनबेड इकोसिस्टम को स्वचालित करने के लिए सेलेनॉइड का उपयोग किया। यह एक अच्छा समाधान है, लेकिन बैंक OpenShift की ओर बढ़ रहा है, और OpenShift में Selenoid को तैनात करना कोई तुच्छ कार्य नहीं है। सूक्ष्मता यह है कि कुबेरनेट्स में सेलेनॉइड उत्तरार्द्ध के कर्ता को नियंत्रित करता है, और कुबेरनेट्स इसके बारे में कुछ भी नहीं जानते हैं और अन्य नोड्स को सही ढंग से मजाक नहीं कर सकते हैं। इसके अलावा, कुबेरनेट्स में सेलेनॉइड को एक जीजीआर (गो ग्रिड राउटर) की आवश्यकता होती है जिसमें लोड संतुलन लंगड़ा होता है।
सेलेनॉइड के साथ प्रयोग करने के बाद, हमें भुगतान किए गए चंद्रमा उपकरण में रुचि हो गई, जो विशेष रूप से कुबेरनेट्स के साथ काम करने पर केंद्रित है और मुफ्त सेलेनॉइड की तुलना में कई फायदे हैं। यह अब दो साल के लिए विकसित हो रहा है और आपको देवेन इंजीनियरों पर पैसा खर्च किए बिना सेलेनियम परीक्षण यूआई के लिए बुनियादी ढांचे को तैनात करने की अनुमति देता है, जिन्हें कुबेरनेट्स में सेलेनॉइड को तैनात करने के बारे में गुप्त ज्ञान है। यह एक महत्वपूर्ण लाभ है - परीक्षण चलाने के दौरान डाउनटाइम और क्षमता को कम किए बिना सेलेनॉइड क्लस्टर को अपग्रेड करने का प्रयास करें?

चंद्रमा एकमात्र विकल्प नहीं था। उदाहरण के लिए, आप ऊपर वर्णित ज़लेनियम ले सकते हैं, लेकिन वास्तव में यह वही सेलेनियम ग्रिड है। हब के अंदर सत्रों की एक पूरी सूची है जो उसके अंदर संग्रहीत है, और यदि हब क्रैश हो जाता है, तो परीक्षण समाप्त हो जाते हैं। इस पृष्ठभूमि के खिलाफ, चंद्रमा इस तथ्य के कारण जीतता है कि इसकी आंतरिक स्थिति नहीं है, इसलिए इसके प्रतिकृतियों में से एक का पतन आमतौर पर अस्वीकार्य है। चंद्रमा के पास सब कुछ "सुशोभित" है - इसे सत्र के अंत की प्रतीक्षा किए बिना, निर्भय रूप से फिर से शुरू किया जा सकता है।
ज़लेनियम की अन्य सीमाएँ हैं। उदाहरण के लिए, यह कोटा का समर्थन नहीं करता है। आप लोड बैलेंसर के लिए इसकी दो प्रतियां नहीं रख सकते, क्योंकि वह नहीं जानता कि दो या अधिक "हेड" के बीच अपने राज्य को कैसे वितरित किया जाए। और सामान्य तौर पर, उसके क्लस्टर पर शुरू करना मुश्किल है। ज़लेनियम डेटा को संग्रहीत करने के लिए PersistentVolume का उपयोग करता है: लॉग और रिकॉर्ड किए गए वीडियो परीक्षण, लेकिन यह मुख्य रूप से बादलों में डिस्क की चिंता करता है, और अधिक दोष-सहिष्णु S3 नहीं।
ऑटो टेस्ट इन्फ्रास्ट्रक्चर
चंद्रमा और ओपनशिफ्ट का उपयोग करने वाला मौजूदा बुनियादी ढांचा इस प्रकार है:

उपयोगकर्ता स्थानीय रूप से और सीआई सर्वर (हमारे मामले में, जेनकिंस, लेकिन अन्य भी हो सकता है) का उपयोग करके दोनों परीक्षण चला सकता है। दोनों ही मामलों में, हम OpenShift का उपयोग करने के लिए RemoteWebDriver का उपयोग करते हैं, जिसमें कई मून प्रतिकृतियों वाली सेवा तैनात की जाती है। इसके अलावा, अनुरोध जिसमें हमें जिस ब्राउज़र की आवश्यकता होती है, उसे चंद्रमा में संसाधित किया जाता है, जिसके परिणामस्वरूप कुबेरनेट्स एपीआई इस ब्राउज़र के साथ चूल्हा बनाने की पहल करता है। फिर चंद्रमा सीधे कंटेनर को अनुरोध करता है, जहां परीक्षण पास होते हैं।
रन के अंत में, सत्र समाप्त होता है, के तहत हटाए जाते हैं, संसाधनों को मुक्त किया जाता है।
Internet Explorer लॉन्च करें
बेशक, कुछ कठिनाइयाँ थीं। जैसा कि पहले उल्लेख किया गया है, हमारे लिए लक्ष्य ब्राउज़र इंटरनेट एक्सप्लोरर है - हमारे अधिकांश एप्लिकेशन ActiveX घटकों का उपयोग करते हैं। चूंकि हम ओपनशिफ्ट का उपयोग करते हैं, हमारे डॉकटर कंटेनर रेडहैट एंटरप्राइज लिनक्स पर चलते हैं। इस प्रकार, यह सवाल उठता है: डॉकटर कंटेनर में इंटरनेट एक्सप्लोरर कैसे शुरू करें जब मेजबान मशीन लिनक्स पर है?
मून डेवलपमेंट टीम के लोगों ने इंटरनेट एक्सप्लोरर और माइक्रोसॉफ्ट एज को लॉन्च करने के अपने फैसले को साझा किया।
इस समाधान का नुकसान यह है कि डॉकर कंटेनर को विशेषाधिकार प्राप्त मोड में चलना चाहिए। इसलिए, परीक्षण शुरू करने के बाद इंटरनेट एक्सप्लोरर के साथ कंटेनर को शुरू करने में 10 सेकंड लगते हैं, जो पिछले बुनियादी ढांचे का उपयोग करने की तुलना में 30 गुना तेज है।
समस्या निवारण
अंत में, हम आपके साथ क्लस्टर की तैनाती और कॉन्फ़िगरेशन के दौरान आई कुछ समस्याओं का समाधान साझा करना चाहेंगे।
पहली समस्या सेवा चित्रों का वितरण है। जब चंद्रमा ब्राउज़र के निर्माण की पहल करता है, तो ब्राउज़र के साथ कंटेनर के अलावा, हम अतिरिक्त सर्विस कंटेनर लॉन्च करते हैं - एक लकड़हारा, एक रक्षक, एक वीडियो रिकॉर्डर।

यह सब एक पॉड में लॉन्च किया गया है। और अगर इन कंटेनरों की छवियों को नोड्स पर कैश नहीं किया जाता है, तो उन्हें डॉकटर हब से वितरित किया जाएगा। इस स्तर पर, हमारे लिए सब कुछ गिर गया, क्योंकि आंतरिक नेटवर्क का उपयोग किया गया था। इसलिए, एरोक्यूब के लोग जल्दी से इस सेटिंग को मैप कॉन्फिगर में डाल देते हैं। यदि आप एक आंतरिक नेटवर्क का उपयोग करते हैं, तो हम आपको सलाह देते हैं कि आप इन चित्रों को अपनी रजिस्ट्री में प्रवाहित करें और उन्हें चाँद-विन्यास मानचित्र में पथ निर्दिष्ट करें। Service.json फ़ाइल में, आपको चित्र अनुभाग जोड़ना होगा:
"images": { "videoRecorder": "ufs-selenoid-cluster/moon-video-recorder:latest", "defender": "ufs-selenoid-cluster/defender:latest", "logger": "ufs-selenoid-cluster/logger:latest" }
परीक्षणों की शुरुआत में पहले से ही निम्न समस्या की पहचान की गई थी। संपूर्ण बुनियादी ढांचा गतिशील रूप से बनाया गया था, लेकिन परीक्षण निम्नलिखित त्रुटि के साथ 30 सेकंड के बाद दुर्घटनाग्रस्त हो गया:
Driver info: org.openqa.selenium.remote.RemoteWebDriver Org.openqa.selenium.WebDriverException: <html><body><h1>504 Gateway Time-out</h1> The server didn't respond in time.
ऐसा क्यों हुआ? तथ्य यह है कि RemoteWebDriver के माध्यम से परीक्षण शुरू में रूटिंग परत OpenShift को संदर्भित करता है, जो बाहरी वातावरण के साथ बातचीत के लिए जिम्मेदार है। इस परत की भूमिका हाप्रोसी है, जो उन कंटेनरों के अनुरोधों को पुनर्निर्देशित करती है जिनकी हमें आवश्यकता है। व्यवहार में, परीक्षण इस परत में बदल गया, यह हमारे कंटेनर में पुनर्निर्देशित किया गया, जो कि एक ब्राउज़र बनाने वाला था। लेकिन वह इसे नहीं बना सका, क्योंकि संसाधन बाहर भाग गए थे। इसलिए, परीक्षण कतार में चला गया, और 30 सेकंड के बाद प्रॉक्सी सर्वर ने इसे टाइमआउट द्वारा गिरा दिया, क्योंकि डिफ़ॉल्ट रूप से यह इस समय अंतराल था।

इसे कैसे हल करें? सब कुछ काफी सरल निकला - आपको बस हमारे कंटेनर के राउटर के लिए haproxy.router.openshift.io/timeout एनोटेशन को फिर से परिभाषित करना था।
$oc annotate route moon --overwrite haproxy.router.openshift.io/timeout=10m
अगला मामला एस 3 संगत भंडारण के साथ काम करता है। चंद्रमा ब्राउज़र के साथ कंटेनर में क्या होता है रिकॉर्ड करने में सक्षम है। एक नोड पर, सेवा कंटेनर ब्राउज़र के साथ बढ़ते हैं, जिनमें से एक वीडियो रिकॉर्डर है। यह कंटेनर में होने वाली हर चीज को रिकॉर्ड करता है और सत्र के अंत के बाद एस 3 संगत भंडारण के लिए डेटा भेजता है। इस तरह के भंडारण के लिए डेटा भेजने के लिए, आपको सेटिंग्स में url, टर्नआउट पासवर्ड और टोकरी का नाम निर्दिष्ट करना होगा।
ऐसा लगता है कि सब कुछ सरल है। हमने डेटा दर्ज किया और परीक्षण चलाना शुरू किया, लेकिन रिपॉजिटरी में कोई फाइल नहीं थी। लॉग का विश्लेषण करने के बाद, हमने महसूस किया कि क्लाइंट सर्टिफिकेट की कमी पर S3 के साथ बातचीत करता था, क्योंकि url फील्ड में हमने एड्रेस को S3 के साथ https निर्दिष्ट किया था। समाधान असुरक्षित http मोड निर्दिष्ट करने या कंटेनर में अपने प्रमाणपत्र जोड़ने के लिए है। बाद वाला विकल्प अधिक कठिन है यदि आपको नहीं पता कि कंटेनर में क्या है और यह सब कैसे काम करता है।
और अंत में ...
प्रत्येक ब्राउज़र कंटेनर को स्वतंत्र रूप से कॉन्फ़िगर किया जा सकता है - सभी उपलब्ध पैरामीटर चंद्रमा प्रलेखन में हैं। आइए विशेषाधिकार प्राप्त और नोड्सिलेटर जैसे कस्टम सेटिंग्स पर ध्यान दें।
इसके लिए उनकी जरूरत है। इंटरनेट एक्सप्लोरर के साथ एक कंटेनर, जैसा कि ऊपर उल्लेख किया गया है, केवल विशेषाधिकार प्राप्त मोड में चलना चाहिए। इस तरह के कंटेनरों को सेवा खाते में लॉन्च करने के अधिकारों के जारी करने के साथ विशेषाधिकार प्राप्त ध्वज द्वारा आवश्यक मोड में संचालन प्रदान किया जाता है।
अलग-अलग नोड्स पर चलने के लिए, आपको नोडसेंटर को पंजीकृत करना होगा:
"internet explorer": { "default": "latest", "versions": { "latest": { "image": "docker-registry.default.svc:5000/ufs-selenoid-cluster/windows:7", "port": "4444", "path": "/wd/hub", "nodeSelector": { "kubernetes.io/hostname": "nirvana5.ca.sbrf.ru" }, "volumes": ["/var/lib/docker/selenoid:/image"], "privileged": true } } }
अंतिम टिप। चालू सत्रों की संख्या पर नज़र रखें। हम Grafana में सभी लॉन्च प्रदर्शित करते हैं:

हम कहां जाएं
हम मौजूदा बुनियादी ढांचे में सब कुछ से संतुष्ट नहीं हैं, और समाधान अभी तक पूरा नहीं कहा जा सकता है। निकट भविष्य में, हम डॉक में IE को स्थिर करने की योजना बनाते हैं, चंद्रमा में एक "समृद्ध" यूआई इंटरफ़ेस प्राप्त करते हैं, और मोबाइल ऑटोटिस्ट्स के लिए ऐपियम का भी परीक्षण करते हैं।