स्थिर एंड-टू-एंड (E2E) परीक्षणों के लिए, हमें एक ऐसे वातावरण की आवश्यकता है जो यथासंभव बाहर से अलग-थलग हो।
परतदार परीक्षण वे परीक्षण होते हैं जो आपके कोड से असंबंधित कारणों से विफल हो जाते हैं। वे एप्लिकेशन की शुद्धता के लिए एक विश्वसनीय जांच के रूप में E2E का उपयोग करना कठिन बनाते हैं। अत्यधिक मामलों में, परतदार परीक्षण आपकी टीम को E2E परिणामों की उपेक्षा करना सिखाएगा। यह गुणवत्ता नियंत्रण (क्यूए) को स्वचालित करने के प्रयास को खत्म कर सकता है।
यहां प्रस्तुत दृष्टिकोण आपके टेस्ट रन में संभावित मुद्दों के दो बड़े स्रोतों को संबोधित करता है:
इस दृष्टिकोण से अप्रभावित चंचलता के अन्य स्रोत हैं:
इससे पहले कि मेरी टीम और मैंने एक समर्पित बैकएंड कंटेनर के खिलाफ अपने परीक्षण चलाए, हमने अपने गैर-उत्पादन सर्वरों में से एक का उपयोग किया। यह दृष्टिकोण हमारे E2E समाधान के प्रयोग चरण में ठीक था।
जब कुछ ही परीक्षण होते थे, तब भी हम निर्णय लेने के लिए परीक्षण के परिणामों का उपयोग नहीं कर सकते थे।
हालाँकि, जैसे-जैसे हमने और अधिक परीक्षण जोड़ना जारी रखा और लंबे समय तक निष्पादन समय उत्पन्न किया, यह दृष्टिकोण अलग होने लगा। मुख्य मुद्दे इस प्रकार थे:
इस समस्या का समाधान प्रत्येक परीक्षण कार्य के लिए एक अलग बैकएंड सर्वर और डेटाबेस समर्पित करना था। यदि यह डॉकर के लिए नहीं होता तो यह दृष्टिकोण बहुत चुनौतीपूर्ण होता।
डॉकर कंटेनर चलाने के लिए एक एप्लिकेशन द्वारा आवश्यक सभी चीजों के साथ एक निहित वातावरण बनाने के लिए एक आदर्श उपकरण है:
अपने परीक्षण के लिए, आप एक समर्पित डेटाबेस कंटेनर तैयार कर सकते हैं जो अनुमानित परीक्षण डेटा के साथ आता है। इस तरह, आप प्रत्येक E2E निष्पादन में सटीक रूप से शुरुआती बिंदु को पुन: पेश करने में सक्षम होंगे—जिससे आपके परीक्षण और अधिक स्थिर हो जाएंगे।
परीक्षण डेटाबेस के संस्करण के लिए आप अपनी डॉकर छवि के लिए विभिन्न टैग का उपयोग कर सकते हैं। उसी परीक्षण डेटाबेस का उपयोग विकास के वातावरण में भी किया जा सकता है। विकास में मैन्युअल परीक्षणों के लिए, आपको स्वचालित परीक्षणों के समान उदाहरण निकायों की आवश्यकता होगी।
यदि आप अपने बैकएंड को तैनात करने के लिए पहले से ही डॉकर का उपयोग कर चुके हैं, तो अपने E2E को चलाने के लिए उसी छवि का पुन: उपयोग करना बहुत आसान होगा। मेरी टीम में, हम एक बैकएंड को कंटेनर के रूप में तैनात करते हैं, और हम पर्यावरण चर के रूप में डेटाबेस URL और क्रेडेंशियल्स प्रदान करते हैं।
उसी कंटेनर संस्करण को उत्पादन में तैनात किया जा सकता है या परीक्षण चलाने के लिए निरंतर एकीकरण (CI) में उपयोग किया जा सकता है - प्रत्येक वातावरण DB से जुड़ने के लिए सही मान प्रदान करता है।
आपकी परिनियोजन रणनीति के आधार पर, आप निम्न में से कोई एक कार्य कर सकते हैं:
आपके द्वारा निर्मित कंटेनरों का उपयोग फ्रंटएंड बिल्ड के एक भाग के रूप में करें।
संकलित फ़ाइलें प्राप्त करें और सुनिश्चित करें कि वे परीक्षणों के लिए HTTP के माध्यम से उपलब्ध हैं।
हमारे मामले में, हम विकल्प 2 का उपयोग करते हैं: हम एप्लिकेशन को स्थिर फ़ाइलों के रूप में परिनियोजित करते हैं, इसलिए हमने E2E जॉब रन के दौरान निर्मित फ़ाइलों की सेवा के लिए एक समर्पित कंटेनर बनाया है।
हम अपने CI को चलाने के लिए GitLab को एक प्लेटफॉर्म के रूप में उपयोग करते हैं। GitLab में प्रत्येक कार्य आपकी पसंद की छवि के साथ एक कंटेनर के अंदर चलाया जाता है। मुख्य कंटेनर के अलावा, आप सेवाओं को परिभाषित कर सकते हैं: आपके परीक्षणों के साथ चलने वाले अतिरिक्त कंटेनर। कॉन्फ़िगरेशन उतना आसान है जितना:
<job-name>: services: - name: <image> alias: <container-url>
उपलब्ध विकल्प डॉकर कंपोज़ के समान हैं, लेकिन वे अधिक सीमित हैं।
यदि आप टेस्ट रन के दौरान सेवाओं को एक-दूसरे तक पहुंचने की अनुमति देना चाहते हैं, तो GitLab कॉन्फ़िगरेशन में एक "गोचा" चर FF_NETWORK_PER_BUILD
को 1 पर सेट करना है।
किसी बिंदु पर, हम एक ही काम के अंदर समानांतर में सभी परीक्षण चला रहे थे। उस समय, और भी मजबूत अलगाव को लागू करना आवश्यक था - प्रत्येक परीक्षण एक ही बैकएंड और डेटाबेस का उपयोग कर रहा था।
इस समस्या को हल करने के लिए, हमने अपने परीक्षणों को प्राथमिक रूप से उन यादृच्छिक डेटा पर निर्भर करने के लिए अपग्रेड किया है जिन्हें हम परीक्षणों के before
अनुभाग के अंदर इंजेक्ट करते हैं। इसने परीक्षणों को अन्य धागों में होने वाले अन्य परिवर्तनों से अप्रभावित चलने की अनुमति दी।
यह तरीका पहली बार में थोड़ा मुश्किल हो सकता है, लेकिन यह आपकी परिस्थितियों के आधार पर समझ में आ सकता है।
भले ही हम प्रत्येक परीक्षण कार्य के लिए एक नया डेटाबेस शुरू करते हैं, हम अभी भी कोशिश कर रहे हैं कि हमारे परीक्षण एप्लिकेशन को उसी स्थिति में छोड़ दें, जैसा उन्होंने पाया था। हो सकता है कि यह उस समय से थोड़ा बचा हुआ हो जब हम एक साझा वातावरण में परीक्षण चला रहे थे।
यह अब महत्वपूर्ण नहीं है, लेकिन यह अभी भी निम्नलिखित मामलों में परीक्षण के विकास के दौरान मदद कर सकता है:
ऐसे मामले हैं जब सेवाओं को एक कंटेनर में ले जाना कोई विकल्प नहीं है। उदाहरण के लिए:
दोनों ही मामलों में, टेस्ट रन को अलग करने के लिए, आप उन सेवाओं पर जाने वाले अनुरोधों का मज़ाक उड़ा सकते हैं। यह अप्रत्याशित बाहरी सेवाओं को आपके परीक्षा परिणामों को प्रभावित करने से रोकेगा। इस दृष्टिकोण का नकारात्मक पक्ष यह है कि आपके परीक्षण उस संदर्भ से डिस्कनेक्ट हो जाएंगे जिसमें आपके एप्लिकेशन संचालित होते हैं।
मॉक के साथ, आपके परीक्षण उन मामलों को नहीं पकड़ेंगे जब उन सेवाओं में परिवर्तन आपके आवेदन को प्रभावित करते हैं।
यदि आप परीक्षण या अन्य प्रोग्रामिंग-संबंधित विषयों के बारे में अधिक जानने में रुचि रखते हैं, तो आप संबंधित सामग्री प्रकाशित करने पर अपडेट प्राप्त करने के लिए यहां साइन अप कर सकते हैं।