यूनिट परीक्षणों के साथ कितनी दूर जाना है


11

एक प्रश्न पहले कई बार पूछा गया था, लेकिन एक विशिष्ट तिरछा मोड़ पीवीसी विकास के साथ।

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

अब, मेरे लिए यह तय करना मुश्किल है कि मेरी सेवा की परत में कवरेज कितना गहरा होना चाहिए। इसका कारण यह है कि मेरी कुछ सेवा विधियाँ (बेहतर या बदतर के लिए) वास्तव में कई प्रकार के लिन्क प्रश्न करती हैं, जो बाद में विधि के भीतर तर्क के लिए विवेचनात्मक जानकारी प्रदान करती हैं। मुझे पता है कि मैं (चाहिए ??) इन विधियों को तोड़ने के लिए नीचे प्रत्येक linq बयान के लिए आवश्यक तर्क को बुलाओ और फिर उन्हें विधि के भीतर लागू करना चाहिए। हालाँकि, कई उदाहरणों में, लाइनक 'फ़ंक्शंस' का कोई भी पुन: उपयोग नहीं होता है और इसलिए यह महसूस करता है कि यह कोड को एक स्तर से बहुत दूर कर देगा।

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

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

btw - यह विचारों के लिए बाहर की जाँच की थी:

http://dotnetslackers.com/articles/aspnet/Built-in-Unit-Test-for-ASP-NET-MVC-3-in-Visual-Studio-2010-Part-1.aspx

स्थिर चढ़ाव के लिए अब fwd देख :)

[संपादित करें] - एकल के लाभ के लिए (अच्छी तरह से इस समय एकल !!) 'करीबी' मतदाता। यह प्रश्न व्यक्तिपरक नहीं है। मैं एक बहुत ही केंद्रित विषय पर सहमति के लिए देख रहा हूँ। मैं नकारात्मक भावनाओं को उत्तेजित करने का प्रयास नहीं कर रहा हूं, मैं प्रौद्योगिकी की खामियों को उजागर नहीं कर रहा हूं - मैं एक बड़ा प्रशंसक हूं। तो कृपया, मेरे लाभ के लिए एक विनम्र टिप्पणी छोड़ दें यदि मतदान बंद हो जाए क्योंकि इससे मुझे प्रश्न का पुनर्गठन करने में मदद मिल सकती है यदि अस्पष्टता या गलत सूचना है। यह सवाल mvc आबादी के एक बड़े हिस्से को फायदा पहुंचा सकता है।

धन्यवाद!!

जिम


(प्रथम) वोट बंद करने के लिए मेरा है, लेकिन 'व्यक्तिपरक और तर्कशील' के रूप में नहीं (जो यह नहीं है), लेकिन 'प्रोग्रामर के लिए माइग्रेट करें ।stackexchange.com', क्योंकि यह एक एकल के साथ एक विशिष्ट प्रोग्रामिंग सवाल नहीं है जवाब साफ़ करें।

आकाश, की सराहना की और समझा। एक खुदाई नहीं थी, बस जानना चाहता था :)
जिम

जवाबों:


4

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

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

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

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

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

इसके अतिरिक्त, जब भी परीक्षण लिखा जाना चाहिए:

  1. आप नया कोड लिख रहे हैं, परीक्षणों को आपके डिज़ाइन को ड्राइव करना चाहिए और दस्तावेज़ बनाना चाहिए और कोड क्या करना चाहिए, इसके बारे में अपनी मान्यताओं की व्याख्या करें। आपको कोड से पहले लिखा जाना चाहिए।

  2. आपको एक बग मिला, एक असफल परीक्षण बग को प्रदर्शित करना चाहिए। जब बग को ठीक किया जाता है तो परीक्षण पास होना चाहिए।

  3. आप कोड को उस तरीके से बदलते हैं जो किसी विधि या वर्ग की प्रकृति को बदलता है (हालांकि यदि कोड के एक क्षेत्र में परिवर्तन बहुत सारे परीक्षण विफल हो जाते हैं तो यह भंगुर परीक्षणों का संकेत दे सकता है)। यह कोड को सही ढंग से प्रलेखित करता रहता है।

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


+1 क्रिस - मुझे आपके जिब :-) में कटौती पसंद है, लेकिन इससे भी महत्वपूर्ण बात, आप इंगित करते हैं (यद्यपि मैंने अंतर समझा था) यूनिट टेस्टिंग और टीडीडी के बीच अलगाव। मेरा एक हाइब्रिड मॉडल है (yikes !!)
jim

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

... मैं शर्मनाक ढंग से अपने अंतिम वाक्य में समझौते में अपना सिर हिला रहा हूँ :)
मरियम

0

यह स्पष्ट है कि किसी पद्धति का केवल रिटर्न मान का परीक्षण उसके अंदर की सभी शाखाओं के परीक्षण से कम शक्तिशाली है। वैकल्पिक आदानों को सही व्यवहार की गारंटी नहीं दी जाएगी।

दूसरी ओर, आपके पास सब कुछ परखने के लिए पर्याप्त समय या धैर्य नहीं हो सकता है।

आप जो कर सकते हैं वह तय करता है कि आप कितने कोड को परीक्षणों (80-90% या जो कुछ भी) के साथ कवर करना चाहते हैं और इसे लागू करने वाले स्वचालित टूल का उपयोग करके लागू करते हैं।
लेखन परीक्षण का एक "कभी न खत्म होने वाला चक्र" तभी होगा जब कोड लेखन चक्र भी कभी समाप्त न हो :)


cosmin -you ने स्पष्ट रूप से मेरा कोड नहीं देखा है। वापस ट्रेडमिल ... :-) के लिए
जिम

0

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


0

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

यदि आप इनबिल्ट MSTest फ्रेमवर्क का उपयोग नहीं कर रहे हैं, तो आपको NUnit के साथ काम करने या यहां दिए गए निर्देशों का पालन करने के लिए किसी तृतीय-पक्ष कोड कवरेज उत्पाद को देखने की आवश्यकता हो सकती है: /programming/2665799/does.ns2010-code -coverage-support-nunit

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