एक बड़े रेल अनुप्रयोग में RSpec परीक्षणों को तेज करना


90

मेरे पास मेरे RSpec परीक्षणों में 2,000 से अधिक उदाहरणों के साथ एक रेल अनुप्रयोग है। कहने की जरूरत नहीं है, यह एक बड़ा अनुप्रयोग है और बहुत कुछ परीक्षण किया जाना है। इस बिंदु पर इन परीक्षणों को चलाना बहुत ही अक्षम है और क्योंकि इसमें इतना समय लगता है, हम लगभग एक नए निर्माण को आगे बढ़ाने से पहले उन्हें लिखने से हतोत्साहित होने के बिंदु पर हैं। मैंने सबसे लंबे समय तक चलने वाले उदाहरणों को खोजने के लिए अपने spec.opts में जोड़ा - प्रॉफिटेबल और उनमें से कम से कम 10 हैं जिन्हें चलाने के लिए औसतन 10 सेकंड लगते हैं। क्या आप RSpec विशेषज्ञों में से एक हैं? क्या 10 सेकंड पूरी तरह से एक उदाहरण के लिए बहुत लंबा है? मुझे लगता है कि 2,000 उदाहरणों के साथ, सब कुछ अच्छी तरह से परीक्षण करने के लिए गैर-तुच्छ मात्रा में समय लगेगा - लेकिन इस बिंदु पर 4 घंटे का समय थोड़ा अजीब है।

अपने सबसे लंबे समय तक चलने वाले उदाहरणों के लिए आप किस तरह का समय देख रहे हैं? अड़चनों का पता लगाने और चीजों को गति देने में मदद करने के लिए मैं अपने मौजूदा चश्मे का निवारण क्या कर सकता हूं। इस बिंदु पर हर मिनट वास्तव में मदद करेगा।


1
क्या धीमे परीक्षण एकीकरण परीक्षण हैं? क्या वे डीबी मार रहे हैं? यदि हां, तो कितनी बार db को पुनः लोड किया जा रहा है और क्या आप db का मजाक उड़ा सकते हैं?
कालेब पेडरसन

1
क्या आप केवल उन स्पेक्स का हिस्सा चलाने में सक्षम हैं जो उस हिस्से से संबंधित हैं, जिस पर आप काम कर रहे हैं, सिएटल आरबी के ऑटोटेस्ट के समान है? क्या आपके पास एक निरंतर एकीकरण सर्वर है जो सभी परीक्षणों को चला सकता है?
एंड्रयू ग्रिम

यह भी याद रखें कि सभी चीजें सापेक्ष हैं। मैंने सुना है "जीआरआरआर, हमारे परीक्षण सूट हमेशा के लिए लेता है" दोनों 20 मिनट ... और 16-20 घंटे। यह देखने वाले की नजर में सब है। दिए गए परीक्षणों के लिए 10 सेकंड का मतलब अक्सर एक इकाई परीक्षण होता है जो नीचे दिए गए अनुसार एकीकरण परीक्षण बन गया है।
माइकल डुरंट

इस तरह की समस्या के लिए एक सुझाव: perftools.rbयह समझने के लिए कि आपके अधिकांश समय का उपयोग करने के लिए अपने परीक्षण ढांचे के साथ मिलकर उपयोग करें। शीर्ष 10 कॉल लें और उन्हें समाप्त / स्किम करने का प्रयास करें। फिर खुश होने तक दोहराएं।
aladalgrande

जवाबों:


118

किसी भी एक परीक्षण को चलाने के लिए 10 सेकंड बहुत लंबा समय होता है। मेरी आंत की भावना यह है कि आपका कल्पना लक्ष्य एक ही समय में इकाई और एकीकरण परीक्षण दोनों चला रहा है। यह एक विशिष्ट चीज है जो परियोजनाएं गिरती हैं और किसी न किसी स्तर पर, आपको इस तकनीकी ऋण को दूर करने की आवश्यकता होगी यदि आप अधिक उत्पादन करना चाहते हैं, तो तेजी से। ऐसी कई रणनीतियाँ हैं जो आपको ऐसा करने में मदद कर सकती हैं ... और मैं पहले से इस्तेमाल की गई कुछ चीजों की सिफारिश करूँगा।

