क्या यूनिट परीक्षणों का एक बिंदु है जो सब कुछ सार्वजनिक रूप से ठूंठ और नकली करता है?


59

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

यूनिट परीक्षण एक विशाल विषय है, और मुझे लगता है कि मैं यहां कुछ नहीं समझ रहा हूं। एकीकरण परीक्षण बनाम यूनिट परीक्षण का निर्णायक लाभ (ओवरहेड को छोड़कर)?


4
मेरे दो सेंट: मोक्स
जुआन मेंडेस

1
यह भी देखें "
मॉकिंग इज

जवाबों:


37

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

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

इस प्रकार का कोड यूनिट-टेस्ट के लिए वास्तव में कठिन है, आपके द्वारा उल्लिखित कारणों के लिए।

ऐसी कक्षाओं में विभाजित करने के लिए मुझे जो मदद मिली है वह है:

  1. वास्तविक "व्यावसायिक तर्क" के साथ कक्षाएं। ये अन्य कक्षाओं के लिए कुछ या नहीं कॉल का उपयोग करते हैं और परीक्षण करने के लिए आसान होते हैं (मूल्य - इन - आउट आउट)।
  2. कक्षाएं जो बाह्य सिस्टम (फाइल, डेटाबेस, आदि) के साथ इंटरफेस करती हैं। ये बाहरी प्रणाली को लपेटते हैं और आपकी आवश्यकताओं के लिए एक सुविधाजनक इंटरफ़ेस प्रदान करते हैं।
  3. कक्षाएं जो "सब कुछ एक साथ बाँधती हैं"

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

2. और 3. से कक्षाएं आमतौर पर सार्थक रूप से इकाई-परीक्षण नहीं की जा सकती हैं (क्योंकि वे अपने आप में कुछ भी उपयोगी नहीं करते हैं, वे सिर्फ "गोंद" कोड हैं)। OTOH, इन वर्गों को अपेक्षाकृत सरल (और कुछ) होते हैं, इसलिए उन्हें एकीकरण परीक्षणों द्वारा पर्याप्त रूप से कवर किया जाना चाहिए।


एक उदाहरण

कक्षा प्रथम

मान लें कि आपके पास एक वर्ग है जो डेटाबेस से एक मूल्य प्राप्त करता है, कुछ छूट लागू करता है और फिर डेटाबेस को अपडेट करता है।

यदि आपके पास एक कक्षा में यह सब है, तो आपको डीबी फ़ंक्शन को कॉल करना होगा, जो मॉक करना मुश्किल है। छद्मकोश में:

1 select price from database
2 perform price calculation, possibly fetching parameters from database
3 update price in database

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

अलग होना

आप तीन वर्गों में विभाजित हैं: PriceCalacle, PriceRepository, App।

PriceCalacle केवल वास्तविक गणना करता है, और इसके लिए आवश्यक मान प्रदान करता है। अनुप्रयोग सब कुछ एक साथ जोड़ता है:

App:
fetch price data from PriceRepository
call PriceCalculation with input values
call PriceRepository to update prices

उस तरफ:

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

अंत में, यह PriceCalacle अपना खुद का डेटाबेस कॉल करना चाहिए। उदाहरण के लिए, क्योंकि केवल PriceCalacle जानता है कि उसकी जरूरतों के हिसाब से कौन सा डेटा है, इसलिए इसे App द्वारा अग्रिम में नहीं लाया जा सकता है। फिर आप इसे PriceRepository (या कुछ अन्य रिपॉजिटरी वर्ग) का एक उदाहरण दे सकते हैं, जो PriceCalacle की आवश्यकताओं के अनुरूप है। तब इस वर्ग का मज़ाक उड़ाया जाएगा, लेकिन यह सरल होगा, क्योंकि PriceRepository का इंटरफ़ेस सरल है, उदा PriceRepository.getPrice(articleNo, contractType)। सबसे महत्वपूर्ण बात, PriceRepository का इंटरफ़ेस, PriceCalacle को डेटाबेस से अलग करता है, इसलिए DB स्कीमा या डेटा संगठन में परिवर्तन इसके इंटरफ़ेस को बदलने की संभावना नहीं है, और इसलिए मोक्स को तोड़ने के लिए।


