डेटाबेस और यूनिट / एकीकरण परीक्षण


25

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

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

लगता है कि डेटाबेस की कार्यक्षमता का परीक्षण करने का सबसे अच्छा तरीका निम्नलिखित सेटअप होगा:

  1. परीक्षण चलाने से पहले "सेटअप" चरण में, आप पहले डेटाबेस के सभी तालिकाओं को काटते हैं
  2. फिर आप उन सभी मामलों को सम्मिलित करते हैं जो आपके द्वारा चलाए जा रहे परीक्षण मामलों के लिए आवश्यक हैं
  3. फिर आप परीक्षण मामलों को चलाते हैं और मान्य करते हैं
  4. फिर एक "फाड़" चरण में आप एक बार फिर डेटाबेस में सभी तालिकाओं को काटते हैं

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

क्या मुझसे कोई चूक हो रही है? क्या यह डेटाबेस से संबंधित कार्यक्षमता का परीक्षण करने का सबसे अच्छा तरीका नहीं है? क्या प्री-पॉपुलेटेड डेटाबेस के लिए कुछ लाभ है जो हमेशा डेटाबेस में मौजूद होता है (परीक्षण शुरू करने से पहले या परीक्षण किए जाने के बाद भी)? अपनी प्रक्रिया को बेहतर ढंग से समझाने के लिए विचारों में किसी भी तरह की मदद से मेरी बात भी बेहतर हो जाएगी (वह यह है कि अगर मेरी बात में योग्यता है)।


जवाबों:


21

मेरे लिए यूनिट परीक्षणों को डेटाबेस से नहीं निपटना चाहिए, एकीकरण परीक्षण डेटाबेस से निपटना चाहिए।

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

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

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


मुझे सिर्फ इतना पता है कि यूनिट टेस्टिंग और इंटीग्रेशन टेस्टिंग के बीच क्या अंतर है, इसके अलावा मैं सुनता हूं कि यूनिट को मॉकडॉट डेटा का उपयोग करना चाहिए और इंटीग्रेशन को एक डेटाबेस का उपयोग करना चाहिए (दूसरे थ्रेड प्रोग्रामर.स्टैकएक्सचेंज. com/ questions/ 101300/… से अंतर जानने के लिए। )। इसके अलावा, आप जो कुछ भी कह रहे हैं, मैं जो सोच रहा हूं, उसके अनुरूप लगता है।
ryanzec

कोई बात नहीं, मैंने आपके अन्य उत्तर में अधिक जानकारी जोड़ दी है
निकोलस मेने

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

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

6

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

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

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


2

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

आप सही हैं कि परीक्षण कैसे लिखे जाने चाहिए, सिवाय इसके कि मैं किसी चीज को काट नहीं सकता:

  • सेटअप चरण: डेटाबेस से एक कनेक्शन प्राप्त करें और डेटा डालें
  • चरण चलाना
  • आंसू नीचे चरण: सम्मिलित डेटा को हटा दें (छोटा करें)

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


क्या मैं नहीं बल्कि डेटाबेस के कुछ हिस्सों को परीक्षण के लिए प्रत्येक के लिए ज़रूरी बनाना चाहूंगा, जिससे किसी ने गलती से डेटा को इस तरह से संशोधित किया हो जो विफलता का कारण बनता है? यह सुनिश्चित करने के बाद कि परीक्षण विफल होने पर डेटा सही है, ऐसा कुछ लगता है जिसे रोका जा सकता है।
ryanzec

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

1

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

उदाहरण: खाता लेन-देन तालिका की जाँच करना

  1. क्या आप उपयोगकर्ता / खाते के लिए बिना किसी लेन-देन के इस तालिका को देखना चाहते हैं?
  2. पहले रिकॉर्ड को जोड़ने का परीक्षण करें और देखें कि क्या आप एक संतुलन बना सकते हैं।
  3. पहले से मौजूद रिकॉर्ड होने पर रिकॉर्ड बनाएं और चल रहे संतुलन और किसी भी अन्य व्यावसायिक नियमों की जांच करें।
  4. मौजूदा रिकॉर्ड और अन्य सभी CRUD के साथ तालिका देखें।

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


