SQL और डेटा हेरफेर कार्यों के साथ TDD


14

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

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

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


जवाबों:


6

डेटाबेस से संबंधित हर चीज का परीक्षण करने के लिए एक महत्वपूर्ण नियम यह है कि इसे आपके बाकी एप्लिकेशन से पूरी तरह से अलग कर दिया जाए।

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

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

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


3

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

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

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

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


आप उस दृश्य के लिए परीक्षण क्यों नहीं लिख सकते हैं जिसे अभी तक कोडित नहीं किया गया है?
जेफ़ो

ऐसा नहीं है कि आप ओपी प्रस्तावित के रूप में परीक्षण के लिए तंत्र के रूप में दृश्य का उपयोग कर रहे हैं।
वर्तकुंजी

1

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

अपेक्षित परिणाम सेट को डेटाबेस तालिकाओं या बाहरी फ़ाइलों / स्प्रेडशीट में सहेजा जा सकता है। मैंने यहां तक ​​कि CHECKSUM का उपयोग या तुलना करते देखा है। जब आप किसी दृश्य / स्प्रो का परीक्षण करते हैं, तो आपको विफलता मिलेगी क्योंकि वे मौजूद नहीं हैं। तब आप कम से कम निष्पादित करने के लिए पर्याप्त कोड के साथ ऑब्जेक्ट बनाते हैं (चयन -1 को [wrong_data];) के रूप में और आपको विफलता मिल जाएगी क्योंकि यह परिणाम सेट से मेल नहीं खाता है। एक बार जब वे मेल खाते हैं, तो आपके पास अपनी हरियाली है।

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


1

यदि आपका डेटाबेस प्लेटफ़ॉर्म SQL सर्वर है, तो एक बहुत अच्छा मुफ़्त टूल है: tSQLt

tSQLt Microsoft SQL सर्वर के लिए एक डेटाबेस इकाई परीक्षण ढाँचा है। tSQLt SQL सर्वर 2005 (सर्विस पैक 2 आवश्यक) और सभी संस्करणों पर ऊपर के साथ संगत है।

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

कुछ प्रमुख तत्व जो इसे इतना उपयोगी बनाते हैं, उनमें शामिल हैं:

  • नकली तालिकाओं और विचारों के साथ काम करने की क्षमता जो सेटअप को सामान्य रूप से कम करती है
  • लेन-देन में परीक्षण स्वचालित रूप से चलते हैं (इसलिए आसानी से पुन: चलने योग्य)
  • आपके मुखर तालिकाओं (वास्तविक और नकली दोनों) पर तुलना कर सकते हैं ताकि आप देख सकें कि क्या आपने आसानी से कोई डेटा बदल दिया है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.