database - यूनिट-टेस्टिंग डेटाबेस




unit-testing transactions (6)

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

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

  • राज्यविहीन
  • एक दूसरे से स्वतंत्र
  • एक ही परिणाम के साथ repeatable अर्थात् नहीं लगातार परिवर्तन

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

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

मैंने पाया कि एक अन्य समाधान एक लेनदेन में फ़ंक्शन कॉल को लपेटता है जिसे आसानी से वापस रोल किया जा सकता है, जैसे कि रॉय ओशेरिव्स की एक्सटिनिट यह काम है, लेकिन इसमें एक और लाइब्रेरी, एक और निर्भरता शामिल है, और यह समस्या के हल के लिए बहुत ही भारी है।

तो, इस स्थिति से निपटने के दौरान इतनी समुदाय क्या किया गया है?

टीजीएमडीबीएम ने कहा:

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

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


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

आप आमतौर पर इकाई परीक्षण डेटाबेस नहीं करते आप आमतौर पर एकीकरण परीक्षण में डेटाबेस शामिल करते हैं।

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


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

मुझे बहुत सारे वेब डेवलपमेंट गतिविधियों के लिए खराब फिट होने के लिए इकाई परीक्षण की नंगे हड्डियों की परिभाषा मिलती है। लेकिन यह पृष्ठ कुछ और 'उन्नत' यूनिट परीक्षण मॉडल का वर्णन करता है और विभिन्न स्थितियों में इकाई परीक्षण को लागू करने के लिए कुछ विचारों को प्रेरित करने में मदद कर सकता है:

यूनिट टेस्ट पैटर्न


मैंने एक ऐसी तकनीक का समझाया है जो मैं यहां इस स्थिति के लिए उपयोग कर रहा हूं।

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

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


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

राइनो मोक्स एक बहुत अच्छी प्रतिष्ठा है

NMock एक और है

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

डाटाबेस मॉक में, इसका मतलब है कि अपनी खुद की डीबी एक्सेस परत "ऑब्जेक्ट्स" के साथ "मजाक कर रही है" जो कि आपके यूनिट टेस्ट से निपटने के लिए तालिका, पंक्ति या डेटासेट ऑब्जेक्ट्स को बनाते हैं।

मैं कहां काम करता हूं, हम आम तौर पर खरोंच से अपना मॉक लिब्स बनाते हैं, लेकिन इसका मतलब यह नहीं है कि आपको करना है


हाँ, आपको डेटाबेस को एक्सेस करने वाले रिपॉजिटरीज और सेवाओं का उपयोग करने के लिए अपने कोड को रिफ़क्टर करना चाहिए और आप तब उन वस्तुओं को नकली या ठूंठ कर सकते हैं ताकि टेस्ट के तहत ऑब्जेक्ट डेटाबेस को छू न सके। यह डेटाबेस की स्थिति को स्टोर करने और हर परीक्षण के बाद रीसेट करने से बहुत तेज है!

मैं अत्यधिक मूक के रूप में अपने मजाक की रूपरेखा की सिफारिश करता हूं मैंने राइनो मोक्स और एनएमॉक का उपयोग किया है Moq इतनी सरल और अन्य चौखटे के साथ मेरी सारी समस्याओं का हल किया था।







xtunit