इकाई परीक्षण - आरंभ करना


14

मैं अभी यूनिट परीक्षण के साथ शुरू कर रहा हूं, लेकिन मुझे यकीन नहीं है कि मैं वास्तव में यह सब समझ रहा हूं। मैं इस पर सभी ट्यूटोरियल और किताबें पढ़ता हूं, लेकिन मेरे पास दो त्वरित प्रश्न हैं:

  1. मुझे लगा कि यूनिट टेस्टिंग का उद्देश्य हमारे द्वारा लिखे गए कोड का परीक्षण करना है। हालाँकि, मुझे ऐसा लगता है कि केवल परीक्षण चलाने में सक्षम होने के लिए, हमें मूल कोड को बदलना होगा, जिस बिंदु पर हम वास्तव में हमारे द्वारा लिखे गए कोड का परीक्षण नहीं कर रहे हैं, बल्कि कोड जिसे हमने परीक्षण के लिए लिखा था।

  2. हमारे अधिकांश कोड बाहरी स्रोतों पर निर्भर करते हैं। हालांकि, हमारे कोड को फिर से दर्शाने पर, यह मूल कोड को भी तोड़ देगा, हमारे परीक्षण अभी भी ठीक चलेंगे, क्योंकि बाहरी स्रोत हमारे परीक्षण मामलों के अंदर सिर्फ मैक-अप हैं। क्या यह इकाई परीक्षण के उद्देश्य को नहीं हराता है?

क्षमा करें, अगर मैं यहां गूंगा ध्वनि करता हूं, लेकिन मुझे लगा कि कोई मुझे थोड़ा सा बता सकता है।

अग्रिम में धन्यवाद।

जवाबों:


7

मेरा 0.02 $ ... यह थोड़ा व्यक्तिपरक है, इसलिए नमक के एक दाने के साथ लें, लेकिन उम्मीद है कि यह आपको सोच में पड़ जाएगा और कुछ संवाद चमकाएगा:

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

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

  2. यह सही है कि बाहरी कार्यान्वयन आपके कोड को प्रभावित कर सकते हैं। हालाँकि यह सुनिश्चित करना कि आपका कोड एक बड़ी प्रणाली के भाग के रूप में सही ढंग से काम करता है, एकीकरण परीक्षण का एक कार्य है । (जिसे अलग-अलग डिग्री के प्रयास से भी स्वचालित किया जा सकता है)।

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

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


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

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

    यूनिट परीक्षण की कला

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


1

एक अच्छा सवाल पूछना किसी भी तरह से गूंगा नहीं है।

मैं आपके सवालों का जवाब दूंगा।

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

    • प्रत्येक परीक्षण के लिए इनपुट से भिन्न
    • एक परीक्षण-केस लिखें जो यह सुनिश्चित करता है कि आपका प्रोग्राम ठीक से काम करता है, और फिर एक संबंधित परीक्षण-केस लिखें जो यह सुनिश्चित करता है कि आपका प्रोग्राम उस तरह से काम नहीं करता है जैसे उसे नहीं करना चाहिए

    यहाँ एक उदाहरण है:

    TEST(MyTest, TwoPlusTwoIsFour) {
        ASSERT_EQ(4, 2+2);
    }
    
    TEST(MyTest, TwoPlusThreeIsntFour) {
        ASSERT_NE(4, 2+3);
    }
    

    उसके शीर्ष पर, यदि आप अपने कोड के अंदर तर्क का परीक्षण कर रहे हैं (3rd पार्टी लाइब्रेरी नहीं), तो यह पूरी तरह से ठीक है कि आप उस संदर्भ में, जबकि अन्य कोड ब्रेकिंग के बारे में चिंता न करें। आप अनिवार्य रूप से अपने तर्क को लपेटने के तरीके का परीक्षण कर रहे हैं और तीसरे पक्ष की उपयोगिताओं का उपयोग करते हैं, जो एक क्लासिक परीक्षण परिदृश्य है।

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


1

ऐसा लगता है कि आपके पास एक अखंड ऐप है जो void main()डेटाबेस एक्सेस से आउटपुट जेनरेशन तक सब कुछ करता है । उचित इकाई परीक्षण शुरू करने से पहले यहां कई चरण हैं।

1) उस कोड का एक टुकड़ा खोजें जो एक से अधिक बार लिखा / कॉपी-पेस्ट किया गया हो। भले ही वह बस हो string fullName = firstName + " " + lastName। एक विधि में तोड़ो, जैसे:

private static string GetFullName (firstName, lastName)
{
    return firstName + " " + lastName;
}

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

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


0

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

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