आप अपने एकीकरण परीक्षण को कैसे मापते हैं?


21

मैं हमारे मौजूदा उत्पाद पर हमारे एकीकरण की बढ़ती संख्या को बढ़ाने के लिए तकनीकों और रणनीतियों की जांच कर रहा हूं, ताकि वे (मानवीय) हमारे विकास और सीआई प्रक्रिया का हिस्सा बन सकें

लगभग 200+ एकीकरण परीक्षणों में हम पहले से ही पूर्ण परीक्षण रन (एक डेस्कटॉप देव मशीन पर) को पूरा करने के लिए 1hr चिह्न मार रहे हैं, और यह रूटीन पुश प्रक्रियाओं के हिस्से के रूप में पूरे सूट को चलाने के लिए एक डेवलपर की क्षमता को नकारात्मक रूप से प्रभावित कर रहा है। जो उन्हें अच्छी तरह से बनाने के बारे में अनुशासित होने की प्रेरणा को प्रभावित कर रहा है। हम इंटीग्रेशन टेस्ट को आगे पीछे करने के लिए केवल प्रमुख दर्शनीय स्थल का उपयोग करते हैं, और हम एक ऐसे वातावरण का उपयोग करते हैं जो उत्पादन को दर्पण करता है, जिसे प्रत्येक टेस्ट रन को खरोंच से बनाया जाता है।

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

हम इस उत्पाद को धीमा करने के लिए शुरू होने से पहले 10 गुना गुना अधिक एकीकरण परीक्षण की उम्मीद करते हैं (वास्तव में कोई विचार नहीं है, लेकिन ऐसा महसूस नहीं होता है कि हम अभी भी सुविधाओं के संदर्भ में शुरू कर रहे हैं)। हमें कुछ सैकड़ों या कुछ हजारों एकीकरण परीक्षणों में होने की उम्मीद है, मैं कुछ बिंदु पर लगता हूं।

स्पष्ट होने के लिए, इकाई परीक्षण बनाम एकीकरण परीक्षण पर एक चर्चा बनने से रोकने की कोशिश करने के लिए, (जिसका कभी कारोबार नहीं किया जाना चाहिए)। हम टीडीडी और इस उत्पाद में एकीकरण परीक्षण के साथ दोनों इकाई परीक्षण कर रहे हैं। वास्तव में, हम सेवाओं के आर्किटेक्चर में विभिन्न परतों पर एकीकरण परीक्षण करते हैं, जो हमारे पास है, जहां यह हमारे लिए समझ में आता है, जैसा कि हमें यह सत्यापित करने की आवश्यकता है कि हम अपने आर्किटेक्चर में पैटर्न को दूसरे क्षेत्रों में बदलते समय ब्रेकिंग परिवर्तन कैसे पेश करते हैं। प्रणाली। 

हमारे टेक स्टैक के बारे में थोड़ा। हम वर्तमान में अपने परीक्षणों को अंत से चलाने के लिए सीपीयू (सीपीयू और मेमोरी इंटेंसिव) एमुलेशन वातावरण पर परीक्षण कर रहे हैं। जो कि Azure REST वेब सेवाओं से बना है, जो एक noSql backend (ATS) का निर्माण करती है। हम Azure डेस्कटॉप एमुलेटर + IISExpress में चलकर अपने उत्पादन वातावरण का अनुकरण कर रहे हैं। हम प्रति मशीन में एक एमुलेटर और एक स्थानीय बैकेंड रिपॉजिटरी तक सीमित हैं।

हमारे पास एक क्लाउड-आधारित CI भी है, जो समान उत्सर्जित वातावरण में एक ही परीक्षण चलाता है, और हमारे वर्तमान CI प्रदाता के साथ क्लाउड में परीक्षण रन दोगुना (2hrs +) हो रहा है। हम हार्डवेयर प्रदर्शन के मामले में क्लाउड CI प्रदाताओं SLA की सीमा तक पहुंच गए हैं, और परीक्षण समय पर उनके भत्ते को पार कर गए हैं। उनके लिए निष्पक्ष होने के लिए, उनके चश्मे खराब नहीं हैं, लेकिन आधे स्पष्ट रूप से एक इनडोर ग्रुनी डेस्कटॉप मशीन के रूप में अच्छे हैं।

