प्रति विधि कितने परीक्षण?
वैसे सैद्धांतिक और अत्यधिक अव्यवहारिक अधिकतम एन-पथ जटिलता है (मान लें कि परीक्षण सभी कोड के माध्यम से अलग-अलग तरीके से कवर करते हैं;))। न्यूनतम एक है !. सार्वजनिक विधि के अनुसार , वह कार्यान्वयन विवरणों का परीक्षण नहीं करता है, केवल एक वर्ग के बाहरी व्यवहार (मूल्यों को वापस करना और अन्य वस्तुओं को कॉल करना)।
आप बोली:
* और अपने स्वयं के प्रत्येक परीक्षण को अपनी स्वयं की परीक्षण विधि (1-1 रिश्ते में) के साथ करने का विचार हँसने योग्य होगा। *
और फिर पूछें:
इसलिए यदि प्रत्येक विधि के लिए एक परीक्षण बनाना 'हंसी' है, तो आपने कैसे / कब चुना क्या आप के लिए परीक्षण लिखते हैं?
लेकिन मुझे लगता है कि आप यहाँ लेखक को गलत समझ रहे हैं:
one test method
प्रति होने के विचार one method in the class to test
को लेखक "हंसने योग्य" कहता है।
(मेरे लिए कम से कम) यह 'कम' के बारे में नहीं है यह 'अधिक' के बारे में है
तो मुझे फिर से समझने की तरह मैं उसे समझ गया:
और केवल एक विधि (1-1 संबंध में अपनी खुद की परीक्षा विधि) के साथ अपने प्रत्येक तरीकों का परीक्षण करने का विचार हँसने योग्य होगा।
अपना उद्धरण फिर से देने के लिए:
जब आप महसूस करते हैं कि यह व्यवहार को निर्दिष्ट करने और परीक्षण नहीं लिखने के बारे में है, तो आपका दृष्टिकोण बदल जाता है।
जब आप टीडीडी का अभ्यास करते हैं तो आपको नहीं लगता :
मेरे पास एक विधि है calculateX($a, $b);
और इसे एक परीक्षण की आवश्यकता है testCalculcateX
जो विधि के बारे में हर किसी का परीक्षण करे ।
TDD आपको जो बताता है वह सोचने के लिए है कि आपका कोड क्या पसंद है:
मुझे दो मानों के पहले ( पहले परीक्षण के मामले में ) की गणना करने की आवश्यकता है, लेकिन यदि $ a शून्य से छोटा है, तो उसे एक त्रुटि ( दूसरा परीक्षण मामला! ) उत्पन्न करना चाहिए और यदि $ b शून्य से छोटा है तो यह चाहिए .... ( तीसरा परीक्षण मामला! ) इत्यादि।
आप व्यवहार का परीक्षण करना चाहते हैं, न कि केवल संदर्भ के बिना एकल तरीके।
इस तरह से आपको एक परीक्षण सूट मिलता है जो आपके कोड के लिए प्रलेखन है और वास्तव में यह बताता है कि यह क्या करने की उम्मीद है, शायद इसलिए भी :)
आप अपने कोड के किस टुकड़े के लिए इकाई परीक्षण बनाते हैं, यह तय करने के बारे में आप क्या करेंगे?
खैर सब कुछ जो भंडार में या उत्पादन के पास कहीं भी समाप्त होता है, एक परीक्षण की आवश्यकता होती है। मुझे नहीं लगता कि आपके उद्धरणों का लेखक इससे सहमत नहीं होगा जैसा कि मैंने उपरोक्त में बताने की कोशिश की है।
यदि आपके पास इसके लिए कोई परीक्षण नहीं है, तो कोड बदलने के लिए यह अधिक कठिन (अधिक महंगा) हो जाता है, खासकर यदि यह परिवर्तन नहीं कर रहा है।
टीडीडी यह सुनिश्चित करने का एक तरीका है कि आपके पास हर बार परीक्षण हो लेकिन जब तक आप उन परीक्षणों को ठीक न कर लें, यह ठीक है। आमतौर पर उन्हें उसी दिन लिखना तब से मदद करता है जब आप इसे बाद में नहीं करने जा रहे हैं, क्या आप हैं? :)
टिप्पणियों का जवाब:
विधियों की एक सभ्य मात्रा को एक विशेष संदर्भ में परीक्षण नहीं किया जा सकता है क्योंकि वे या तो अन्य तरीकों पर निर्भर हैं या निर्भर हैं
खैर वहाँ तीन चीजें हैं जो उन तरीकों को कॉल कर सकते हैं:
अन्य वर्गों के सार्वजनिक तरीके
हम अन्य वर्गों का मजाक उड़ा सकते हैं इसलिए हमने वहां राज्य को परिभाषित किया है। हम संदर्भ के नियंत्रण में हैं इसलिए वहाँ कोई समस्या नहीं है।
* एक ही पर संरक्षित या निजी तरीके *
कुछ भी जो किसी वर्ग के सार्वजनिक एपीआई का हिस्सा नहीं है, सीधे परीक्षण नहीं किया जाता है, आमतौर पर।
आप व्यवहार का परीक्षण करना चाहते हैं और क्रियान्वयन नहीं करना चाहते हैं और यदि कोई वर्ग यह सब करता है तो यह एक बड़ी सार्वजनिक पद्धति में या कई छोटे संरक्षित तरीकों से काम करता है जिसे लागू किया जाता है । आप अपने परीक्षण को छूने के बिना उन संरक्षित विधियों को बदलने में सक्षम होना चाहते हैं। क्योंकि आपके कोड बदल जाते हैं तो आपके परीक्षण बदल जाएंगे! जब आप कुछ तोड़ते हैं, तो आपको यह बताने के लिए कि आपके परीक्षण क्या हैं :)
एक ही वर्ग पर सार्वजनिक तरीके
ऐसा बहुत बार नहीं होता है? और अगर यह निम्न उदाहरण में पसंद करता है तो इसे संभालने के कुछ तरीके हैं:
$stuff = new Stuff();
$stuff->setBla(12);
$stuff->setFoo(14);
$stuff->execute();
यह बसने वाले मौजूद हैं और निष्पादित विधि का हिस्सा नहीं हैं हस्ताक्षर एक और विषय है;)
अगर हम गलत मान सेट करते हैं, तो जब हम निष्पादित करते हैं, तो हम यहां परीक्षण कर सकते हैं। यही कारण है कि setBla
एक अपवाद फेंकता है जब आप पारित एक स्ट्रिंग अलग से परीक्षण किया जा सकता है, लेकिन हम परीक्षण करना चाहते हैं, जो उन दो अनुमति प्राप्त मान (12 और 14) thats एक टेस्ट केस से (जो भी कारण के लिए) एक साथ काम नहीं है।
यदि आप "अच्छा" टेस्ट सूट चाहते हैं, तो आप php में, हो सकता है (!) @covers Stuff::execute
यह सुनिश्चित करने के लिए एक एनोटेशन जोड़ें कि आप केवल इस विधि के लिए कोड कवरेज उत्पन्न करते हैं और अन्य सामान जो कि सेटअप के लिए अलग से परीक्षण किए जाने की आवश्यकता है (फिर, यदि आप चाहते हैं कि)।
तो मुद्दा यह है: हो सकता है कि आपको पहले आसपास की दुनिया में से कुछ बनाने की आवश्यकता हो, लेकिन आपको सार्थक परीक्षण मामलों को लिखने में सक्षम होना चाहिए, जो आमतौर पर केवल एक या दो वास्तविक कार्यों को पूरा करते हैं (बस यहां गिनती नहीं होती है)। बाकी को पहले तोड़ा जा सकता है या पहले परीक्षण किया जा सकता है और फिर भरोसा किया जा सकता है (देखें @depends
)
* नोट: सवाल एसओ से माइग्रेट किया गया था और शुरू में PHP / PHPUnit के बारे में था, यही कारण है कि नमूना कोड और संदर्भ php दुनिया से हैं, मुझे लगता है कि यह अन्य भाषाओं पर भी लागू होता है क्योंकि phpunit अन्य xnnit से बहुत अलग नहीं है परीक्षण ढांचे।