2011-09-23 12 views
6

संभव डुप्लिकेट:
Is Unit Testing worth the effort?बेवकूफ लग सकता है, लेकिन असली परीक्षण के लिए यूनिट परीक्षण उपयोगी हैं?

ठीक है, मैं जानता हूँ कि सामान्य रूप से कहें इकाई परीक्षण का उद्देश्य है क्या, लेकिन मैं कुछ चीजें हैं जो मुझे परेशान पाया।

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

लेकिन, का कहना है कि मैं कक्षा एक है और कहते हैं कि कुछ अन्य लोगों के वर्ग 'उदाहरण के साथ बातचीत है, यह वर्ग बी

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

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

यदि मैं मैक्स के बजाय वास्तविक वस्तुओं का उपयोग करता हूं तो उन दोनों समस्याओं को हल किया जा सकता है। लेकिन वह यूनिट परीक्षण नहीं है, है ना? यूनिट टेस्ट क्लास-अंडर-टेस्ट में शेष सिस्टम को अलग-अलग रूप में अलग किया जाना चाहिए, असली कक्षाओं का उपयोग नहीं करना बल्कि मॉक्स।

मुझे यकीन है कि मैं कहीं गलत हूं, लेकिन मुझे यह नहीं मिल रहा है। मैं पढ़ रहा हूं और पढ़ रहा हूं और मुझे नहीं पता कि मुझे क्या गलत समझा गया है।

+1

संबंधित: http://stackoverflow.com/questions/286587/are-you-really-using-unit-tests – Thilo

उत्तर

4

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

कोई तरीका नहीं है कि आप 100% कोड कवरेज प्राप्त कर सकें। मैं अपने आवेदन का परीक्षण करता हूं, लेकिन मुझे लगता है कि यह इसके लायक नहीं है। लेकिन हर कोई इसके साथ सहमत नहीं है।

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

मैं इकाई परीक्षण का बड़ा प्रशंसक नहीं हूँ ... आप नकली सब कुछ लेकिन मजाक बड़ा काम है ..........

लेकिन अब एक दिन कंपनियों TDD दृष्टिकोण के लिए कोशिश कर रहे हैं।

+0

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

+0

@sadClown नकली वस्तुओं का विचार नहीं है, afaik। नकली वस्तुओं का प्रतिनिधित्व करने के लिए उपयोग किया जाता है, उदाहरण के लिए एक http अनुरोध। आप नकली वस्तुओं का परीक्षण नहीं करते हैं, उनका उपयोग आपके परीक्षण में किया जाता है और आपके द्वारा परीक्षण किए जा रहे कोड को पास कर दिया जाता है। – NimChimpsky

3

सरल उत्तर: हाँ, वे वास्तविक के लिए उपयोगी हैं।

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

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

+0

आपके कोड में ऑब्जेक्ट मॉक करने के लिए आप जिस दृष्टिकोण का उपयोग करते हैं? क्या मॉक ऑब्जेक्ट के लिए आपको कोई आसान मॉकिंग जादू मिला है? या आप अपने कोड में ऑब्जेक्ट्स का बिल्कुल उपयोग नहीं करते हैं? –

4

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

मेरे प्रक्रिया:

  1. वर्ग जहां व्यापार तर्क जाना होगा का कंकाल बनाएं (यह एक serivce परत, या डोमेन वस्तु, आदि हो)।
  2. परीक्षण लिखें, और विधि के नाम को परिभाषित करने और परीक्षा में functionaility की आवश्यकता - जो तब मेरी आईडीई स्केल्टन विधि (एक छोटी लेकिन अच्छा प्लस)
  3. तब वास्तविक वर्ग तरीकों परीक्षण किया जा रहा बारे में लिखने के लिए संकेत देता है।
  4. रन परीक्षण, डीबग करें।

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

मुझे अभी तक नकली वस्तुओं का उपयोग करने की आवश्यकता नहीं है (वसंत का उपयोग करके मैं कॉलिंग सेवा परत और सीधे नियंत्रक विधियों से दूर हो सकता हूं)।

1

0) नहीं, ऐसा नहीं है। ध्वनि बेवकूफ, मेरा मतलब है। यह एक बिल्कुल वैध सवाल है।

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

मुझे यूनिट परीक्षण के साथ सफलताएं और असफलताएं मिली हैं, और मेरे अनुभव में यह सही ढंग से लागू होने पर वास्तव में बहुत उपयोगी हो सकता है।

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

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

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

1

यूनिट टेस्ट स्वयं बेवकूफ नहीं हैं, यह आपकी परियोजना पर निर्भर करता है।

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

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

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

संबंधित मुद्दे