1. इंटिग्रेशन टेस्ट से अलग यूनिट

पहली बात मैं एकीकरण परीक्षणों से इकाई को अलग करना चाहूंगा। आप ऐसा कर सकते हैं:

  1. उन्हें ले जाना (विशेष निर्देशिका के तहत अलग-अलग फ़ोल्डर में) - और रेक लक्ष्य को संशोधित करना
  2. उन्हें टैग करना (rspec आपको अपने परीक्षण टैग करने की अनुमति देता है)

दर्शन हो जाता है, कि आप चाहते हैं कि आपका नियमित निर्माण जल्दी हो - अन्यथा लोग उन्हें चलाने के लिए बहुत खुश नहीं होंगे। तो उस क्षेत्र में वापस आ जाओ। त्वरित चलाने के लिए अपने नियमित परीक्षण प्राप्त करें, और अधिक पूर्ण निर्माण को चलाने के लिए निरंतर एकीकरण सर्वर का उपयोग करें।

एक एकीकरण परीक्षण एक परीक्षण है जिसमें बाहरी निर्भरता (जैसे डेटाबेस, वेब सर्विस, कतार, और कुछ फाइलसिस्टम का तर्क होगा) शामिल है। एक इकाई परीक्षण सिर्फ उस कोड के विशिष्ट आइटम का परीक्षण करता है जिसे आप जाँचना चाहते हैं। यह तेजी से चलना चाहिए (45 सेकंड में 9000 संभव है), अर्थात इसका अधिकांश भाग स्मृति में चलना चाहिए।

2. यूनिट टेस्ट में इंटीग्रेशन टेस्ट कन्वर्ट करें

यदि आपकी इकाई परीक्षणों का थोक आपके एकीकरण परीक्षण सूट से छोटा है, तो आपको एक समस्या है। इसका मतलब यह है कि विसंगतियां अधिक आसानी से दिखाई देने लगेंगी। इसलिए यहां से, एकीकरण परीक्षणों को बदलने के लिए अधिक इकाई परीक्षण बनाना शुरू करें। इस प्रक्रिया में मदद करने के लिए आप जो चीजें कर सकते हैं, वे हैं:

  1. वास्तविक संसाधन के बजाय एक नकली रूपरेखा का उपयोग करें। Rspec में एक इनबिल्ट मॉकिंग फ्रेमवर्क है।
  2. अपनी इकाई परीक्षण सूट पर आरसीओवी चलाएं। यह प्रयोग करने के लिए कि आपके यूनिट टेस्ट सूट में कितनी गहराई है।

एक बार जब आपके पास एकीकरण परीक्षण को बदलने के लिए एक उचित इकाई परीक्षण होता है - एकीकरण परीक्षण को हटा दें। डुप्लिकेट परीक्षण केवल रखरखाव को बदतर बनाता है।

3. फिक्स्चर का उपयोग न करें

फिक्स्चर बुरे हैं। इसके बजाय एक कारखाने का उपयोग करें (मशीनिस्ट या factorybot)। ये सिस्टम डेटा के अधिक अनुकूलनीय ग्राफ़ बना सकते हैं, और इससे भी महत्वपूर्ण बात यह है कि वे एक बाहरी डेटा स्रोत से लोड की बजाय इन-मेमोरी ऑब्जेक्ट्स का निर्माण कर सकते हैं, जिनका आप उपयोग कर सकते हैं।

4. यूनिट टेस्ट बनने से रोकने के लिए चेक को जोड़ें एकीकरण टेस्ट

अब जब आपके पास तेजी से परीक्षण हो रहा है, तो इसे फिर से होने से रोकें।

डेटाबेस (UnitRecord) तक पहुँचने का प्रयास करते समय एक त्रुटि फेंकने के लिए बंदर पैच सक्रिय रिकॉर्ड होते हैं।

आप जोड़ी और टीडीडी को भी आजमा सकते हैं जो आपकी टीम को तेज परीक्षण लिखने में मदद कर सकता है क्योंकि:

  1. किसी की चेकिंग - तो किसी को आलस नहीं आता
  2. उचित TDD के लिए तेज़ प्रतिक्रिया की आवश्यकता होती है। धीमे-धीमे परीक्षण पूरी बात को दर्दनाक बनाते हैं।

