यूनिट टेस्टिंग - डाटाबेस कपल एप


15

एक मॉडल का परीक्षण करने वाली इकाई में सबसे अच्छा तरीका क्या होगा जो एक ऐसे अनुप्रयोग में एकीकृत होता है जो डेटाबेस में कसकर युग्मित होता है?

यहाँ विशिष्ट परिदृश्य एक शॉपिंग कार्ट है - मैं कार्ट से वस्तुओं को हटाने और पुनः प्राप्त करने के साथ-साथ मूल्य निर्धारण तर्क आदि का परीक्षण करने में सक्षम होना चाहता हूं। मेरे दिमाग में सभी के लिए डेटाबेस एक्सेस की आवश्यकता होती है, हालांकि मैंने कई बार पढ़ा है कि डेटाबेस एक्सेस से बचना चाहिए।


1
दिलचस्प है कि जो उत्तर प्रभावी ढंग से कहते हैं "अपने ऐप कोड को फिर से
लिखें

जवाबों:


10

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

बस परीक्षण के दौरान किसी भी चीज़ के लिए उत्पादन डेटाबेस से कनेक्ट न करें!


1
DI और उचित एप्लिकेशन डिज़ाइन के साथ, आपको किसी भी डेटाबेस के बिना परीक्षण करने में सक्षम होना चाहिए --- बशर्ते कि आप जो इंजेक्शन लगाते हैं वह बैक-एंड डेटाबेस का पर्याप्त विस्तृत मॉकिंग प्रदान करता है।
पीटर के।

4

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


2

मॉडल को एक (ठोस) DB पर निर्भर नहीं होना चाहिए। यदि यह केवल एक सार डीबी ("इंटरफ़ेस" पढ़ें) को जानता है जो मॉडल को सौंपा गया है तो आप डीबी को एक नकली वस्तु से बदल सकते हैं ।

में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग , नकली वस्तुओं वस्तुओं है कि नियंत्रित मायनों में असली वस्तुओं के व्यवहार की नकल प्रेरित होती है। एक प्रोग्रामर आम तौर पर किसी अन्य वस्तु के व्यवहार का परीक्षण करने के लिए एक नकली वस्तु बनाता है, उसी तरह से जैसे कि एक कार डिजाइनर वाहन प्रभावों में मानव के गतिशील व्यवहार का अनुकरण करने के लिए क्रैश टेस्ट डमी का उपयोग करता है ...


1

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

मैंने एक छोटे साइक्लाइट -DB में आवश्यक डेटा को निकाला और अपने परीक्षणों के लिए इस DB का उपयोग किया। टेस्ट-डीबी अब मेरी यूनिट-टेस्ट के सेटअप का हिस्सा है।


2
इकाई परीक्षणों का बिंदु अलगाव में अपने कोड का परीक्षण करना है। यदि आप एक sqllite db का उपयोग करते हैं तो इसके अलगाव में नहीं। डेटाबेस के बीच असंगतता भी त्रुटियों का कारण बन सकती है
टॉम स्क्वायर्स

0

"सर्वश्रेष्ठ" व्यक्तिपरक है, लेकिन आप सिर्फ एक परीक्षण DB कनेक्शन का उपयोग कर सकते हैं।

कुछ परीक्षण डेटा (उदाहरण के लिए खरीदने के लिए उत्पाद) लोड करने के लिए जुड़नार का उपयोग करें और फिर उस वर्ग / फ़ंक्शन के लिए परीक्षण केस लिखें जिसे आप परीक्षण करना चाहते हैं।


यूनिट परीक्षणों का वर्णन करना जो एक फ़ंक्शन का परीक्षण करता है जो डेटाबेस पर एकीकरण परीक्षणों के रूप में कार्य करता है @murph काफी भ्रामक है।
AD7six

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

0

मैंने इस समस्या (दूसरों के बीच ) से निपटने के लिए सिम्फनी 1.4 (PHP) के लिए एक प्लगइन बनाया । यह Django के परीक्षण ढांचे (पायथन) के संचालन के तरीके के बाद मॉडल किया गया है : फ्रेम प्रत्येक परीक्षण शुरू होने से पहले एक अलग परीक्षण डेटाबेस बनाता है और पॉप्युलेट करता है, और यह प्रत्येक परीक्षण के पूरा होने के बाद परीक्षण डेटाबेस को नष्ट कर देता है।

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

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

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

दोनों परीक्षण चौखटे में, डेटाबेस एडॉप्टर मौजूदा डेटा को दूषित करने से रोकने के लिए "उत्पादन" कनेक्शन के बजाय परीक्षण कनेक्शन का उपयोग करने के लिए कॉन्फ़िगर किया गया है।


0

मैं कहता हूँ, बस आगे बढ़ो और डेटा को पूर्व लोड करने के लिए जुड़नार का उपयोग करें। डेटा के हेरफेर का परीक्षण करते समय, यूनिट टेस्टिंग फ्रेमवर्क सामान्य रूप से काम करने लगता है।

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

उदाहरण के लिए, SQL को सीधे उस कोड में छोड़ने के बजाय जहां आपको इसकी आवश्यकता है, एक विधि को कॉल करने का एक तरीका है जो केवल वही करता है जो SQL करता है। Person.getPhoneNumber()उदाहरण के लिए, उदाहरण के लिए, का उपयोग करें SELECT phone_number FROM person WHERE id = <foo>। न केवल यह एक नज़र में क्लीनर और समझने में आसान है, बल्कि परीक्षण के दौरान आप व्यक्तिगत ऑब्जेक्ट का मज़ाक उड़ा सकते हैं ताकि डेटाबेस को छूने के बजाय getPhoneNumber()हमेशा 555-555-5555या कुछ वापस आ जाए ।


0

यह थोड़ा आसान होने पर जूनट के साथ करना काफी आसान है।

"सेटअप" को अस्थायी तालिकाओं के एक सेट को परिभाषित और आबाद करना चाहिए।

तब आप सभी अपडेट के लिए यूनिट टेस्ट कर सकते हैं, कार्यक्षमता डाल सकते हैं, हटा सकते हैं।

प्रत्येक परीक्षा के लिए आप अपनी अपडेट विधि कहते हैं, फिर अपेक्षित परिणाम को सत्यापित करने के लिए कुछ SQL चलाएं।

"फाड़" चरण में आप सभी तालिकाओं को छोड़ देते हैं।

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

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