(क्यों) यह महत्वपूर्ण है कि एक इकाई परीक्षण निर्भरता का परीक्षण नहीं करती है?


103

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

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

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

इसका दूसरा पक्ष क्या है? क्या यह वास्तव में महत्वपूर्ण है कि एक इकाई परीक्षण भी इसकी निर्भरता का परीक्षण नहीं करता है? यदि हां, तो क्यों?

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


14
"अतिरंजना, अच्छा डिजाइन नहीं"। आपको इससे अधिक सबूत देने होंगे। बहुत सारे लोग इसे "ओवर इंजीनियरिंग" नहीं कहेंगे, लेकिन "सर्वश्रेष्ठ अभ्यास"।
एस.लॉट।

9
@ एस.लॉट: बेशक यह व्यक्तिपरक है। मैं सिर्फ इस मुद्दे पर बत्तख़ का जवाब नहीं चाहता था और कह रहा था कि मज़ाक करना अच्छा है क्योंकि आपके कोड को नकली बनाने से अच्छे डिज़ाइन को बढ़ावा मिलता है। आम तौर पर, हालांकि, मैं ऐसे कोड से निपटने से नफरत करता हूं जो उन तरीकों से डिकॉउंड किए जाते हैं जिनका अब कोई स्पष्ट लाभ नहीं है या भविष्य के निकट भविष्य में। यदि आपके पास अभी कई कार्यान्वयन नहीं हैं और उन्हें भविष्य के निकट भविष्य में होने का अनुमान नहीं है, तो IMHO आपको इसे कठिन कोड बनाना चाहिए। यह सरल है और ग्राहक को किसी वस्तु की निर्भरता के विवरण के साथ बोर नहीं करता है।
dsimcha

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

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

आप जो भी भेद कर रहे हैं उसे स्पष्ट करने के लिए अपने प्रश्न को अपडेट करने पर विचार करें । टिप्पणियों के अनुक्रम को एकीकृत करना मुश्किल है। कृपया इसे स्पष्ट करने और ध्यान केंद्रित करने के लिए प्रश्न को अपडेट करें ।
S.Lott

जवाबों:


116

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

हमारे उत्पाद के लिए: हमारी इकाई परीक्षण प्रत्येक बिल्ड के साथ चलाए जाते हैं, सेकंड लेते हैं। हमारे एकीकरण परीक्षणों का एक सबसेट प्रत्येक चेक-इन के साथ चलता है, जिसमें 10 मिनट लगते हैं। हमारे पूर्ण एकीकरण सुइट को हर रात चलाया जाता है, जिसमें 4 घंटे लगते हैं।


4
भविष्य के रखरखाव के दौरान एक प्रणाली में उनके प्रजनन को रोकने के लिए खोजे गए और निश्चित बग को कवर करने के लिए प्रतिगमन परीक्षणों के बारे में मत भूलना।
RBerteig

2
अगर मैं इससे सहमत हूं तो भी मैं परिभाषा पर जोर नहीं दूंगा। कुछ कोड में StringFormatter जैसी स्वीकार्य निर्भरताएं हो सकती हैं और यह अभी भी अधिकांश यूनिट परीक्षण द्वारा माना जाता है।
दानीदाकर

2
danip: स्पष्ट परिभाषाएँ महत्वपूर्ण हैं, और मैं होता उन पर जोर देते हैं। लेकिन यह महसूस करना भी महत्वपूर्ण है कि वे परिभाषाएं एक लक्ष्य हैं। वे लक्ष्य के लायक हैं, लेकिन आपको हमेशा एक बुल्सआई की आवश्यकता नहीं है। यूनिट परीक्षणों में अक्सर निचले स्तर के पुस्तकालयों पर निर्भरता होती है।
जेफरी फॉस्ट

2
यह भी महत्वपूर्ण है कि मुखौटा परीक्षणों की अवधारणा को समझना महत्वपूर्ण है, यह परीक्षण न करें कि घटक एक साथ कैसे फिट होते हैं (जैसे एकीकरण परीक्षण) लेकिन अलगाव में एकल घटक का परीक्षण करें। (यानी, एक वस्तु ग्राफ)
रिकार्डो रॉड्रिक्स