5. समस्या को दूर करने के लिए अन्य पुस्तकालयों का उपयोग करें

किसी ने स्पार्क का उल्लेख किया (रेल्स 3 के तहत परीक्षण सूट के लिए लोड बार), हाइड्रा / समानांतर_टैस्ट - समानांतर में (कई कोर के पार) में यूनिट परीक्षण चलाने के लिए।

यह शायद पिछले का उपयोग किया जाना चाहिए। आपकी वास्तविक समस्या चरण 1, 2, 3 में सभी तरह है। इसे हल करें और आप अतिरिक्त बुनियादी ढांचे की भूमिका के लिए बेहतर स्थिति में होंगे।


बहुत बढ़िया जवाब। यह बहुत सच है कि कोई भी उन्नत उपकरण खराब परीक्षणों को जल्दी से चलाने में मदद नहीं कर सकता है। इसलिए केवल अच्छा लिखने की कोशिश करें।
यूरा ओमेलचुक

5
मैं आपके तीसरे बिंदु पर असहमत हूं कि आपको जुड़नार का उपयोग नहीं करना चाहिए। यदि ठीक से उपयोग किया जाता है, तो वे कारखानों की तुलना में तेज़ होते हैं क्योंकि आप ऑब्जेक्ट बनाने के लिए नहीं होते हैं। आपका डेटा वहां है जिसे आपको प्रत्येक परीक्षण मामले के साथ बनाना नहीं है।
वालरजेक

3
कारखानों के तेजी से होने के बारे में यह एक मजाक है, है ना?
माइक सूजेंडेल

चुनिंदा रूप से फैक्ट्री गर्ल से बचने के लिए स्पीड टेस्ट करें - robots.thoughtbot.com/…
geekdev

16

अपने टेस्ट सूट के प्रदर्शन को बेहतर बनाने के लिए एक शानदार रसोई की किताब के लिए, ग्रीज़ योर सूट प्रस्तुति देखें।

उन्होंने टेस्ट सूट रन टाइम में 45x स्पीडअप का उपयोग किया जैसे कि तकनीकों का उपयोग करके:


मुझे लिंक पसंद हैं, लेकिन प्रस्तुति नहीं। किसी के स्पीच के लिए इंडेक्स कार्ड स्पीकर के लिए प्रस्तुति का मांस भरने के लिए एक संकेत है।
ब्रायन माल्टज़ान

यह प्रस्तुति अब नहीं है। fast_context कई कंधे ब्लॉक को गति देता है। quickerclip (वह लिंक भी मृत) जाहिरा तौर पर पेपरक्लिप को गति देता है। हाइड्रा को समानांतर_टैग और गोर्गॉन के लिए पदावनत किया जाता है। बूट्सनाप में फाइल सिस्टम ट्विक है और अब रेल के साथ शामिल है। रूबी के हालिया संस्करणों ने आवंटन और जीसी में सुधार किया है।
प्रतिनिधि

5

आप Spork का उपयोग कर सकते हैं। इसमें 2.3.x का समर्थन है,

https://github.com/sporkrb/spork

या ./script/spec_server जो 2.x के लिए काम कर सकता है

इसके अलावा, आप डेटाबेस कॉन्फ़िगरेशन को संपादित कर सकते हैं (जो अनिवार्य रूप से डेटाबेस प्रश्नों आदि को गति देता है), जो परीक्षणों के लिए प्रदर्शन भी बढ़ाएगा।


स्पार्क कमाल का है। यह थोड़ा हैकिंग के साथ, रेल 3 पर भी काम करता है। लेकिन रेल 3 पर स्पॉर्क के साथ ध्यान देने वाली एक बात यह है कि यह नियंत्रकों में परिवर्तन नहीं लगता है, इसलिए आपको इसे इतनी बार फिर से शुरू करने की आवश्यकता होगी। लेकिन वैसे भी, स्पॉर्क वास्तव में बहुत बढ़िया है, परीक्षणों की गति में सुधार बहुत महत्वपूर्ण है।
AboutRuby