0

कुछ उत्तरों के पहलुओं को एक साथ जोड़ने के लिए और मेरे 2p को जोड़ने के लिए ...

नोट: मेरी टिप्पणियाँ विशेष रूप से डेटाबेस परीक्षण से संबंधित हैं , न कि UI परीक्षण (हालांकि स्पष्ट रूप से समान लागू होता है)।

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

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

मुझे यकीन है कि अधिकांश सहमत होंगे कि एक समान कठोरता को डेटाबेस परीक्षण पर लागू किया जाना चाहिए जैसे कि फ्रंट एंड या रिपोर्ट परीक्षण।

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

इसलिए मेरे उत्तर के लिए कुछ संदर्भ दे रहा हूं ...

इकाई का परीक्षण

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

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

  • स्कीमा जांच, कुछ इसे 'डेटा अनुबंध' परीक्षण कह सकते हैं
  • स्तंभ मूल्यों से गुजर रहा है
  • कार्यों, प्रक्रियाओं, विचारों, गणना किए गए स्तंभों के लिए डेटा के विभिन्न मूल्यों के साथ तर्क पथों का प्रयोग
  • एज केस टेस्टिंग - NULL, बैड डेटा, निगेटिव नंबर, मान जो बहुत बड़े हैं

(यूनिट) एकीकरण परीक्षण

मैंने इस एसई पोस्ट को विभिन्न प्रकार के परीक्षण के बारे में बात करने में मददगार पाया ।

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

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

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

तो अब जब मैंने आपके वास्तविक प्रश्नों का उत्तर देने के लिए कुछ संदर्भ दिया है

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

-3

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

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


मैं एक खाली डेटाबेस के खिलाफ चलने का सुझाव नहीं दे रहा हूं, यदि आप चरण 2 देखते हैं "मेरे पास" तो आप उन सभी मामलों को सम्मिलित करते हैं जो आपके द्वारा चलाए जा रहे परीक्षण मामलों के लिए आवश्यक हैं। " प्रदर्शन के मुद्दे के बारे में, मुझे नहीं लगता कि इकाई परीक्षण किस लिए है, वह अधिक लोड परीक्षण है। यह सुनिश्चित करने के लिए कि आपके कोड काम में तार्किक होने के लिए परीक्षण करने के लिए इकाई परीक्षण मेरे पास है। यदि तार्किक काम करता है, तो यह एक ही मूल डेटा के 1 रिकॉर्ड या 100,000,000,000 रिकॉर्ड के लिए काम करने जा रहा है (सोचा कि यह बहुत सुस्त होगा)।
ryanzec

डेटाबेस क्वेरीज़ सिर्फ तार्किक के बारे में नहीं हैं और जितनी जल्दी आपको पता चलेगा कि यह बेहतर तरीके से काम नहीं करेगा। 1 रिकॉर्ड के लिए जो काम करता है, वह अक्सर ठेस पर पहुंच जाता है और यूनिट टेस्ट शॉडल दिखाता है कि जितनी जल्दी हो सके।
HLGEM

यूनिट और एकीकरण परीक्षण कार्यक्षमता के लिए हैं न कि प्रदर्शन के लिए ताकि आप डेटा की थोड़ी मात्रा के साथ परीक्षण कर सकें
user151019

यूनिट परीक्षण को कभी भी डेटाबेस का उपयोग नहीं करना चाहिए - एकीकरण परीक्षण डेटाबेस का उपयोग करते हैं।
निकोलस मेने

1
क्या आप वास्तव में लोड परीक्षण के बारे में बात कर रहे हैं। यदि आपके पास स्वीकार्यता परीक्षण का एक सेट था और उन्हें एक लोड परीक्षण उपकरण में झुका दिया गया था, तो आप वांछित प्रभाव को प्राप्त करने में सक्षम होंगे।
निकोलस मेयेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.