1
यह न केवल तेज़ होने के बारे में है, बल्कि बेहद थकाऊ या असहनीय होने के बारे में है, कल्पना करें, यदि आप ऐसा नहीं करते हैं, तो आपके मॉकिंग का निष्पादन पेड़ तेजी से बढ़ सकता है। कल्पना कीजिए कि आप अपनी इकाई में 10 निर्भरताओं का मजाक उड़ाते हैं यदि आप आगे चलकर मजाक उड़ाते हैं तो आइए बताते हैं कि 10 में से 1 निर्भरता का उपयोग कई स्थानों पर किया जाता है और इसकी 20 निर्भरताएं हैं, इसलिए आपको कई स्थानों पर संभावित रूप से नकली 20 अन्य निर्भरताओं का मजाक उड़ाना होगा। अंतिम-अपी बिंदु पर आपको मॉक करना होगा - उदा डेटाबेस, ताकि आपको इसे रीसेट न करना पड़े और यह आपको बताए अनुसार तेज़ हो
FantomX1

39

जगह में सभी निर्भरता के साथ परीक्षण अभी भी महत्वपूर्ण है, लेकिन जेफरी फॉस्ट ने कहा कि यह एकीकरण परीक्षण के दायरे में अधिक है।

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

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

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

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

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


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

public class MyClass 
{
    private SomeClass someClass;
    public MyClass()
    {
        someClass = new SomeClass();
    }

    // use someClass in some way
}

मुझे आमतौर पर परवाह नहीं है कि कैसे SomeClassबनाया जाता है। मैं सिर्फ इसका इस्तेमाल करना चाहता हूं। अगर SomeClass बदलता है और अब कंस्ट्रक्टर को पैरामीटर की आवश्यकता होती है ... तो यह मेरी समस्या नहीं है। मुझे इसे समायोजित करने के लिए MyClass को बदलना नहीं चाहिए।

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

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

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


+1 महान जवाब, क्योंकि बाहरी निर्भरता एक ऐसा मामला है जिसके बारे में मैं सोच नहीं रहा था जब मैंने मूल प्रश्न लिखा था। मैंने जवाब में अपना प्रश्न स्पष्ट कर दिया है। नवीनतम संपादित देखें।
dsimcha

@dsimcha मैंने उस पर अधिक विस्तार में जाने के लिए अपने उत्तर का विस्तार किया। आशा है ये मदद करेगा।
एडम लेअर

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

1
@ मोज़ का मतलब यह था कि अगर कुछ क्लैक् स बनाया जाता है, तो माईक्लास को बदलना नहीं पड़ता है अगर कुछ क्लैसिक को आंतरिक रूप से बनाए जाने के बजाय इसमें इंजेक्ट किया जाता है। सामान्य परिस्थितियों में MyClass को SomeClass के सेटअप विवरण के बारे में परवाह करने की आवश्यकता नहीं है। अगर SomeClass का इंटरफ़ेस बदलता है, तो हाँ ... MyClass को अभी भी संशोधित करना होगा यदि कोई भी विधि इसका उपयोग करती है तो प्रभावित होती है।
एडम लेअर

1
यदि आप MyClass का परीक्षण करते समय SomeClass का मजाक उड़ाते हैं, तो आप कैसे पता लगाएंगे कि MyClass SomeClass का गलत तरीके से उपयोग कर रहा है या SomeClass के अनछुए हुए quirk पर निर्भर करता है जो बदल सकता है?
नाम

22

यूनिट बनाम एकीकरण परीक्षण मुद्दे के अलावा, निम्नलिखित पर विचार करें।

क्लास विजेट में थिंगमजिग और व्हाट्सएप कक्षाओं पर निर्भरता है।

विजेट के लिए एक इकाई परीक्षण विफल रहता है।

समस्या किस वर्ग में है?