4
स्पार्क केवल स्टार्टअप को गति देने के लिए है, परीक्षण के लिए नहीं। तो बहुत सारे चश्मे के साथ, लाभ नगण्य है।
रिएक्टोर्मोन्क

उपरोक्त टिप्पणियों के विपरीत, स्पार्क का उपयोग परीक्षणों को गति देने के लिए किया जा सकता है और साथ ही साथ रेलसेकेंड railscasts.com/episodes/285-spork पर स्टार्टअप के लिए भी किया जा सकता है । एक बहुत बड़े ऐप पर बड़े पैमाने पर मेरे rspec परीक्षण सूट में सुधार हुआ। (192 सेकंड से
घटाकर

3

प्रति सेकंड 10 सेकंड बहुत लंबे समय की तरह लगता है। मैंने कभी एक युक्ति नहीं देखी है जो एक सेकंड से अधिक समय लेती है, और सबसे अधिक कम लेती है। क्या आप नेटवर्क कनेक्शन का परीक्षण कर रहे हैं? डेटाबेस लिखता है? फाइलसिस्टम लिखता है?

जितना संभव हो उतना मोज़ेक और स्टब्स का उपयोग करें - वे डेटाबेस को हिट करने वाले कोड लिखने की तुलना में बहुत तेज़ हैं । दुर्भाग्य से मज़ाक और हकलाना भी लिखने में अधिक समय लेता है (और सही तरीके से करना कठिन है)। आपको खर्च किए गए परीक्षण परीक्षण बनाम खर्च किए गए समय के परीक्षण को संतुलित करना होगा।

मैं एक एंड्रयू प्रणाली में देख के बारे में दूसरी एंड्रयू ग्रिम की टिप्पणी है जो आपको अपने परीक्षण सूट को समानांतर करने की अनुमति दे सकती है। कुछ आकार के लिए, यह एकमात्र व्यवहार्य समाधान हो सकता है।


हाँ, अगर यह 10 सेकंड है, तो मैं इसे प्रोफाइल करूँगा और देखूँगा कि अड़चन कहाँ है
रोगरपैक

1
मेरे पास एक बहुत बड़ा प्रोजेक्ट है और एक ही rspec परीक्षण चलाने में 15-20 सेकंड लगते हैं।
ExiRe

2

कई लोगों ने ऊपर हाइड्रा का उल्लेख किया है। हमने अतीत में बड़ी सफलता के साथ इसका इस्तेमाल किया है। मैंने हाल ही में हाइड्रा प्राप्त करने और चलाने की प्रक्रिया का दस्तावेजीकरण किया: http://logicalfriday.com/2011/05/18/faster-rails-tests-with-hydra/

मैं इस भावना से सहमत हूं कि इस तरह की तकनीक का उपयोग उन परीक्षणों को लिखने के विकल्प के रूप में नहीं किया जाना चाहिए जो अच्छी तरह से संरचित हैं और डिफ़ॉल्ट रूप से तेज हैं।



0

fast_require रत्न आपकी मदद कर सकता है। इसके अलावा आपका एकमात्र तरीका है (जैसे आपने किया) प्रोफ़ाइल और ऑप्टिमाइज़ करें, या स्पार्क या ऐसी किसी चीज़ का उपयोग करें जो आपके चश्मे को आपके समानांतर में चलाए। http://ruby-toolbox.com/categories/distributed_testing.html


0

आप पहले जांच करने के लिए कुछ सरल युक्तियों का पालन कर सकते हैं जहां अधिकांश समय व्यतीत होता है यदि आपने उन्हें पहले से ही नहीं आज़माया है। नीचे दिए गए लेख को देखें:

https://blog.mavenhive.in/7-tips-to-speed-up-your-webdriver-tests-4f4d043ad581

मुझे लगता है कि इनमें से अधिकांश सामान्य कदम हैं जो परीक्षण के लिए उपयोग किए जाने वाले उपकरण के बावजूद लागू होंगे।


-4

मौजूदा परीक्षण सूट को हटा दें। अविश्वसनीय रूप से प्रभावी होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.