यूनिट-टेस्ट और डेटाबेस: मैं वास्तव में किस बिंदु पर डेटाबेस से जुड़ता हूं?


37

इस सवाल पर जवाब है कि कैसे परीक्षण कक्षाएं जो एक डेटाबेस से जुड़ती हैं, उदाहरण के लिए "क्या सेवा परीक्षण कक्षाएं कनेक्ट होनी चाहिए ..." और "यूनिट परीक्षण - डेटाबेस युग्मित ऐप"

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

तो मुझे किस बिंदु पर "यहां एक डेटाबेस से डेटा प्राप्त करना है और मुझे इस कोड ऑफ़ कोड के लिए यूनिट टेस्ट नहीं लिखना है"?

दूसरे शब्दों में: कुछ वर्ग मैं में कोड में कहीं न कहीं जाना चाहिए फोन sqlDB.connect()या कुछ इसी तरह। मैं इस कक्षा का परीक्षण कैसे करूं?

और क्या यह कोड के साथ ऐसा ही है जिसे GUI या फ़ाइल सिस्टम से निपटना है?


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

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


क्या यह डेटाबेस कनेक्शन है जिसे आप परीक्षण कर रहे हैं? मेमोरी डेटाबेस (जैसे डर्बी ) में एक अस्थायी बनाना स्वीकार्य होगा?

@MichaelT फिर भी मुझे एक वास्तविक डेटाबेस के साथ मेमोरी डीबी में अस्थायी को बदलना होगा। कहा पे? कब? यह यूनिट कैसे परखी जाती है? या यह ठीक नहीं है कि इस कोड को यूनिट टेस्ट न करें?
तोबीएमकांबोबि

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

2
@ किलियानफोथ जो विशुद्ध रूप से काम के माहौल और कर्मचारी भूमिकाओं से संबंधित है। यह वास्तव में सवाल के साथ कुछ नहीं करना है। यदि डेटाबेस के लिए कोई एक व्यक्ति जिम्मेदार नहीं है तो क्या होगा?
रिएक्टगुलर

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

जवाबों:


21

एक इकाई परीक्षण का बिंदु एक वर्ग का परीक्षण करना है (वास्तव में, इसे आमतौर पर एक विधि का परीक्षण करना चाहिए )।

इसका मतलब यह है कि जब आप कक्षा का परीक्षण करते हैं A, तो आप इसमें एक परीक्षण डेटाबेस को इंजेक्ट करते हैं - कुछ स्व-लिखित, या एक बिजली-तेज़ इन-मेमोरी डेटाबेस, जो भी काम करता है।

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

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


11

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

यहां कुंजी एक अस्थायी या केवल डेटाबेस के परीक्षण के खिलाफ है, और उस परीक्षण डेटाबेस के निर्माण के लिए सबसे हल्का संभव स्टार्ट अप प्रक्रिया है।

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

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

कुछ अतिरिक्त संदर्भ।

http://en.wikipedia.org/wiki/Test_fixture

http://phpunit.de/manual/3.7/en/database.html

http://book.cakephp.org/2.0/en/development/testing.html#fixtures


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

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

2
@ जीबीजैनब - यह पहली बार में ठीक लगता है, लेकिन मेरे अनुभव में यह बहुत खतरनाक है। यहां तक ​​कि सबसे अच्छे आर्किटेक्चर वाले टेस्ट सूट और फ्रेमवर्क में, इस लेनदेन को रोलबैक करने के लिए कोड निष्पादित नहीं हो सकता है। यदि परीक्षण चलाने वाला दुर्घटनाग्रस्त हो जाता है या परीक्षण के अंदर समाप्त हो जाता है, या परीक्षण एक SOE या OOME को बाहर निकाल देता है, तो सबसे अच्छा मामला यह है कि आपके पास DB में एक लटका हुआ कनेक्शन और लेन-देन होता है जो कनेक्शन के मारे जाने तक आपके द्वारा छोड़ी गई तालिकाओं को लॉक कर देगा। जिन तरीकों से आप इस समस्या को रोकते हैं, जैसे कि SQLite को परीक्षण DB के रूप में उपयोग करना, उनकी अपनी डाउनसाइड्स हैं, उदाहरण के लिए तथ्य यह है कि आप वास्तव में वास्तविक DB का उपयोग नहीं कर रहे हैं ।
कीथ्स

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

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

4

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

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

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