यदि आपने "डीबगर को आग लगाते हैं" या "कोड के माध्यम से पढ़ा जब तक मैं इसे नहीं ढूंढता", तो आपने केवल इकाई के परीक्षण के महत्व को समझा, न कि निर्भरता को।


3
@ बरोक: यह देखने के बारे में कि सभी विजेट की निर्भरता के लिए परिणाम क्या हैं? यदि वे सभी पास हो जाते हैं, तो यह विजेट के साथ एक समस्या है जब तक कि अन्यथा साबित न हो।
dsimcha

4
@dsimcha, लेकिन अब आप मध्यवर्ती चरणों की जांच करने के लिए खेल में जटिलता जोड़ रहे हैं। सरल क्यों नहीं है और सिर्फ सरल इकाई परीक्षण पहले करते हैं? फिर अपना एकीकरण परीक्षण करें।
asoundmove

1
@dsimcha, जो तब तक उचित लगता है जब तक आप एक गैर-तुच्छ निर्भरता ग्राफ में नहीं आते। मान लीजिए कि आपको एक जटिल वस्तु मिली है जिसमें निर्भरता के साथ 3+ परतें गहरी हैं, यह O (1) के बजाय O (1)
ब्रुक

1
इसके अलावा, एसआरपी की मेरी व्याख्या यह है कि एक वर्ग को वैचारिक / समस्या डोमेन स्तर पर एक ही जिम्मेदारी होनी चाहिए। इससे कोई फर्क नहीं पड़ता कि उस ज़िम्मेदारी को पूरा करने के लिए उसे अलग-अलग काम करने की ज़रूरत होती है, जब उसे अमूर्त के निचले स्तर पर देखा जाता है। यदि चरम पर ले जाया जाए तो एसआरपी ओओ के विपरीत होगा क्योंकि अधिकांश कक्षाएं डेटा रखती हैं और उस पर संचालन करती हैं (दो चीजें जब पर्याप्त स्तर पर देखी जाती हैं)।
dsimcha

4
@ बरोक: अधिक प्रकार से प्रति जटिलता नहीं बढ़ती है। यदि वे प्रकार समस्या क्षेत्र में वैचारिक अर्थ बनाते हैं और कोड को आसान बनाते हैं, तो कठिन नहीं है। समस्या को कृत्रिम रूप से डिकॉपिंग करने वाली चीजें हैं जो समस्या के डोमेन स्तर पर वैचारिक रूप से युग्मित हैं (यानी आपके पास केवल एक कार्यान्वयन है, शायद कभी एक से अधिक नहीं होगा, आदि) और डिकॉप्लिंग समस्या डोमेन अवधारणाओं के लिए अच्छी तरह से मैप नहीं करता है। इन मामलों में यह मूर्खतापूर्ण, नौकरशाही और इस कार्यान्वयन के आसपास गंभीर अमूर्त बनाने के लिए क्रिया है।
dsimcha

14

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

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

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


7
और जब आपका एकीकरण परीक्षण विफल हो जाता है, तो इकाई परीक्षण समस्या पर शून्य हो सकता है।
टिम विस्क्रॉफ्ट

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

इस सादृश्य से प्यार करो!
thehowler

6

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

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

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

इसलिए संक्षेप में, "यूनिट परीक्षण" के तीन स्तर मैं आमतौर पर लगभग सभी परियोजनाओं में उपयोग करता हूं:

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

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


4

इसका दूसरा पक्ष क्या है? क्या यह वास्तव में महत्वपूर्ण है कि एक इकाई परीक्षण भी इसकी निर्भरता का परीक्षण नहीं करता है? यदि हां, तो क्यों?

यूनिट। एकवचन का अर्थ है।

2 चीजों का परीक्षण करने का मतलब है कि आपके पास दो चीजें हैं और सभी कार्यात्मक निर्भरताएं हैं।

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

परीक्षण किए जा रहे n आइटमों में n (n-1) / 2 संभावित निर्भरताएँ हैं ।

वह बड़ा कारण है।

सादगी का मूल्य है।


2