5
मुझे लगा कि मैं अकेले ही यूनिट टेस्टिंग में सबकुछ नहीं देख रहा था, धन्यवाद
at13

4
जब आप कहते हैं कि मैं असहमत हूं तो टाइप 3 की कक्षाएं कम हैं, मुझे ऐसा लगता है कि मेरा अधिकांश कोड टाइप 3 का है और लगभग सभी व्यावसायिक तर्क हैं। यह मेरा मतलब है: stackoverflow.com/questions/38496185/…
रॉड्रिगो Ruiz

27

एकीकरण परीक्षण बनाम इकाई परीक्षण का निर्णायक लाभ क्या है?

वह झूठा द्वैतवाद है।

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

एकीकरण परीक्षण अलग हैं। एकीकरण परीक्षण सॉफ्टवेयर घटकों के बीच बातचीत का अभ्यास करते हैं। आपके पास ऐसे सॉफ़्टवेयर घटक हो सकते हैं जो उनके सभी परीक्षणों को पास करते हैं और फिर भी एकीकरण परीक्षणों को विफल करते हैं क्योंकि वे ठीक से बातचीत नहीं करते हैं।

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

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

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


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

यदि आप बहुत समय तुच्छ कोड के लिए यूनिट परीक्षण लिखने की तरह खर्च कर रहे हैं

public string SomeProperty { get; set; }

तो आपको अपने दृष्टिकोण को फिर से जांचना चाहिए। यूनिट टेस्टिंग को व्यवहार का परीक्षण करना है, और ऊपर कोड की लाइन में कोई व्यवहार नहीं है। हालाँकि, आपने कहीं न कहीं अपने कोड में एक निर्भरता बनाई है, क्योंकि वह संपत्ति लगभग निश्चित रूप से आपके कोड में कहीं और संदर्भित होने वाली है। ऐसा करने के बजाय, लेखन विधियों पर विचार करें जो आवश्यक संपत्ति को एक पैरामीटर के रूप में स्वीकार करते हैं:

public string SomeMethod(string someProperty);

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


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

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

2
समझ में आता है, लेकिन अभी भी अन्य सभी सार्वजनिक कॉल (डीबी, कुछ 'ग्लोबल्स', जैसे कि वर्तमान उपयोगकर्ता स्थिति आदि) को स्टुब करना है और परीक्षण विधि के बाद विधि तर्क के साथ समाप्त होना है।
उत्साह

1
इसलिए मुझे लगता है कि यूनिट परीक्षण ज्यादातर अलग-थलग पड़े सामानों के लिए हैं, जो 'इनपुट के सेट -> अपेक्षित परिणामों के सेट' की पुष्टि करते हैं?
प्रात:

1
बहुत सारी यूनिट और इंटीग्रेशन टेस्ट बनाने में मेरा अनुभव (एडवांस्ड मॉकिंग, इंटीग्रेशन टेस्टिंग और उन टेस्ट द्वारा उपयोग किए गए कोड कवरेज टूल्स का उल्लेख नहीं करना है) आपके अधिकांश दावों का विरोधाभास यहाँ है: 1) "यूनिट टेस्टिंग का उद्देश्य यह सुनिश्चित करना है कि आपका कोड वह करता है जो इसे माना जाता है ": एकीकरण परीक्षण के लिए भी यही लागू होता है (और भी बहुत कुछ); 2) "यूनिट परीक्षण स्थापित करना बहुत आसान है": नहीं, वे नहीं हैं (बहुत बार, यह एकीकरण परीक्षण है जो आसान हैं); 3) "जब ठीक से उपयोग किया जाता है, तो यूनिट परीक्षण" परीक्षण योग्य "कोड" के विकास को प्रोत्साहित करते हैं: एकीकरण परीक्षणों के साथ ही; (जारी है)
रोजेरियो

