यूनिट टेस्टिंग में, मैं दो बार रिपॉजिटरी क्यों बनाऊंगा?


10

दूसरे दिन मैं यूनिट टेस्टिंग के बारे में थोड़ा पढ़ रहा था और मैंने कुछ उदाहरण देखे जहां लोग रिपॉजिटरी इंटरफ़ेस (यानी IExampleRepository) बनाते हैं और फिर वास्तविक रिपॉजिटरी ( public class ExampleRepository : IExampleRepository) और एक रिपॉजिटरी का उपयोग यूनिट टेस्टिंग ( FakeExampleRepository : IExampleRepository) के लिए करते हैं।

हालांकि, IExampleRepositoryवे ExampleRepositoryअलग-अलग लाइनक प्रश्नों के साथ, वैसे ही तरीके लागू कर रहे थे ।

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

जवाबों:


8

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

कहा कि आपको 'वास्तविक' भंडार * के साथ परीक्षण करने की भी आवश्यकता है, लेकिन यह आमतौर पर एक एकीकरण / प्रणाली परीक्षण में किया जाएगा

* स्पष्ट रूप से असली के रूप में परीक्षण के लिए सेट रेपो, उम्मीद नहीं की तरह उत्पादन DB।


इसलिए यूनिट परीक्षण में मैं यह सुनिश्चित करने के लिए विधि का परीक्षण नहीं करूंगा कि यह सही मान लौटाता है (नकली / नकली डेटा सेट के आधार पर)?
जौ

हाँ, आप स्वयं विधि का परीक्षण करेंगे, लेकिन केवल विधि में कोड, अन्य वस्तुओं में कोड को अन्य इकाई परीक्षणों में शामिल किया जाना चाहिए, कई वस्तुओं की सहभागिता को एकीकरण परीक्षण या उच्च स्तर के परीक्षणों में कवर किया जाना चाहिए
jk।

1
ठीक है, इसलिए यदि मैं सही ढंग से समझता हूं, तो मुझे मूल रिपॉजिटरी का उपयोग करना चाहिए जब यूनिट रिपॉजिटरी का परीक्षण कर रहा हो। जब मैं कंट्रोलर्स (Asp.Net MVC के मामले में) के लिए यूनिट टेस्ट लिख रहा हूं, तो मुझे उन्हें परीक्षण करने की आवश्यकता नहीं है
jao

4
@ Theomax संदर्भ पर निर्भर करता है: यदि आप एक सॉफ्टवेयर घटक का परीक्षण कर रहे हैं जो कि आपका नहीं हैExampleRepository , तो मॉक का उपयोग करना सबसे अच्छा है। औचित्य यह है कि आप भंडार का परीक्षण नहीं कर रहे हैं बल्कि कुछ और है।
एंड्रेस एफ।

5
@ Theomax AndresF की टिप्पणी का विस्तार करने के लिए: यदि आप इकाई परीक्षण कर रहे हैं ExampleRepository, तो असली चीज़ का उपयोग करें। आप इकाई परीक्षण कर रहे हैं RepositoryController, तो यह चाहिए केवल एक का उपयोग FakeExampleRepositoryकि रिटर्न पूर्व निर्दिष्ट मानों। इस तरह, यदि बग बग में बंद हो जाता है ExampleRepository, तो केवल वह इकाई परीक्षण विफल हो जाएगा - RepositoryControllerपरीक्षण सफल होते रहेंगे, इसलिए आप जानते हैं कि वहां कोई बग नहीं है। यदि नियंत्रक ने वास्तविक रिपॉजिटरी का उपयोग किया है, तो वे दोनों विफल हो जाएंगे और आपको पता नहीं चलेगा कि आपके पास 1 बग या 2. है
इज़कटा

5

मैं jk से दो जवाबों से सहमत हूं। और जान हुडेक - वे कुछ अच्छी जानकारी देते हैं। लेकिन मुझे लगा कि मैं थोड़ा जोड़ दूंगा।

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

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

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


the real objective is to test the classes that are utilizing the IExampleRepository interfaceयह कड़ाई से सच नहीं है। इसका उद्देश्य IExampleRepository की स्वतंत्र रूप से जांच करना है । हालांकि एक अच्छा अलगाव ढांचे की सिफारिश करने के लिए +1।
स्टुपरयूसर

1
मैं असहमत हूं। यह स्वतंत्र नहीं है IExampleRepositoryक्योंकि परीक्षण के तहत वर्ग उस इंटरफ़ेस के लिए युग्मित है। लेकिन यह इंटरफ़ेस के किसी भी कार्यान्वयन से स्वतंत्र है । मैं मानता हूँ कि मेरी व्याख्या शायद थोड़ा और चालाकी का उपयोग कर सकती है। :)
एलन

5

यहाँ वास्तव में उद्देश्य क्या है?

एकांत।

एक इकाई का विचार कोड की सबसे छोटी संभव इकाई का परीक्षण करने के लिए इसका परीक्षण करता है । आप इसे परीक्षण में अन्य सभी उत्पादन कोड से अलग करके करते हैं ।

फर्जी कक्षाएं बनाकर एकमात्र उत्पादन कोड परीक्षण के तहत वर्ग है।

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

आइसोलेशन फ्रेमवर्क पर एक नज़र डालें (जैसे कि Moq ( @Allan द्वारा सुझाए गए अनुसार) इन फेक जेनरेट करने के लिए टेस्ट परिस्थितियों को जल्दी से जेनरेट करने में सक्षम हैं और उनके खिलाफ दावा करने के लिए उपयोग करें।



4

तीन कारण हैं कि आप इकाई परीक्षण के लिए नकली उदाहरण कैसे प्रदान करना चाहते हैं:

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