संग्रहीत प्रक्रियाओं की इकाई परीक्षण


44

मैं काफी समय से इस पर विचार कर रहा हूं।

मूल प्रश्न यह है: संग्रहीत प्रक्रियाओं का परीक्षण कैसे किया जाए?

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

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

तो आप अपनी संग्रहीत प्रक्रियाओं का परीक्षण कैसे करते हैं? क्या जटिलता में एक त्रिशूल है जहां यह पूरी तरह से निराशाजनक हो जाता है? रखरखाव के लिए किन संसाधनों की आवश्यकता होती है?

संपादित करें एक और छोटा सा सवाल है, AlexKuznetsov के उत्तर के आधार पर: या वहाँ एक treshold जिसके तहत यह पूरी तरह से बेकार है है?

जवाबों:


32

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

मैंने एक लेख लिखा है जिसका शीर्षक है क्लोज़लोफॉल्स: लेसन ऑफ़ यूनिट टेस्टिंग टी-एसक्यूएल , साथ ही साथ कुछ ब्लॉग पोस्ट से सीखा गया

आपके प्रश्न के बारे में "क्या जटिलता में एक त्रिशूल है जहां यह पूरी तरह से निराशाजनक हो जाता है?", जटिल मॉड्यूल को सरल लोगों की तुलना में बहुत अधिक परीक्षणों की आवश्यकता होती है।

रखरखाव को सरल बनाने के लिए, हम अपेक्षित परिणाम उत्पन्न करते हैं, और हम उन्हें अलग-अलग फ़ाइलों में संग्रहीत करते हैं - जो एक बड़ा अंतर बनाता है।


15

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

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

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

उच्च या निम्न छोर पर कोई जटिलता नहीं है जो आपको परीक्षण या इकाई परीक्षण से रोकना चाहिए। इन सवालों पर गौर करें:

  1. क्या आप हमेशा बग फ्री कोड लिखते हैं?
  2. क्या छोटी इकाइयाँ हमेशा बग मुक्त रहती हैं?
  3. क्या एक बड़ी इकाई के लिए बग होना ठीक है?
  4. आपदा पैदा करने में कितने कीड़े लगते हैं?

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

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

1
सबसे पहले, आपके उत्तर के लिए धन्यवाद - मुझे इस प्रश्न पर आगे किसी भी उन्नति की उम्मीद नहीं थी ... दूसरे, मुझे यह स्वीकार करना होगा कि आप सरल ऑपरेशन के बारे में सही हैं: यहां तक ​​कि एक दो-स्तंभ INSERT भी बग का उत्पादन कर सकता है। यदि यह लिखा जाता है ताकि स्तंभ आदेश को तर्कों के खिलाफ मिलान किया जा सके तो यह ठीक हो सकता है, लेकिन फिर आप सही हैं, फिर से: यह शायद पूरे ऐप को परीक्षण शासन के तहत रखते हुए बेहतर है।
dezso

@ डिस्सो यह एक महान सवाल है और एक अवधारणा है जिसे डेटाबेस की दुनिया में बहुत अधिक जोखिम की आवश्यकता है।
लेह रिफ़ेल

"आपको एक इकाई के रूप में घटनाओं की पूरी श्रृंखला का परीक्षण करना चाहिए" - यह सबसे काउंटर-सहज ज्ञान युक्त चीज़ है जिसे आप कह सकते हैं। अगर ऐसा है तो यह एक इकाई नहीं है। आप एकीकरण परीक्षण कर रहे हैं
जो फिलिप्स

@ जो फिलिप्स - जो आपको पसंद है उसे कॉल करें, यह सुनिश्चित करें कि एक प्रक्रिया जो एक सम्मिलित करता है और कुछ ट्रिगर को आग लगाता है वह ऐसा करता है जिसे स्वचालित परीक्षण करने की आवश्यकता है।
लेह रिफ़ेल

8

PostgreSQL के लिए, pgTAP देखें :

pgTAP डेटाबेस फ़ंक्शंस का एक सूट है जो Psql स्क्रिप्ट या xUnit- स्टाइल टेस्ट फ़ंक्शंस में TAP- एमिटिंग यूनिट टेस्ट लिखना आसान बनाता है।


देखा कि, धन्यवाद। किसी को भी इसके साथ अनुभवी है?
dezso

हाँ, आजकल काफी लोग। यदि आपके कोई प्रश्न हैं, तो मेल सूची की सदस्यता लें ।
सिद्धांत

6

यदि आप संग्रहीत प्रक्रियाओं के अपने परीक्षण को पूरी तरह से SQL पर करना पसंद करेंगे, तो http://tsqlt.org/ पर एक नज़र डालें

यह MS SQL 2005 SP2 और अधिक से अधिक के साथ संगत है, और इसका लाभ डेवलपर्स को परीक्षणों को लागू करने के लिए C # या किसी अन्य भाषा को जानने की आवश्यकता नहीं है।

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

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