Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रूबी ऑन रेल्स में समानांतर परीक्षण:जोखिम और शमन रणनीतियाँ

<पी> क्या आपने कभी किसी को अपने परीक्षण बहुत तेज़ होने के बारे में शिकायत करते सुना है? मैं भी नहीं.

<पी> तेज़ परीक्षण का मतलब तेज़ प्रतिक्रिया है। चाहे आप उन्हें स्थानीय रूप से चलाएं या निरंतर एकीकरण पाइपलाइन में, जितनी जल्दी आपके परीक्षण समाप्त होंगे, उतनी ही जल्दी आप विफलताओं पर प्रतिक्रिया कर सकते हैं और अपने कोड में सुधार कर सकते हैं। उत्पादकता लाभ के अलावा, यह सर्वविदित है कि धीमी गति से परीक्षण डेवलपर्स को चिड़चिड़ा बना देते हैं। किसी को भी अपने डेवलपर्स का क्रोधी होना पसंद नहीं है।

<पी> जो कुछ भी कहा गया है, बिजली की तेजी से परीक्षण सूट बनाना हमेशा उतना आसान नहीं होता जितना आप उम्मीद करते हैं। सौभाग्य से, रेल्स 6 ने समानांतर परीक्षण नामक एक रोमांचक सुविधा पेश की . इसे आरंभ करना आसान है और यह आपके परीक्षणों को काफी तेज़ कर सकता है। हालाँकि, सावधान रहने के लिए कुछ ख़तरे भी हैं।

समानांतर परीक्षण क्या है?

<पी> समानांतर परीक्षण का क्या मतलब है?

<पी> जब आप एक परीक्षण सूट चलाते हैं, तो आपका परीक्षण धावक आम तौर पर आपके परीक्षणों को एक के बाद एक - या क्रमिक रूप से निष्पादित करने के लिए एक ही प्रक्रिया को जन्म देगा। . एक एकल परीक्षण प्रक्रिया एक एकल सीपीयू कोर का उपयोग करती है। जैसा कि आप शायद कल्पना कर सकते हैं, यह दृष्टिकोण आधुनिक हार्डवेयर का पूरा लाभ नहीं उठाता है, जो अक्सर दर्जनों सीपीयू कोर को स्पोर्ट करता है।

<पी> आपके पास 10 सीपीयू कोर वाला एक फैंसी मैकबुक हो सकता है, लेकिन दुख की बात है कि इससे आपके परीक्षण तेज नहीं होंगे!

<पी> हम कई कार्यकर्ता प्रक्रियाओं में व्यक्तिगत परीक्षण वितरित करके इसे बदल सकते हैं। परीक्षण अब एक-दूसरे के पीछे नहीं, बल्कि एक-दूसरे के बगल में - समानांतर में चलेंगे . दो कर्मचारियों पर अपना टेस्ट सूट चलाना एक ही कर्मचारी पर एक ही टेस्ट सूट चलाने से दोगुना तेज़ है।

<पी> आपकी मशीन में जितने अधिक कोर होंगे, उतनी अधिक श्रमिक प्रक्रियाएं संभव होंगी, और इस प्रकार, आपका परीक्षण सूट उतनी ही तेजी से समाप्त होगा। मान लें कि आपके परीक्षणों को चलने में आमतौर पर आठ मिनट लगते हैं। चार कार्यकर्ता प्रक्रियाओं का उपयोग करके उन्हीं परीक्षणों को चलाने से रनटाइम लगभग दो मिनट तक कम हो जाएगा!

<पी> एक अच्छी, मोटी 16 कोर वाली मशीन पर भी ऐसा करने की कल्पना करें, जहाँ हम सोलह कर्मचारी पैदा कर सकते हैं। सचमुच बहुत बढ़िया!

रेल में समानांतर परीक्षण को कॉन्फ़िगर करना

<पी> तो हम वहां कैसे पहुंचेंगे? हाल तक, आप अपने परीक्षण सूट को समानांतर करने के लिए तृतीय-पक्ष रत्नों का उपयोग कर सकते थे, लेकिन रेल्स 6 से शुरू होकर, समानांतर परीक्षण मानक आते हैं। यह parallelize जोड़ने जितना आसान है आपके परीक्षणों के लिए:

 <पी> इस कॉन्फ़िगरेशन का उपयोग करके, रेल आपकी मशीन में प्रोसेसर की संख्या के आधार पर स्वचालित रूप से कार्यकर्ता प्रक्रियाओं को उत्पन्न करेगा। रेल्स नेमस्पेस्ड डेटाबेस भी बनाएगी (उदाहरण के लिए database-test-0)। , database-test-1 , आदि) के विरुद्ध अपने परीक्षण चलाने के लिए।

