TDD मॉक कॉल सत्यापन - क्या यह एक विरोधी पैटर्न है?


11

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


2
संक्षिप्त उत्तर: हाँ। यहां पहले से ही इस विषय के बारे में बहुत दिलचस्प सवाल हैं। आपकी इकाई परीक्षण नाजुक नहीं होना चाहिए और आपके कार्यान्वयन पर बहुत अधिक निर्भर करेगा। यही कारण है कि उच्च स्तरीय परीक्षण (एकीकरण आदि) के लिए हैं। यहाँ: programmers.stackexchange.com/questions/198453/…
केमोडा

@ केमोडा मैं इसकी सराहना करूंगा यदि आप मुझे इस पर चर्चा या कुछ और सामग्री से जोड़ सकते हैं, तो मैं अपनी तकनीकों में सुधार करना चाहूंगा।
दिमितर दिमित्रोव

जवाबों:


8

ठीक है, आपको इनपुट और आउटपुट का परीक्षण करने की कोशिश करनी चाहिए। आपको बाह्य रूप से दृश्य व्यवहार की पुष्टि करनी चाहिए। "वादे" या "अनुबंध" जो आपकी कक्षा बनाती है।

एक ही समय में कभी-कभी एक विधि का परीक्षण करने का कोई बेहतर तरीका नहीं होता है कि आपने क्या कहा।

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


2

एक परीक्षण का उद्देश्य संभव उत्पादक कार्यान्वयन को प्रतिबंधित करना है। सुनिश्चित करें कि आपने केवल उस कार्यान्वयन पर प्रतिबंध लगाया है जिसकी आपको वास्तव में आवश्यकता है। आमतौर पर यह वही है जो आपके कार्यक्रम को करना चाहिए, न कि यह कैसे करता है।

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

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


"तो लेकिन क्या होगा अगर परीक्षण में वास्तविक कार्यान्वयन का उपयोग करना महंगा है (जैसे कि क्योंकि उन्हें संसाधनों की आवश्यकता होती है जो स्थापित करने के लिए जटिल हैं)? मुझे इस मामले में नकली का उपयोग करने की आवश्यकता है, है ना?"

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

इस मामले में मोज़ेक का उपयोग बुरी तरह से पृथक तर्क के एक टुकड़े के परीक्षण के दर्द को कम करता है, और इसलिए एक वास्तुशिल्प समस्या को छुपाता है । इसलिए बुरी तरह से संरचित कोड का परीक्षण करने के लिए मोक्स का उपयोग न करें, लेकिन इसके बजाय संरचना को ठीक करें।


1
मैं देख रहा हूं कि तुम क्या कह रहे हो। यह विषय "कितना परीक्षण बहुत अधिक परीक्षण है" के रूप में थोड़ा भ्रमित है, मान लीजिए कि मेरे पास एक "समग्र सेवा" है जो मूल रूप से एक मुखौटा है और अन्य सेवाओं / रिपॉजिटरी / घटकों के एक साथ गुच्छा "glues" है जो किस प्रकार के परीक्षण हैं क्या आप इसके लिए लिखते हैं? सभी मैं कॉल वेरिफिकेशन के बारे में सोच सकता हूं। मुझे उम्मीद है कि मैं समझदारी बना रहा हूं।
दिमित्र दिमित्रोव 8

2

मेरे विचार फिर से: 'समग्र सेवाएं'।

कॉल सत्यापन यह करेगा, लेकिन बहुत अधिक मूल्य प्रदान नहीं करेगा। आप बस अपनी वायरिंग चेक कर रहे हैं।

इसके लिए 3, गैर-अनन्य, अन्य तरीके हैं:

  1. प्रत्येक व्यक्तिगत सेवा के लिए आपके पास परीक्षण बढ़ाएँ ताकि यह उच्च स्तर के व्यवहार की जाँच करे। उदाहरण के लिए, यदि आपकी यूनिट की सेवा के इन-मेमोरी डेटाबेस को हिट करने के बाद, इसे एक स्तर तक ले जाते हैं, तो आप सेवा को वास्तविक db के विरुद्ध परीक्षण कर रहे हैं। सेवा की परत अमूर्त पेड़ से ऊपर है, और इसलिए आपका परीक्षण होना चाहिए।

  2. एकत्रित सेवाओं से सीधे सेवा बनाने के लिए कोड पीढ़ी का उपयोग करें।

  3. समान कार्य करने के लिए किसी प्रकार के प्रतिबिंब या गतिशील भाषा का उपयोग करें। उदाहरण के लिए, जावा में, ग्रूवी इंटरफ़ेस का उपयोग करना संभव हो सकता है, जो सीधे कॉल को पास करता है।

ऐसा करने के लिए शायद अन्य तरीके हैं, लेकिन बस चेकिंग वायरिंग में बहुत कम वेतन वापस मिलता है, और इस कार्यान्वयन में आपको कड़ी मेहनत करनी पड़ेगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.