अब, आप इसका कड़ाई से पालन कैसे कर सकते हैं यह डेटाबेस से जुड़ने और क्वेरी करने के लिए आपकी सटीक रणनीति पर निर्भर है। कई मामलों में जहां आपको "नंगे-हड्डियों" डेटा एक्सेस फ्रेमवर्क का उपयोग करना चाहिए, जैसे कि ADO.NET की SqlConnection और SqlStatement ऑब्जेक्ट, आपके द्वारा विकसित एक पूरी विधि में अंतर्निहित विधि कॉल और अन्य कोड शामिल हो सकते हैं जो एक होने पर निर्भर हैं डेटाबेस कनेक्शन, और इस स्थिति में आप जो सबसे अच्छा कर सकते हैं, वह पूरे फ़ंक्शन का मज़ाक उड़ाता है और आपके एकीकरण परीक्षण सूट पर भरोसा करता है। यह इस बात पर भी निर्भर करता है कि आप अपनी कक्षाओं को परीक्षण के उद्देश्यों के लिए कोड की विशिष्ट लाइनों को बदलने की अनुमति देने के लिए कितने तैयार हैं (जैसे कि टेम्बी विधि के पैटर्न का सुझाव, जो एक अच्छा है क्योंकि यह "आंशिक नकली" की अनुमति देता है

यदि आपका डेटा दृढ़ता मॉडल आपकी डेटा परत में कोड पर निर्भर करता है (जैसे ट्रिगर्स, संग्रहीत procs, आदि) तो बस कोड का उपयोग करने का कोई और तरीका नहीं है जो आप स्वयं लिख रहे हैं परीक्षण विकसित करने के लिए जो या तो डेटा परत के अंदर रहते हैं या पार करते हैं। आपके एप्लिकेशन रनटाइम और DBMS के बीच की सीमा। एक शुद्धतावादी इस पैटर्न को कहेंगे, इस कारण से, ओआरएम जैसी किसी चीज़ के पक्ष में टाला जाना चाहिए। मुझे नहीं लगता कि मैं काफी दूर जाऊंगा; यहां तक ​​कि भाषा-एकीकृत प्रश्नों और अन्य संकलक-जांच किए गए, डोमेन-निर्भर दृढ़ता वाले संचालन के युग में, मुझे डेटाबेस को केवल संग्रहीत कार्यविधि के माध्यम से उजागर होने वाले संचालन को बंद करने में मूल्य दिखाई देता है, और निश्चित रूप से ऐसी संग्रहीत प्रक्रियाओं को स्वचालित रूप से सत्यापित किया जाना चाहिए। परीक्षण। लेकिन, ऐसे परीक्षण इकाई परीक्षण नहीं हैं । वे एकीकरण हैं परीक्षण।

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


2

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

एक तरफ शब्दार्थ, वहाँ कारणों के असंख्य हैं क्यों यह फायदेमंद है:

  • टेस्ट तेज परिमाण के आदेश चलाते हैं
  • प्रतिक्रिया लूप तत्काल बन जाता है (उदाहरण के लिए TDD के लिए 1s प्रतिक्रिया)
  • टेस्ट बिल्ड / परिनियोजन प्रणालियों के समानांतर चलाए जा सकते हैं
  • टेस्ट को चलाने के लिए डेटाबेस की आवश्यकता नहीं होती है (बहुत आसान या कम से कम जल्दी निर्माण करता है)

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

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

तो आप डेटाबेस एक्सेस के साथ चीजों का परीक्षण कैसे करते हैं? आपका सभी डेटा एक्सेस कोड एक विशिष्ट परत में होना चाहिए, इसलिए आपका एप्लिकेशन कोड वास्तविक डेटाबेस के बजाय नकली सेवाओं के साथ बातचीत कर सकता है। यह परवाह नहीं करनी चाहिए कि क्या वे सेवाएँ किसी भी प्रकार के SQL डेटाबेस, इन-मेमरी टेस्ट डेटा, या रिमोट वेब्स सर्विस डेटा द्वारा समर्थित हैं। यह उनकी चिंता नहीं है।

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

मान लीजिए कि प्रत्येक घटक लगभग 5 वर्गों से बना है - आप उनके भीतर विफलता के सभी बिंदुओं का परीक्षण करना चाहते हैं। यह बहुत कम परीक्षणों के बराबर है ताकि यह सुनिश्चित हो सके कि सब कुछ ठीक से वायर्ड हो। उदाहरण - परीक्षण आप उपयोगकर्ता को उपयोगकर्ता नाम / पासवर्ड दिए गए डेटाबेस से पा सकते हैं।

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

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


1

टेम्पलेट विधि पैटर्न मदद कर सकता है।

आप किसी डेटाबेस में कॉल को protectedविधियों में लपेटते हैं । इस वर्ग का परीक्षण करने के लिए आप वास्तव में एक नकली वस्तु का परीक्षण करते हैं जो वास्तविक डेटाबेस संवहन वर्ग से विरासत में मिलती है और संरक्षित विधियों को ओवरराइड करती है।

इस तरह डेटाबेस में वास्तविक कॉल कभी भी यूनिट परीक्षणों के तहत नहीं होते हैं, यह सही है। लेकिन यह केवल कोड की कुछ पंक्तियाँ हैं। और यह स्वीकार्य है।


1
यदि आप आश्चर्य करते हैं कि मैं अपने प्रश्न का उत्तर क्यों देता हूं: हां, यह एक उत्तर हो सकता है, लेकिन अगर यह सही है तो मैं काफी अनिश्चित हूं।
तोबीएमकैमोबि जूल 30'13

-1

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

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