2010-07-24 7 views
5

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

मैं यहां और वहां पढ़ रहा हूं और मुझे मिलाकर मॉकिंग के बारे में सबसे आकर्षक चीज परत अलगाव था।

उत्तर

2

क्या आप लोग कहते हैं कि मैक्स का उपयोग मोजे का उपयोग न करने से बेहतर है?

कार चलाने से मोटरबाइक बेहतर चल रहा है? यह निर्भर करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं :)।

मैक्स का उपयोग क्यों करें?

मैक्स बनाम राज्य-आधारित परीक्षण: जबकि मुझे आम तौर पर राज्य-आधारित परीक्षण पसंद है क्योंकि यह अधिक ठोस/सीधे आगे लगता है, अक्सर यह मामला है कि मोजे का उपयोग करना यह सत्यापित करने का एकमात्र तरीका है कि कोड की एक इकाई इसकी भूमिका निभाती है सही ढंग से। क्यूं कर? खैर, tell, don't ask principle के साथ दिमाग में डिजाइन करते समय, कक्षाएं अक्सर आपकी अपेक्षाओं को सत्यापित करने के लिए पर्याप्त डेटा का पर्दाफाश नहीं करती हैं, इसलिए इसे सही तरीके से काम करने की पुष्टि करने का एकमात्र तरीका अन्य सहयोगियों के साथ अपने व्यवहार/बातचीत की जांच करना है।

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

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

क्या मुझे उत्पादन कोड में मोजे का उपयोग करना चाहिए?

केवल इकाई परीक्षण में इस्तेमाल किया है ठट्ठा करके या यह असली वस्तु के रूप में मूल परियोजना में सीधे इस्तेमाल किया जा सकता है और बाद यह स्विच?

"मजाक" द्वारा आप एक "एक 'झूठे' प्रकार है कि में बदली जा सकती है और एक समझदार तरीके से व्यवहार" का उपयोग मतलब है, तो हाँ - मैं अक्सर उपयोग किया है इस तरह के एक के रूप में 'झूठे' प्रकार मेमोरी डिक्शनरी में डाटाबेस कनेक्शन के लिए विकल्प और आगे। वे गैर-लाइव उत्पादन कोड में उपयोगी स्टॉपगैप के रूप में कार्य कर सकते हैं।

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

यदि दूसरी तरफ, "मॉकिंग" से आपका मतलब है "उत्पादन कोड में एक मॉकिंग फ्रेमवर्क का उपयोग करना", तो नहीं - मैं ऐसा करने की अनुशंसा नहीं करता, मैं नकली कार्यान्वयन को हाथ से लिखूंगा और निर्भरता से मुक्त रहें, साथ ही इसके बारे में तर्क और डीबग करना आसान होगा।

6

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

गतिशील भाषाओं में, वे कड़ाई से जरूरी नहीं हैं। लेकिन मॉकिंग ढांचे आपको यह सत्यापित करने में मदद कर सकता है कि नकली पर आपके द्वारा निर्धारित अपेक्षाएं पूरी की जाती हैं।

आपको वास्तविक कार्यान्वयन के रूप में कभी भी नकली का उपयोग नहीं करना चाहिए। उस तरह की चीज चुटकुले की चीजें है। "हम सिर्फ पूरे आवेदन का मज़ाक उड़ा सकते हैं! हाँ!" क्या इंटरफेस/समकक्ष हैं ...

+1

मोज़े के साथ दूसरी आसान चीज - वे वास्तविक चीज़ की तुलना में अक्सर बहुत तेज़ी से स्थापित होते हैं (विशेष रूप से यदि कहें, वास्तविक चीज़ डीबी-बंधी है), परीक्षणों को बहुत तेज़ी से चलाना। – Amber

+0

बहुत सच है। अच्छा जोड़ा – hvgotcodes

+0

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

6

आखिरकार, यह तर्क दिया जा सकता है कि यह "ऐसा करने का एक और तरीका है।" सॉफ्टवेयर दशकों से लिखा गया था और मजाक करने की अनुपस्थिति में लिखा जाना जारी है।

यह मुख्य रूप से यूनिट परीक्षण की सुविधा है।

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

निम्नलिखित पर विचार करें:

  • मैं ClassA बना सकते हैं और अपने व्यवहार को सत्यापित करने के लिए परीक्षण लिखना चाहते हैं।
  • मैं परीक्षा लिखना शुरू करता हूं (डिज़ाइन को चलाने के लिए पहले परीक्षण)।
  • ओप्स, ClassA को RepositoryM से डेटा प्राप्त करने की आवश्यकता है।
  • मैं RepositoryM लागू करूंगा ताकि मैं ClassA का परीक्षण कर सकूं।
  • ओह, लेकिन पहले RepositoryM के लिए परीक्षण लिखें।
  • डार्न, RepositoryM को इसके डेटा को पॉप्युलेट करने के लिए वास्तव में ServiceX की आवश्यकता है।
  • मैं लागू करेंगे ServiceX तो मैं परीक्षण करने और RepositoryM लागू कर सकते हैं तो मैं परीक्षण करने और ClassA

लागू कर सकते हैं ... और पर और पर।

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

एक मॉकिंग फ्रेमवर्क का उपयोग करके परीक्षण निर्माण बहुत तेज़ हो जाता है।

मॉकिंग/स्टबिंग में सहायक लाभ हैं - जिनमें से एक कार्यान्वयन के बजाय अवशोषण के लिए प्रोग्रामिंग का प्रवर्तन है।

+0

जब आप परीक्षण के लिए कक्षा को अलग करना चाहते हैं तो मॉकिंग चमकती है; आपको मॉकिंग के लिए टीडीडी की आवश्यकता नहीं है। – hvgotcodes

+0

@hvgotcodes बेशक; मेरे उत्तर का केवल एक हिस्सा टीडीडी से संबंधित है, और उस हिस्से में मैं कह रहा हूं कि मॉकिंग टीडीडी के लिए बहुत महत्वपूर्ण है क्योंकि यह इस अलगाव की अनुमति देता है। मेरा मतलब आपके द्वारा प्रदान की गई जानकारी को बढ़ाने के लिए किया गया था। – Jay

संबंधित मुद्दे

 संबंधित मुद्दे