<पी> आरंभ करने के लिए बस इतना ही चाहिए! निःसंदेह, यदि आपको आवश्यकता हो तो कुछ अतिरिक्त कॉन्फ़िगरेशन विकल्प मौजूद हैं।

<पी> कभी-कभी, आपको समानांतर परीक्षणों के लिए एक विशिष्ट सेटअप या क्लीनअप करना पड़ सकता है। रेल आपके उपयोग के लिए दो हुक प्रदान करता है - parallelize_setup और parallelize_teardown . इन्हें नई कार्यकर्ता प्रक्रियाओं के उत्पन्न होने से पहले और बाद में कहा जाता है:

 <पी> आप श्रमिकों की संख्या मैन्युअल रूप से भी निर्धारित कर सकते हैं:

 <पी> वैकल्पिक रूप से, PARALLEL_WORKERS का उपयोग करें मौजूदा कॉन्फ़िगरेशन को ओवरराइड करने के लिए पर्यावरण चर:

 <पी> आपके परीक्षण सूट को समानांतर करने के लिए वर्कर्स के बजाय थ्रेड्स का उपयोग करने का विकल्प भी है।

 <पी> with: :threads JRuby या TruffleRuby का उपयोग करते समय यह डिफ़ॉल्ट विकल्प है। सिद्धांत रूप में, थ्रेड्स का उपयोग थोड़ा बेहतर प्रदर्शन प्रदान करता है। आखिरकार, थ्रेड्स को प्रक्रियाओं की तुलना में कम ओवरहेड की आवश्यकता होती है। हालाँकि, व्यवहार में, मुझे थ्रेड्सॉल का उपयोग कभी भी बहुत उपयोगी नहीं लगा, और आपको अधिकांश भाग के लिए प्रक्रिया-आधारित समानांतरीकरण पर टिके रहना ही ठीक रहेगा।

नुकसान से सावधान रहें

<पी> तो आपको बस parallelize जोड़ना है अविश्वसनीय स्पीडअप का अनुभव करने के लिए अपने मौजूदा परीक्षणों में? यह इतना आसान है!

<पी> यदि आप भाग्यशाली हैं, तो यह सचमुच सच है। इसकी अधिक संभावना है कि पहली बार अपने मौजूदा परीक्षण सूट में समानांतरीकरण जोड़ते समय आपको कुछ अप्रत्याशित रुकावटें आएंगी। यह निश्चित रूप से मेरे लिए मामला था!

<पी> आइए एक बात को रास्ते से हटा दें। यदि आप Minitest के बजाय RSpec का उपयोग करते हैं, तो आप भाग्य से बाहर हैं। आरएसपीईसी रेल्स 6 अंतर्निर्मित समानांतर परीक्षण का समर्थन नहीं करता है। इसे बदलने के बारे में चर्चा चल रही है, लेकिन पिछले कुछ समय से कोई महत्वपूर्ण प्रगति नहीं हुई है। यदि आप RSpec के साथ समानांतर परीक्षण चाहते हैं, तो आपका सबसे अच्छा दांव अभी भी तीसरे पक्ष के रत्नों जैसे कि ग्रॉसर/पैरेलल_टेस्ट का उपयोग करना है।

<पी> एक और अप्रत्याशित समस्या जिसका आपको सामना करना पड़ सकता है वह यह है कि समानांतर में कम संख्या में परीक्षण चलाने से धीमा हो जाता है फिर उन्हें क्रमिक रूप से चलाना। समानांतर परीक्षण स्थापित करना एक महत्वपूर्ण ओवरहेड के साथ आता है - जैसे एकाधिक डेटाबेस बनाना - जो समानांतरकरण से प्राप्त होने वाले किसी भी लाभ को समाप्त कर सकता है।

<पी> आपके लिए कम संख्या में परीक्षणों के लिए समानांतर परीक्षणों को अक्षम करना बेहतर हो सकता है। आप PARALLEL_WORKERS का उपयोग करके ऐसा कर सकते हैं पर्यावरण चर:

 <पी> जब आप कई परीक्षण निष्पादित करते हैं तो रेल 7 ने समानांतर निष्पादन को सक्षम करके इसे संबोधित किया। इसलिए यदि आपने पहले ही अपग्रेड कर लिया है, तो आपको इस समस्या का अनुभव नहीं होगा। डिफ़ॉल्ट रूप से, समानांतरीकरण सीमा 50 पर सेट है, लेकिन आप इसे ओवरराइड कर सकते हैं:

 <पी> आखिरी समस्या जिसे मैं उजागर करना चाहता हूं वह वह है जिसका सामना करने की सबसे अधिक संभावना है, और यह सबसे घातक और निपटने में सबसे कठिन भी है। अपने परीक्षण सूट के लिए समानांतर परीक्षण सक्षम करते समय आपको यादृच्छिक विफलताएँ दिखाई देने लग सकती हैं। यह समझने के लिए कि समांतरता इसका कारण कैसे बन सकती है, आइए एक साधारण परीक्षण मामले को देखें:

 <पी> यह टेस्ट थोड़ा बेकार होने के साथ-साथ बिल्कुल ठीक है। जब तक इसे क्रमिक रूप से चलाया जाता है, तब तक यह 100% समय पास कर लेगा। प्रत्येक परीक्षण अलग-थलग है, और इन परीक्षणों को यादृच्छिक क्रम में निष्पादित करने से वे विफल नहीं होते हैं। जब आप मिश्रण में एकाधिक प्रक्रियाएँ या धागे जोड़ते हैं तो यह बदल जाता है।

