"कितना सही है?"


10

मैंने सवाल का मजाक उड़ाया क्योंकि मुझे यकीन है कि "यह निर्भर करता है," लेकिन मेरे पास कुछ विशिष्ट प्रश्न हैं।

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

इसलिए मुझे आश्चर्य हुआ कि रॉय ओशेरोव ने इस वीडियो में सुझाव दिया था कि आपको केवल 5% समय का उपयोग करके कुछ मजाक करना चाहिए। मुझे लगता है कि हम कहीं 70-90% के बीच बैठे हैं। मैंने समय-समय पर इसी तरह के अन्य मार्गदर्शन देखे हैं ।

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

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

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

एक वस्तु मॉडल को निम्नानुसार दिया गया है:

यहां छवि विवरण दर्ज करें

... यह भी विचार करें कि हमारे आवेदन की निर्भरता गहराई इस छवि में फिट होने की तुलना में बहुत अधिक गहराई तक जाती है, ताकि 2-4 परत और 5-13 परत के बीच कई परतें एन हो।

अगर मैं यूनिट # 1 में किए जा रहे कुछ सरल तार्किक निर्णय का परीक्षण करना चाहता हूं, और यदि प्रत्येक निर्भरता कोड मॉड्यूल में निर्माता-इंजेक्ट है जो इस पर निर्भर करता है कि, जैसे, 2, 3, और 4, निर्माता 1 में इंजेक्ट किए गए हैं। छवि, मैं बहुत से 2, 3 और 4 के नकली को 1 में इंजेक्ट करूंगा।

अन्यथा, मुझे 2, 3, और 4 के ठोस उदाहरणों का निर्माण करने की आवश्यकता होगी। यह केवल कुछ अतिरिक्त टाइपिंग की तुलना में अधिक कठिन हो सकता है। अक्सर 2, 3, और 4 में कंस्ट्रक्टर की आवश्यकताएं होंगी जो संतुष्ट करने के लिए चुनौतीपूर्ण हो सकती हैं और ग्राफ के अनुसार (और हमारी परियोजना की वास्तविकता के अनुसार), मुझे 13 के माध्यम से एन के ठोस उदाहरणों का निर्माण करने की आवश्यकता होगी 2, 3, और 4।

यह स्थिति तब और अधिक चुनौतीपूर्ण हो जाती है जब मुझे कुछ निश्चित तरीके से व्यवहार करने के लिए 2, 3, या 4 की आवश्यकता होती है ताकि मैं # 1 में सरल तार्किक निर्णय का परीक्षण कर सकूं। मुझे आवश्यक तरीके से व्यवहार करने के लिए 2, 3, या 4 प्राप्त करने के लिए एक ही बार में पूरे ऑब्जेक्ट ग्राफ / ट्री के बारे में समझने और "मानसिक रूप से कारण" की आवश्यकता हो सकती है। यह अक्सर बहुत आसान लगता है myMockOfModule2.Setup (x => x.GoLeftOrRight) ()) रिटर्न (नया अधिकार ()); उस मॉड्यूल का परीक्षण करने के लिए जब मॉड्यूल 2 सही होने के लिए कहता है, तो अपेक्षित रूप से प्रतिक्रिया करता है।

अगर मुझे 2 ... N ... 13 सभी के ठोस उदाहरणों का परीक्षण करना था, तो परीक्षण सेटअप बहुत बड़े और ज्यादातर नकल वाले होंगे। परीक्षण विफलताओं, प्रतिगामी विफलताओं के स्थानों को इंगित करने का एक बहुत अच्छा काम नहीं कर सकते हैं। टेस्ट स्वतंत्र नहीं होंगे ( एक अन्य सहायक लिंक )।

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

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


यह मुझे लगता है कि आपके आवेदन को शिथिल युग्मन से लाभ हो सकता है। en.wikipedia.org/wiki/Loose_coupling
रॉबर्ट हार्वे

1
Or is there perhaps some assumption in typical unit testing guidance that the layers of dependency in most applications will be shallow enough that it is indeed reasonable to test all of the code modules integrated together (making our case "special")? <- यह।
रॉबर्ट हार्वे

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

मुझे मूल पोस्ट में स्पष्ट होना चाहिए था, यह कहने के लिए कि मॉड्यूल 1 केवल I2, I3 और I4 के बारे में पता है। मॉड्यूल 2 केवल I5, I6 और I7 से अवगत है। यह मॉक का उपयोग किए बिना परीक्षण का केवल संदिग्ध लक्ष्य है कि मैं वर्णित चुनौतियों के लिए एक ठोस 2, 3 और 4 से 1 प्रदान करूंगा। अन्यथा, हम समय के 5% से अधिक मॉक का उपयोग करके हवा देते हैं।
धनु

मैंने अपने मामले के बारे में मजाक में कहा कि "विशेष" एक ब्लॉग पोस्ट को पढ़ने के बाद कई टीमों ने मूल्यवान सम्मेलनों को टाल दिया क्योंकि उन्होंने गलत तरीके से महसूस किया कि उनकी स्थिति "विशेष" थी। लेकिन अगर यह वास्तव में हमारा मामला है, तो यह मेरे द्वारा पढ़े गए सामुदायिक मार्गदर्शन और मेरी टीम के कुछ वास्तविक अनुभवों के बीच असमानता को स्पष्ट करेगा। (5% बनाम 70-90%)
ardave

जवाबों:


4

क्या हमारी टीम मॉक ओवर कर रही है?

पहली नज़र में नहीं।

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

व्यक्तिगत रूप से, मैं सभी टेस्ट ऑब्जेक्ट्स को "मोक्स" कहता हूं क्योंकि उनमें से विभिन्न के बीच अंतर करना अक्सर उपयोगी नहीं होता है। जब तक वे मेरे यूनिट परीक्षणों को तेज, पृथक और लचीला रखते हैं ... मुझे परवाह नहीं है कि वे क्या नाम रखते हैं।


मुझे आश्चर्य होगा कि अगर वहाँ किसी भी सामान्य मार्गदर्शन के लिए है जब यह अलगाव में कोड मॉड्यूल का परीक्षण करने के लिए सबसे अच्छा है। एक से अधिक कोड मॉड्यूल का परीक्षण, एक साथ एकीकृत। ऐसा लगता है जैसे ही मैं किसी भी दो मॉड्यूल को एकीकृत करता हूं जिसे मैं अन्यथा अलग-थलग कर सकता था, मैं खुद को अवांछनीय मुद्दों के मेजबान के लिए खोल देता हूं: प्रतिगमन कारणों के पिनपॉइंटिंग का अभाव / एक ही प्रतिगमन के लिए कई परीक्षण विफल, अत्यधिक परीक्षण सेटअप आदि। मेरी अपनी सहज समझ है ("परीक्षणों को सुनो") लेकिन इसने मुझे 70-90% नकली स्तर पर छोड़ दिया है।
ardave

1
@ गनो - मेरे अनुभव में, आपको अलगाव में सब कुछ परीक्षण करना चाहिए, आपके द्वारा बताए गए कारणों के लिए। केवल एक चीज जो आप अलगाव में इकाई परीक्षण नहीं करते हैं वे चीजें हैं जो आप नहीं कर सकते हैं क्योंकि वे सीधे किसी फाइल सिस्टम या अन्य बाहरी संसाधन के खिलाफ जाते हैं ( कुछ को ऐसा करना पड़ता है)।
तेलस्टिन

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