एकीकरण परीक्षण के लिए इन-मेमोरी डेटाबेस का उपयोग क्यों करें?


18

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

मुझे यहां क्या समझ नहीं आ रहा है?


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

एक देवता के लिए यह अच्छा है कि वह किसी बाहरी डेटाबेस को पहले से सेट किए बिना सभी कोडों में से नवीनतम प्राप्त कर सके और परीक्षण चला सके।
जेसन इवांस

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

जवाबों:


19

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

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

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


6

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

एकीकरण परीक्षण धीमी गति से चलेंगे, लेकिन जब वे तेज़ होंगे तो आप उन्हें अधिक बार चला सकते हैं। उदाहरण के लिए, हर कमिट से पहले। बेशक, यह एक पूर्ण वातावरण के रूप में पूरा नहीं है, लेकिन कम से कम आप मैपिंग परत, उत्पन्न SQL, कैसे एक दूसरे से बात करते हैं, आदि का परीक्षण कर रहे हैं। महंगा डेटाबेस के मामले में आप यह भी सुनिश्चित करते हैं कि आप डॉन ' t सभी के लिए लाइसेंस खरीदने की आवश्यकता है। आप परीक्षण के साथ कोड के 90% को कवर करने में अधिक त्रुटि पकड़ सकते हैं, प्रति दिन या सबसे खराब, सप्ताह में एक बार कोड परीक्षण के 100% को कवर करने की तुलना में एक घंटे तक चला गया।

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


3

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

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

कुछ वास्तविक कोड में मैंने (बिक्री के बिंदु) पर काम किया, हमारे पास एक resumeSuspededTransaction(...)विधि थी। यह डेटाबेस से ऑब्जेक्ट (और उसके घटकों) में लेनदेन को खींच लेगा और डेटाबेस को अपडेट कर देगा। हमने इसे मॉक किया था और डेटाबेस में जाने वाले डेटा के क्रमांकन और डीरियलाइजेशन के साथ कोड में कहीं बग खराब हो गया था (हमने एक प्रकार को बदल दिया था जो डेटाबेस पर अलग-अलग रूप से क्रमबद्ध था)।

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

बाद में, हमने एक डेटाबेस वहां रखा और महसूस किया कि बग कभी भी उस जूनियर टेस्ट से नहीं गुजरेगा यदि हम इसके बजाय मेमोरी डेटाबेस में जा रहे थे।


मेमोरी डेटाबेस में फायदे हैं:

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

1

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

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


1

आम आदमी के शब्दों में:

यूनिट परीक्षण के लिए वास्तुकला के महत्वपूर्ण हिस्सों का मजाक उड़ाना ठीक है (और चाहिए) ।

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

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

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