टीडीएस रिपोजिटरी पैटर्न के साथ


10

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

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

मैं दो दिनों से इस बारे में सोच रहा हूं और अभी भी किसी भी उचित समाधान के साथ नहीं आ सकता। मुझे क्या करना चाहिए?

जवाबों:


11

एक रिपॉजिटरी जो आपके डोमेन से आपके DAL फ्रेमवर्क पर अनुवाद करती है, जैसे कि NHibernate या Doctrine, या आपकी SQL-execing कक्षाएं। इसका मतलब यह है कि आपका भंडार अपने कर्तव्यों को पूरा करने के लिए उक्त ढांचे पर तरीकों को कॉल करेगा: आपका भंडार डेटा को लाने के लिए आवश्यक प्रश्नों का निर्माण करता है। यदि आप ORM- फ्रेमवर्क का उपयोग नहीं कर रहे हैं (मुझे आशा है कि आपके हैं ...), रिपॉजिटरी वह जगह होगी जहां कच्चे SQL- स्टेटमेंट बनाए जाते हैं।

इन तरीकों में से सबसे बुनियादी है सेव: ज्यादातर मामलों में यह ऑब्जेक्ट को कार्य की इकाई (या सत्र) पर रिपॉजिटरी से पास करेगा।

public void Save(Car car)
{
    session.Save(car);
}

लेकिन आइए एक और उदाहरण देखते हैं, उदाहरण के लिए एक कार को अपनी आईडी द्वारा लाना। ऐसा लग सकता है

public function GetCarWithId(String id)
{
    return Session.QueryOver<Car>()
                    .Where(x => x.Id == id)
                    .SingleOrDefault();
}

अभी भी बहुत जटिल नहीं है, लेकिन आप कई स्थितियों के साथ कल्पना कर सकते हैं (2010 में 'वोक्सवैगन' समूह के सभी ब्रांडों के लिए बनाई गई सभी कारें प्राप्त करें) यह मुश्किल हो जाता है। तो सही TDD फैशन में आपको यह परीक्षण करने की आवश्यकता है। इसे करने बहुत सारे तरीके हैं।

विकल्प 1: ओआरएम फ्रेमवर्क में की गई कॉल को मॉक करें

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

विकल्प 2: (Re) डेटाबेस को परीक्षणों से बनाएँ

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

विकल्प 3: एक वास्तविक डेटाबेस पर परीक्षण करें

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

DAL का परीक्षण न करें

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

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

Test यूनिट टेस्ट ’सिर्फ एक नाम है

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


3
यूनिट परीक्षणों और एकीकरण परीक्षणों के अलग-अलग उद्देश्य हैं। इन परीक्षणों के नाम केवल सजावटी नहीं हैं; वे वर्णनात्मक भी हैं।
रॉबर्ट हार्वे

9
  1. तुच्छ या स्पष्ट रिपॉजिटरी विधियों का परीक्षण न करें।

    यदि विधियां तुच्छ CRUD ऑपरेशन हैं, तो आप वास्तव में परीक्षण कर रहे हैं कि क्या पैरामीटर सही ढंग से मैप किए गए हैं। यदि आपके पास एकीकरण परीक्षण हैं, तो ऐसी त्रुटियां वैसे भी तुरंत स्पष्ट हो जाएंगी।

    यह एक ही सिद्धांत है जो तुच्छ गुणों पर लागू होता है, जैसे यह:

    public property SomeProperty
    {
        get { return _someProperty; }
        set { _someProperty = value; }
    }
    

    आप इसका परीक्षण नहीं करते, क्योंकि परीक्षण करने के लिए कुछ भी नहीं है। जिस संपत्ति को सत्यापित करने की आवश्यकता है, उसमें कोई सत्यापन या अन्य तर्क नहीं है।

  2. यदि आप अभी भी उन तरीकों का परीक्षण करना चाहते हैं ...

    मोक्स इसे करने का तरीका है। याद रखें, ये यूनिट टेस्ट हैं। आप यूनिट परीक्षणों के साथ डेटाबेस का परीक्षण नहीं करते हैं; एकीकरण टेस्ट यही हैं।

अधिक जानकारी
पूर्ण स्टैक, भाग 3: टीडीडी का उपयोग करके एक रिपॉजिटरी का निर्माण (लगभग 16 मिनट देखना शुरू करना)।


3
ज़रूर, मैं यह समझता हूँ। फिर भी, अगर यह टीडीडी दृष्टिकोण है, तो मुझे किसी भी कोड को नहीं लिखना चाहिए अगर मेरे पास इस कोड के लिए परीक्षण नहीं हैं, ठीक है?
Thaven

1
@Thaven - youtube पर वीडियो की एक श्रृंखला है जिसका शीर्षक है "tdd dead?"। उन्हे देखे। वे बहुत सारे दिलचस्प बिंदुओं को संबोधित करते हैं, जिनमें से एक यह धारणा है कि आपके आवेदन के हर स्तर पर टीडीडी को लागू करना सबसे अच्छा विचार नहीं है। "असफल परीक्षण के बिना कोई कोड" बहुत अधिक स्थिति नहीं है, निष्कर्ष में से एक है।
जूल्स

2
@ जूल्स: टीएल
रॉबर्ट हार्वे

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

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