<पी> समानांतर में परीक्षण चलाने पर, सीपीयू शेड्यूलिंग के कारण आपके परीक्षणों में अलग-अलग कथनों का निष्पादन क्रम बदल सकता है। उदाहरण को देखते हुए, आपको कभी-कभी इस तरह के निष्पादन आदेश दिखाई देंगे:

 <पी> चूँकि वर्कर 2 ने वर्कर 1 के दावे को निष्पादित करने से पहले फ़ाइल को हटा दिया था, पहला परीक्षण विफल हो जाएगा - कभी-कभी। चोट के अपमान के लिए, एक अलग निष्पादन आदेश कभी-कभी दूसरे परीक्षण को विफल कर देता है और पहले को पास कर देता है।

<पी> यह सरल उदाहरण एक ऐसे मुद्दे को दर्शाता है जो न केवल फ़ाइलों तक बल्कि किसी भी सिंगलटन संसाधन तक फैला हुआ है जिसे आपका परीक्षण गैर-थ्रेड-सुरक्षित तरीके से एक्सेस करता है। मान लीजिए कि आप Redis डेटाबेस या Elasticsearch इंडेक्स पर लिखते हैं। उस स्थिति में, आपको संभवतः इसी तरह की जटिलताओं का अनुभव होगा। इससे भी बुरी बात यह है कि यादृच्छिक विफलताओं का कारण बनने वाले सभी परीक्षणों को उजागर करने में आपको कुछ समय लग सकता है - और उन सभी को ठीक करने में और भी अधिक समय लग सकता है।

<पी> परतदार समानांतर परीक्षणों को संबोधित करने के लिए कोई सिल्वर बुलेट नहीं है। सामान्य तौर पर, आपको यह सुनिश्चित करना होगा कि एकाधिक परीक्षण प्रक्रियाएं संसाधनों को साझा न करें। फ़ाइलों के लिए, Tempfiles का उपयोग करें। parallelize_setup का उपयोग करें नामांकित संसाधन (जैसे रेडिस डेटाबेस) बनाने के लिए। वगैरह.

मौजूदा रेल परीक्षणों में समानांतर परीक्षण जोड़ना

<पी> मान लीजिए कि आप समानांतरीकरण के कारण यादृच्छिक परीक्षण विफलताओं से जूझ रहे हैं और आपके पास उन्हें ठीक करने का समय नहीं है। हालाँकि, आप अभी भी समानांतर परीक्षण का लाभ उठाना चाहते हैं। आप इसे केवल अपने परीक्षणों के एक सबसेट के लिए सक्षम करना पसंद कर सकते हैं।

<पी> केवल परीक्षण जो parallelize पर कॉल करते हैं आख़िरकार समानांतर किया जाएगा, और चिंताओं या मूल वर्गों का उपयोग करके, आप अपने परीक्षण सूट में एक समय में एक परीक्षण वर्ग में समानांतर परीक्षण जोड़ सकते हैं। आप इस तरह एक मॉड्यूल बना सकते हैं:

 <पी> कोई भी परीक्षण कक्षा जिसमें यह मॉड्यूल शामिल है, अब समानांतर में चलेगी:

 <पी> वैकल्पिक रूप से, आप ParallelTest जैसी एक नई टेस्ट क्लास बना सकते हैं :

 <पी> फिर, उन परीक्षणों के लिए इसे प्राप्त करें जो समानांतर में चलने चाहिए - और जो समस्याग्रस्त साबित होते हैं उन्हें छोड़ दें।

बैंडएड के रूप में समानांतर परीक्षण

<पी> समानांतर परीक्षण कम प्रयास के लिए प्रभावशाली गति लाभ प्रदान करता है। हालाँकि, मूर्ख मत बनो:यह आपके परीक्षण सुइट्स की गति को बेहतर बनाने के लिए अन्य तरीकों का विकल्प नहीं है, बल्कि एक अतिरिक्त है।