हम परीक्षण के प्रत्येक तार्किक समूह के लिए हमारे डेटा स्टोर के पुनर्निर्माण की एक परीक्षण रणनीति का उपयोग कर रहे हैं, और परीक्षण डेटा के साथ प्री लोडिंग कर रहे हैं। बड़े पैमाने पर डेटा अखंडता का बीमा करते समय, यह प्रत्येक परीक्षण पर 5-15% प्रभाव जोड़ता है। इसलिए हमें लगता है कि उत्पाद विकास में इस बिंदु पर परीक्षण रणनीति को अनुकूलित करने के लिए बहुत कम प्रयास किया जाना है। 

इसका लंबा और छोटा समय यह है: जब तक हम प्रत्येक परीक्षण के थ्रूपुट को अनुकूलित कर सकते हैं (भले ही प्रत्येक के रूप में 30% -50% से अधिक), हम अभी भी निकट भविष्य में कई सौ परीक्षणों के साथ प्रभावी ढंग से अभ्यस्त नहीं करेंगे। 1 आर अब भी मानव सहनीय से अधिक दूर है, हमें इसे टिकाऊ बनाने के लिए समग्र प्रक्रिया में परिमाण-ईश सुधार के आदेश की आवश्यकता है।

इसलिए, मैं जांच कर रहा हूं कि परीक्षण के समय को कम करने के लिए हम किन तकनीकों और रणनीतियों को नियोजित कर सकते हैं।

  • कम परीक्षण लिखना एक विकल्प नहीं है। कृपया इस धागे में से एक पर बहस न करें।
  • तेजी से हार्डवेयर का उपयोग करना निश्चित रूप से एक विकल्प है, हालांकि बहुत महंगा है।
  • पैरलल में अलग हार्डवेयर पर परीक्षणों / परिदृश्यों के समूह चलाना भी निश्चित रूप से एक पसंदीदा विकल्प है।
  • विकास के तहत सुविधाओं और परिदृश्यों के आसपास परीक्षणों का समूह बनाना प्रशंसनीय है, लेकिन अंततः पूर्ण कवरेज या विश्वास साबित करने में विश्वसनीय नहीं है कि सिस्टम परिवर्तन से प्रभावित नहीं है। 
  • डेस्कटॉप एमुलेटर में चलने के बजाय क्लाउड-स्केल स्टेजिंग वातावरण में चलना तकनीकी रूप से संभव है, हालांकि हम टेस्ट रन के लिए परिनियोजन समय जोड़ना शुरू करते हैं (सामान को तैनात करने के लिए टेस्ट रन की शुरुआत में प्रत्येक 20 मिनट)।
  • सिस्टम के घटकों को स्वतंत्र लॉजिअल टुकड़ों में विभाजित करना एक हद तक प्रशंसनीय है, लेकिन हम उस पर सीमित लाभ की उम्मीद करते हैं, क्योंकि घटकों के बीच का अंतर समय के साथ बढ़ने की उम्मीद है। (यानी एक परिवर्तन एक अयोग्य है दूसरों को प्रभावित करने की संभावना है अनपेक्षित तरीके - जैसा कि अक्सर होता है जब एक प्रणाली को आकस्मिक रूप से विकसित किया जाता है)

मैं यह देखना चाहता था कि इस स्पेस में अन्य क्या रणनीति (और टूल्स) इस्तेमाल कर रहे हैं।

(मेरा मानना ​​है कि कुछ अन्य प्रौद्योगिकी सेटों का उपयोग करके इस तरह की कठिनाई को देख सकते हैं।)