याद रखें कि आपने पहली बार पुनरावृत्ति करना कैसे सीखा था? मेरे प्रोफेसर ने कहा "मान लें कि आपके पास एक विधि है जो x करता है" (जैसे कि किसी भी x के लिए फाइबोनकैश हल करता है)। "X के लिए हल करने के लिए आपको x-1 और x-2 के लिए उस विधि को कॉल करना होगा"। उसी संबंध में, निर्भरता को ठुकराने से आप मौजूद होने का दिखावा कर सकते हैं और परख सकते हैं कि वर्तमान इकाई क्या करती है। यह धारणा जरूर है कि आप निर्भरता को कठोरता से परख रहे हैं।

यह सार एसआरपी काम में है। अपने परीक्षणों के लिए भी एक ही ज़िम्मेदारी पर ध्यान केंद्रित करने से आपको मानसिक करतब की मात्रा को दूर करना होगा।


2

(यह एक मामूली जवाब है। धन्यवाद @TimWilliscroft हिंट के लिए।)

दोषों को स्थानीय बनाना आसान है यदि:

  • दोनों यूनिट-अंडर-टेस्ट और इसकी प्रत्येक निर्भरता का स्वतंत्र रूप से परीक्षण किया जाता है।
  • प्रत्येक परीक्षण में विफल रहता है अगर और केवल अगर परीक्षण द्वारा कवर कोड में कोई दोष है।

यह कागज पर अच्छी तरह से काम करता है। हालांकि, जैसा कि ओपी के विवरण में निर्भर है (निर्भरताएं छोटी हैं), अगर निर्भरता का परीक्षण नहीं किया जा रहा है, तो गलती के स्थान को इंगित करना मुश्किल होगा।


निर्भरता का परीक्षण क्यों नहीं किया जाएगा? वे वर्तमान में निचले स्तर और यूनिट-परीक्षण के लिए आसान हैं। इसके अलावा, विशिष्ट कोड को कवर करने वाली इकाई परीक्षणों के साथ, गलती के स्थान को इंगित करना आसान है।
डेविड थॉर्नले 16

2

ढेर सारे अच्छे जवाब। मैं कुछ अन्य बिंदु भी जोड़ूंगा:

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

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


0

डिजाइन पहलुओं के बारे में: मेरा मानना ​​है कि कोड को परीक्षण योग्य बनाने से भी छोटी परियोजनाओं को फायदा होता है। जरूरी नहीं कि आपको कुछ जूँ (जैसे एक साधारण कारखाना वर्ग अक्सर करेगा) शुरू करना है, लेकिन प्रोग्रामिंग तर्क से निर्माण प्रक्रिया को अलग करना

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

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

0

उह ... इन उत्तरों में लिखी गई इकाई और एकीकरण परीक्षण पर अच्छे अंक हैं!

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

तो वहाँ अन्य कारकों है कि बहुत अधिक महत्वपूर्ण हैं (जैसे "क्या परीक्षण करने के लिए" ) इससे पहले कि आप के बारे में सोच "कैसे परीक्षण करने के लिए" मेरे अनुभव से ...

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

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

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

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

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

तो मैं कहूंगा कि यह वास्तव में विश्वास और लागत / जोखिम / लाभ मूल्यांकन पर बहुत कुछ निर्भर करता है ... वास्तविक जीवन में जैसे कि आप बहुत सारे या 100% सुरक्षा तंत्र के साथ नहीं चलना चाहते हैं।

बच्चा कहीं पर चढ़ सकता है और नीचे गिर कर खुद को चोटिल कर सकता है। कार काम करना बंद कर सकती है क्योंकि मैं गलत ईंधन (अवैध इनपुट :)) में भर गया हूं। यदि समय बटन 3 साल के बाद काम करना बंद कर देता है तो टोस्ट को जलाया जा सकता है। लेकिन मैं कभी नहीं, राजमार्ग पर ड्राइव करना चाहता हूं और अपने हाथों में मेरा अलग स्टीयरिंग व्हील पकड़ता हूं :)

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