<पी> यदि आपको लगता है कि आपका परीक्षण सूट धीमा है और आप प्रयास छोड़ सकते हैं, तो इसे प्रोफाइल करने और धीमेपन के मूल कारण/कारणों को संबोधित करने में कुछ समय व्यतीत करें। समानांतर परीक्षण के साथ एक धीमा परीक्षण सूट तेज़ हो जाएगा, लेकिन पहले से तेज़ परीक्षण सूट जितना तेज़ नहीं होगा जो समानांतर में भी चलता है!

समाप्ति

<पी> इस पोस्ट में, हमने देखा कि समानांतर परीक्षण क्या है, आप इसे कैसे सेट अप कर सकते हैं और इसे कैसे कॉन्फ़िगर करें। यदि आपको अपने परीक्षणों को तेजी से आगे बढ़ाने के लिए किसी तरीके की आवश्यकता है, तो समानांतर परीक्षण वह प्रदान करता है।

<पी> अपने परीक्षण सूट में समानांतर परीक्षण जोड़ते समय आपको कुछ बाधाओं का सामना करना पड़ सकता है। जब वर्षों तक चलने वाले परीक्षण अचानक विफल होने लगें तो आश्चर्यचकित न हों। आप अपने परीक्षण सूट के केवल एक सबसेट को समानांतर करके उनके आसपास काम कर सकते हैं।

<पी> इससे कोई फर्क नहीं पड़ता कि आप कौन सा दृष्टिकोण चुनते हैं, समानांतर परीक्षण आपके परीक्षणों को तेज़ करने के लिए एक शानदार उपकरण है!

<पी> हैप्पी कोडिंग!

<पी> पी.एस. यदि आप प्रेस से हटते ही रूबी मैजिक पोस्ट पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूज़लेटर की सदस्यता लें और एक भी पोस्ट न चूकें! रूबी ऑन रेल्स में समानांतर परीक्षण:जोखिम और शमन रणनीतियाँ

हंस-जॉर्ग श्नडलिट्ज़

<पी> हमारे अतिथि लेखक हंस वियना, ऑस्ट्रिया से एक रेल इंजीनियर हैं। वह अपना अधिकांश समय कोडिंग करने या कोडिंग के बारे में पढ़ने में बिताता है, और कभी-कभी अपने ब्लॉग पर भी इसके बारे में लिखता है! जब वह स्क्रीन के सामने नहीं बैठा होगा, तो आप शायद उसे बाहर किसी पहाड़ पर चढ़ते हुए पाएंगे।

<पी> हंस-जॉर्ग श्नडलिट्ज़

द्वारा सभी लेख
  1. एंड्रॉइड स्क्लाइट में कर्सर सरणी सूची खाली है या नहीं, इसकी जांच कैसे करें? एंड्रॉइड स्क्लाइट में कर्सर सरणी सूची खाली है या नहीं, इसकी जांच कैसे करें?

    उदाहरण में आने से पहले, हमें पता होना चाहिए कि एंड्रॉइड में एसक्लाइट डेटा बेस क्या है। SQLite एक ओपन सोर्स SQL ​​डेटाबेस है जो किसी डिवाइस पर टेक्स्ट फ़ाइल में डेटा स्टोर करता है। Android अंतर्निहित SQLite डेटाबेस कार्यान्वयन के साथ आता है। SQLite सभी रिलेशनल डेटाबेस सुविधाओं का समर्थन करता है। इस ड

  1. Matplotlib तालिका की पारदर्शिता/अपारदर्शिता को कैसे बदलें? Matplotlib तालिका की पारदर्शिता/अपारदर्शिता को कैसे बदलें?

    एक matplotlib तालिका की पारदर्शिता/अपारदर्शिता को बदलने के लिए, हम निम्नलिखित कदम उठा सकते हैं कदम फिगर साइज सेट करें और सबप्लॉट्स के बीच और आसपास पैडिंग को एडजस्ट करें। एक आकृति और सबप्लॉट का एक सेट बनाएं। 10×3 आयाम वाला एक यादृच्छिक डेटासेट बनाएं। स्तंभों का टपल बनाएं। अक्ष (बंद) का

  1. एंड्रॉइड में एक्शन बार ऊंचाई कैसे प्राप्त करें? एंड्रॉइड में एक्शन बार ऊंचाई कैसे प्राप्त करें?

    यह उदाहरण दर्शाता है कि मैं एंड्रॉइड में एक्शन बार की ऊंचाई कैसे प्राप्त करूं। चरण 1 - एंड्रॉइड स्टूडियो में एक नया प्रोजेक्ट बनाएं, फाइल ⇒ न्यू प्रोजेक्ट पर जाएं और एक नया प्रोजेक्ट बनाने के लिए सभी आवश्यक विवरण भरें। चरण 2 - निम्न कोड को res/layout/activity_main.xml में जोड़ें। चरण 3 - निम