[अद्यतन: १२/१६/२०१६: हमने सीआई समानांतर परीक्षण में अधिक निवेश किया, परिणाम की चर्चा के लिए: http://www.mindkin.co.nz/blog/2015/12/16/16-jobs]


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

ऐसा लगता है कि क्या है, और क्या एकीकरण परीक्षण नहीं है, और यूनिट परीक्षण और एकीकरण परीक्षण के लोगों की गलतफहमी, ओह लड़के के बारे में एक चर्चा में उतर रहा है!
जेजे सैंटोस

जवाबों:


9

मैंने एक जगह पर काम किया, जिसमें एकीकरण परीक्षण चलाने में 5 घंटे (30 मशीनों के पार) लगे। मैंने कोडबेस को रीलेक्ट किया और नए सामान के बदले यूनिट टेस्ट किए। यूनिट परीक्षणों में 30 सेकंड (1 मशीन के पार) लगे। ओह, और कीड़े भी नीचे चले गए। और विकास का समय जब से हमने जाना कि वास्तव में दानेदार परीक्षणों से क्या टूट गया।

लंबी कहानी छोटी, आप नहीं। पूर्ण एकीकरण परीक्षण तेजी से बढ़ते हैं क्योंकि आपका कोडबेस बढ़ता है (अधिक कोड का अर्थ है अधिक परीक्षण और अधिक कोड का मतलब है कि सभी परीक्षणों को चलाने में अधिक समय लगता है क्योंकि काम करने के लिए अधिक "एकीकरण" है)। मेरा तर्क है कि "लूप" श्रेणी में कुछ भी निरंतर एकीकरण के अधिकांश लाभों को खो देता है क्योंकि फीडबैक लूप नहीं है। यहां तक ​​कि परिमाण में सुधार का एक आदेश आपको अच्छा पाने के लिए पर्याप्त नहीं है - और यह आपको स्केलेबल पाने के करीब नहीं है।

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


मैं सहमत हूँ। यूनिट परीक्षण बहुत अधिक मापनीय हैं और एक तेज प्रतिक्रिया लूप का समर्थन करते हैं।
ब्रैंडन

8
आपको वह बात याद आ गई होगी। ओपी पहले से ही व्यापक यूंट परीक्षण के साथ-साथ प्रश्न में एकीकरण परीक्षण करता है। एकीकरण परीक्षणों के लिए यूनिट परीक्षण कभी भी प्रतिस्थापन नहीं होते हैं। विभिन्न उपकरण, विभिन्न प्रथाओं, विभिन्न उद्देश्यों, विभिन्न परिणाम। यह कभी एक या दूसरे का सवाल नहीं है।
जेजे सैंटोस

1
पोस्ट में स्पष्टता को स्पष्ट रूप से कहा गया है कि हम TDD का उपयोग करके इस उत्पाद का निर्माण करते हैं, इसलिए हमारे पास पहले से ही हजारों यूनिट परीक्षण हैं, जो प्रश्न में एकीकरण परीक्षणों द्वारा समर्थित हैं। ।
जेजे सैंटोस

8

एकीकरण परीक्षण हमेशा लंबे समय तक चलते रहेंगे क्योंकि उन्हें एक वास्तविक उपयोगकर्ता की नकल करनी चाहिए। इस कारण से आपको उन सभी को सिंक्रोनाइज़ नहीं करना चाहिए!

यह देखते हुए कि आप पहले से ही क्लाउड में सामान चला रहे हैं यह मुझे ऐसा लगता है जैसे आप कई मशीनों पर अपने परीक्षणों को स्केल करने के लिए एक प्रमुख स्थिति में हैं।

चरम मामले में, प्रति परीक्षण एक नया वातावरण तैयार करें और एक ही समय में उन सभी को चलाएं। आपका एकीकरण परीक्षण तब तक केवल सबसे लंबे समय तक चलने वाला परीक्षण होगा।


अछा सुझाव! उस तरह की रणनीति को देखते हुए, लेकिन कुछ उपकरणों के साथ जो परीक्षण वितरित करने में मदद करते हैं
जेज़ सैंटोस

4

परीक्षणों को काटना / अनुकूलित करना मेरे लिए सबसे अच्छा विचार है, लेकिन अगर यह विकल्प नहीं है, तो मेरे पास प्रस्ताव का विकल्प है (लेकिन कुछ सरल मालिकाना उपकरण बनाने की आवश्यकता है)।

मुझे एक समान समस्या का सामना करना पड़ा लेकिन हमारे एकीकरण परीक्षणों में नहीं (जो मिनटों में चला)। इसके बजाय यह हमारे बिल्ड में बस गया था: बड़े पैमाने पर सी कोडबेस, निर्माण में घंटों लगेंगे।

मैंने जो कुछ बहुत ही बेकार देखा, वह यह था कि हम पूरी चीज़ को स्क्रैच (लगभग 20,000 स्रोत फ़ाइलों / संकलन इकाइयों) से पुनर्निर्माण कर रहे थे, भले ही केवल कुछ स्रोत फ़ाइलें बदल गई हों, और इस तरह एक बदलाव के लिए घंटों खर्च करना चाहिए जो केवल सेकंड या मिनट ले सकता है खराब से खराब।

इसलिए हमने अपने बिल्ड सर्वर पर वृद्धिशील लिंकिंग की कोशिश की, लेकिन यह अविश्वसनीय था। यह कभी-कभी झूठी नकारात्मकता देता है और कुछ कमिट पर निर्माण करने में विफल रहता है, केवल तभी पूर्ण पुनर्निर्माण पर सफल होता है। इससे भी बदतर, यह कभी-कभी झूठी सकारात्मकता देगा और एक बिल्ड सफलता की रिपोर्ट करेगा, केवल डेवलपर के लिए एक टूटी हुई बिल्ड को मुख्य शाखा में विलय करने के लिए। इसलिए जब भी कोई डेवलपर अपनी निजी शाखा से बदलावों को धक्का देता है, तो हम सब कुछ फिर से बनाने के लिए वापस चले जाते हैं।

मुझे इससे बहुत नफरत थी। मैं वीडियो गेम खेलने वाले आधे डेवलपर्स के साथ कॉन्फ्रेंस रूम में जाता हूं और सिर्फ इसलिए कि बिल्डरों के इंतजार के दौरान ऐसा कुछ और नहीं था। मैंने मल्टीटास्किंग करके उत्पादकता बढ़त हासिल करने की कोशिश की और एक बार मैंने एक नई शाखा शुरू की, ताकि मैं कोड्स पर काम कर सकूं, जबकि बिल्डरों का इंतजार किया जा सकता था, लेकिन जब एक परीक्षण या निर्माण विफल हो गया, तो उस बिंदु को बदलने के लिए कतार में खड़ा होना बहुत दर्दनाक हो गया और सब कुछ ठीक करने और इसे वापस सिलाई करने की कोशिश करें।

साइड प्रोजेक्ट वेटिंग, इंटीग्रेटिंग बाद में

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

पार्सिंग स्रोत फ़ाइलें मैन्युअल रूप से पता लगाने के लिए कि क्या पुनर्निर्माण / रेरुन

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

एकीकरण परीक्षणों के लिए एक ही रणनीति लागू होनी चाहिए। बस पुनरावर्ती स्रोत फ़ाइलों को यह पता लगाने के लिए कि एकीकरण परीक्षण किन फ़ाइलों पर निर्भर करता है (पूर्व: importजावा में,#includeसर्वर साइड में C या C ++), और उन फ़ाइलों में शामिल हैं / उन फ़ाइलों से आयात किया गया है और इसी तरह, सिस्टम के लिए एक पूर्ण शामिल / आयात निर्भरता फ़ाइल ग्राफ़ का निर्माण किया जाता है। पार्सिंग के विपरीत जो एक डीएजी बनाता है, ग्राफ़ को अप्रत्यक्ष होना चाहिए क्योंकि यह किसी भी फ़ाइल में रुचि रखता है जिसमें परिवर्तन होता है जिसमें कोड होता है जिसे अप्रत्यक्ष रूप से निष्पादित किया जा सकता है *। केवल एकीकरण परीक्षण को फिर से चलाएं यदि ब्याज की एकीकरण परीक्षण के लिए ग्राफ में उन फ़ाइलों में से कोई भी बदल गया है। यहां तक ​​कि कोड की लाखों लाइनों के लिए, यह पार्सिंग एक मिनट से भी कम समय में करना आसान था। यदि आपके पास स्रोत कोड के अलावा अन्य फ़ाइलें हैं जो सामग्री फ़ाइलों की तरह एकीकरण परीक्षण को प्रभावित कर सकती हैं, तो शायद आप स्रोत कोड में एक टिप्पणी में मेटाडाटा लिख ​​सकते हैं जो एकीकरण परीक्षणों में उन निर्भरता को इंगित करता है, ताकि उन बाहरी फ़ाइलों को बदलना चाहिए, परीक्षण भी फिर से दौड़ना।

* एक उदाहरण के रूप में, यदि test.c में foo.h शामिल है, जिसे foo.c द्वारा भी शामिल किया गया है, तो test.c, foo.h, या foo.c में से एक परिवर्तन को एक नए रन की आवश्यकता के रूप में एकीकृत परीक्षण को चिह्नित करना चाहिए।

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


3

लगता है जैसे आपके पास बहुत सारे एकीकरण परीक्षण हैं। टेस्ट पिरामिड को याद करें । एकीकरण परीक्षण बीच में होते हैं।

एक उदाहरण के रूप विधि के साथ भंडार ले set(key,object), get(key)। इस रिपॉजिटरी का उपयोग आपके कोड बेस में बड़े पैमाने पर किया जाता है। इस रिपॉजिटरी पर निर्भर सभी तरीकों को एक नकली रिपॉजिटरी के साथ परीक्षण किया जाएगा। अब आपको केवल दो एकीकरण परीक्षणों की आवश्यकता है, एक सेट के लिए और एक प्राप्त करने के लिए।

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

एकीकरण परीक्षण का परीक्षण करना चाहिए कि ओआरएम, रिपॉजिटरी और कतार सार सही हैं। अंगूठे के एक नियम के रूप में, एकीकरण परीक्षण के लिए किसी भी डोमेन कोड की आवश्यकता नहीं है - केवल सार।

लगभग सब कुछ यूनिट पर निर्भरता के लिए स्टबड / मॉकड / फेक / इन-मेम-इन-कार्यान्वयन के साथ परीक्षण किया जा सकता है।


1
दिलचस्प परिप्रेक्ष्य। हमारे एकीकरण परीक्षण हर ReST कॉल के प्रत्येक पैरामीटर के हर क्रमांकन को सत्यापित करने का प्रयास नहीं कर रहे हैं। यह हमारे विचार में एकीकरण परीक्षण नहीं है। वे एपीआई के माध्यम से महत्वपूर्ण अंत-टू-एंड परिदृश्यों को चला रहे हैं जो बदले में विभिन्न बैकेंड स्टोर और अन्य प्रणालियों को हिट करते हैं। इसका उद्देश्य यह सुनिश्चित करना है कि एपीआई के परिवर्तन के रूप में वे पहचानें कि किन परिदृश्यों पर ध्यान देने की आवश्यकता है (यानी अब अपेक्षा के अनुरूप काम नहीं करें)।
जेजे सैंटोस

1
हमारे पास वास्तुकला में विभिन्न स्तरों पर एकीकरण परीक्षण हैं। आपके उदाहरण में, हमारे पास उन कक्षाओं के लिए इकाई परीक्षण हैं जो डेटा स्टोर तक पहुंचते हैं, इसलिए हमें पता है कि वे हमारे डेटा स्टोर में सही कॉल करते हैं, हमारे पास हमारे स्टोर की एक कॉपी सेटअप करने के लिए एकीकरण परीक्षण हैं और यह परीक्षण करते हैं कि वे डेटा को सही ढंग से पढ़ते हैं और लिखते हैं दुकान के साथ। फिर हम एक REST API में उन डेटा क्लासेस का उपयोग करते हैं, जो हम यूनिट टेस्ट के साथ बनाते हैं, और फिर इंटीग्रेशन टेस्ट जो कि वेब सेवा को स्टार्टअप करते हैं और यह सुनिश्चित करने के लिए कॉल करते हैं कि डेटा वापस से सामने और वीजा वर्सा में आ रहा है। क्या आप सुझाव दे रहे हैं कि हमारे यहाँ बहुत सारे परीक्षण हैं?
जेजे सैंटोस

मैंने आपके जवाब को आपकी टिप्पणियों की प्रतिक्रिया के रूप में अपडेट किया।
एबेन स्कोव पेडरसन

2

एक चुस्त या DevOps वातावरण में मेरे अनुभव में जहां निरंतर वितरण पाइपलाइन आम हैं, एकीकरण परीक्षण को पूरा किया जाना चाहिए क्योंकि प्रत्येक मॉड्यूल पूरा या समायोजित किया जाता है। उदाहरण के लिए, कई निरंतर वितरण पाइपलाइन वातावरणों में, प्रति दिन प्रति डेवलपर कई कोड परिनियोजन होना असामान्य नहीं है। तैनाती से पहले प्रत्येक विकास चरण के अंत में एकीकरण परीक्षणों का एक त्वरित सेट चलाना इस प्रकार के वातावरण में एक मानक अभ्यास होना चाहिए। अतिरिक्त जानकारी के लिए, इस विषय पर अपने पढ़ने में शामिल करने के लिए एक महान ई-पुस्तक देवो में परीक्षण के लिए एक व्यावहारिक मार्गदर्शिका है देवऑप्स, जिसे कैटरीना क्लोकी ने लिखा है।

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

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

उद्यम में एकीकरण परीक्षण कैसे करें, इसके बारे में अधिक समझने के लिए यह लेख उपयोगी हो सकता है


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

1

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

आमतौर पर आप एकीकरण परीक्षण के प्रभाव को कम करना चाहते हैं ताकि उन्हें अपेक्षाकृत मामूली परिवर्तनों पर चलाना कम से कम हो। फिर आप एक 'क्यूए' रन के लिए पूर्ण परीक्षण छोड़ सकते हैं जो आप तब करते हैं जब शाखा को अगले स्तर पर पदोन्नत किया जाता है। तो आपके पास देव शाखाओं के लिए इकाई परीक्षण हैं, विलय होने पर कम एकीकरण परीक्षण चलाएं, और जब एक रिलीज उम्मीदवार शाखा में विलय हो जाए तो पूर्ण एकीकरण परीक्षण चलाएं।

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

इस समग्र आशावादी दृष्टिकोण को अभी भी पूर्ण-परीक्षण की आवश्यकता है, लेकिन इसे बाद के चरण में किया जा सकता है जब लिया गया समय कम जरूरी हो। (उदाहरण के लिए आप रात के दौरान एक बार पूर्ण परीक्षण चला सकते हैं, अगर कोई समस्या हो तो देवता सुबह उन्हें हल कर सकते हैं)। इससे अगले दिन के परीक्षण के लिए एकीकरण रिग पर उत्पाद को ताज़ा करने का भी लाभ होता है - यह तारीख से बाहर हो सकता है क्योंकि देव चीजें बदलते हैं, लेकिन केवल 1 दिन तक।

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


1

कुछ बिंदु पर, एकीकरण परीक्षणों का एक पूरा सेट महंगे हार्डवेयर पर भी पूरा करने में कई घंटे लग सकते हैं। विकल्पों में से एक उन परीक्षणों के बहुमत को हर कमिट पर चलाने के लिए नहीं है, और इसके बजाय उन्हें हर रात, या एक सतत बैच मोड में (एक बार कई कमिट्स) चलाने के लिए नहीं है।

यह, हालांकि, एक नई समस्या पैदा करता है - डेवलपर्स को तत्काल प्रतिक्रिया नहीं मिलती है, और टूटी हुई बिल्ड किसी का ध्यान नहीं जा सकता है। इसे ठीक करने के लिए, यह महत्वपूर्ण है कि उन्हें पता चल जाए कि हर समय कुछ टूट गया है। कैटलाइट या टीमसिटी के ट्रे नोटिफायर जैसे नोटिफिकेशन टूल्स का उपयोग करना काफी उपयोगी हो सकता है।

लेकिन अभी एक और समस्या होगी। यहां तक ​​कि जब डेवलपर देखता है कि बिल्ड टूट गया है, तो वह इसे जांचने के लिए जल्दी नहीं कर सकता है। सब के बाद, किसी और को यह पहले से ही जाँच हो सकता है, है ना?

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


0

ऐसा लगता है कि आपका कोड आधार बड़ा हो रहा है, और कुछ कोड प्रबंधन मदद करेगा। हम जावा का उपयोग करते हैं, इसलिए यदि मैं इसे स्वीकार करता हूं तो पहले से माफी मांगता हूं।

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

जावा दुकान जिसे मैं इस दृष्टिकोण का उपयोग करता हूं, और हम शायद ही कभी एकीकरण परीक्षणों के चलने की प्रतीक्षा कर रहे हों।


धन्यवाद, लेकिन मुझे लगता है कि हमारे पास इस संदर्भ में एकीकरण परीक्षण के उद्देश्य और आवेदन की समान समझ नहीं है। आप इकाई परीक्षण के साथ एकीकरण परीक्षण का सामना कर रहे हो सकते हैं।
जेजे सैंटोस

0

लंबे समय तक निष्पादन के समय या सीमित और / या महंगे संसाधनों की आवश्यकता के साथ सीआई पाइपलाइन एकीकरण परीक्षणों (या बिल्डरों सहित किसी भी प्रकार के सत्यापन) में रखने के लिए एक अन्य संभावित दृष्टिकोण, पोस्ट-प्रतिबद्ध सत्यापन के आधार पर पारंपरिक सीआई सिस्टम से स्विच करना है (जो हैं) करने के लिए अतिसंवेदनशील भीड़ ) पर आधारित करने के लिए पूर्व प्रतिबद्ध सत्यापन।

शाखा डेवलपर्स में उनके परिवर्तनों को सीधे करने के बजाय, उन्हें एक केंद्रीकृत स्वचालित सत्यापन प्रणाली में प्रस्तुत करना जो सत्यापन करता है और:

  • यदि यह सफल होता है तो यह शाखा में परिवर्तन को स्वचालित रूप से करता है
  • यदि असफल हो जाता है तो यह उनके बदलावों के पुनर्मूल्यांकन के लिए संबंधित प्रस्तुतकर्ताओं को सूचित करता है

ऐसा दृष्टिकोण कई प्रस्तुत परिवर्तनों के साथ संयोजन और परीक्षण करने की अनुमति देता है, संभवतः कई बार प्रभावी सीआई सत्यापन गति बढ़ाता है।

ऐसा ही एक उदाहरण है ओपनस्टैक द्वारा उपयोग किया जाने वाला जेरिट / ज़ूल-आधारित गेटिंग सिस्टम

एक और है एक्सीसीआई ( डिस्क्लेमर - मैं इसका निर्माता हूं और इसकी पेशकश करने वाली कंपनी का संस्थापक)।

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