4

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

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

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

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

यूनिट परीक्षणों ने मुझे अपने विकास में मदद की है क्योंकि मैं एक समय में आवेदन के एक टुकड़े पर ध्यान केंद्रित कर सकता हूं। उन घटकों का मजाक उड़ाया जो मैंने अभी तक नहीं बनाए हैं। वे प्रतिगमन के लिए भी एक महान हैं, क्योंकि वे तर्क में किसी भी कीड़े को दस्तावेज करते हैं जो मैंने पाया है (यहां तक ​​कि इकाई परीक्षणों में भी)।

अपडेट करें

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

इस पद्धति का परीक्षण कभी नहीं बदल सकता है या केवल तभी बदल सकता है जब आप तरीके बदल रहे हों। यह बुरी बात क्यों है? यह परीक्षणों का उपयोग करके सुदृढ़ करने में मदद करता है। यदि आपको कोड बदलने के बाद एक परीक्षण ठीक करना है, तो आपको कोड के साथ परीक्षण बदलने की आदत होगी।


और अगर कोई विधि कुछ भी निजी नहीं कहती है, तो इसका परीक्षण करने का कोई मतलब नहीं है?
उत्साह

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

नहीं, मेरा मतलब है कि अगर कोई सार्वजनिक पद्धति कुछ भी निजी नहीं कहती है, तो क्या उस सार्वजनिक पद्धति का परीक्षण करने का कोई मतलब है?
उत्साह

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

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

3

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

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

दरअसल, अत्यधिक मॉकिंग एक एंटी-पैटर्न है: टीडीडी एंटी-पैटर्न और मॉक्स बुराई हैं


0

हालाँकि ऑप ने पहले ही एक उत्तर अंकित कर दिया है, मैं यहाँ केवल अपने 2 सेंट जोड़ रहा हूँ।

एकीकरण परीक्षण बनाम यूनिट परीक्षण का निर्णायक लाभ (ओवरहेड को छोड़कर)?

और के जवाब में भी

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

एक मददगार है, लेकिन ठीक वैसा नहीं है जैसा ओपी ने पूछा है:

यूनिट टेस्ट काम करते हैं लेकिन अभी भी कीड़े हैं?

सुइट्स के परीक्षण के अपने छोटे से अनुभव से, मैं समझता हूं कि यूनिट टेस्ट हमेशा एक क्लास की सबसे बुनियादी विधि स्तर की कार्यक्षमता का परीक्षण करने के लिए होते हैं। मेरी राय में हर विधि या तो सार्वजनिक, निजी या आंतरिक रूप से एक समर्पित इकाई परीक्षण के योग्य है। यहां तक ​​कि मेरे हाल के अनुभव में मेरे पास एक सार्वजनिक तरीका था जो अन्य छोटी निजी पद्धति को बुला रहा था। तो, दो दृष्टिकोण थे:

  1. निजी विधि के लिए एक इकाई परीक्षण (ओं) का निर्माण न करें।
  2. एक निजी विधि के लिए एक यूनिट टेस्ट (ओं) बनाएँ।

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


मामले को ध्यान में रखते हुए जब निजी विधि का कई अन्य सार्वजनिक तरीकों से पुन: उपयोग किया जाता है।

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

यदि मैंने दृष्टिकोण 2 को चुना था: इकाई परीक्षणों के लिए लिखा गया कोड अपेक्षाकृत कम होगा, और यह परीक्षण करना बहुत आसान होगा।


मामले को देखते हुए जब निजी विधि का पुन: उपयोग नहीं किया जाता है, तो उस विधि के लिए एक अलग इकाई परीक्षण लिखने का कोई मतलब नहीं है।

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

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