इकाई परीक्षणों बनाम कोई परीक्षणों के साथ विकसित होने के बीच का समय अंतर


132

मैं एक सुंदर समय-विवश कार्य वातावरण के साथ एक एकल डेवलपर हूं, जहां विकास समय आमतौर पर प्रति परियोजना 1-4 सप्ताह से लेकर या तो आवश्यकताओं, तात्कालिकता या दोनों पर निर्भर करता है। किसी भी समय मैं लगभग 3-4 परियोजनाओं को संभालता हूं, कुछ समयसीमाएँ हैं जो एक दूसरे के साथ ओवरलैप होती हैं।

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

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

प्रश्न यह है कि अनटाइटेड कोड पर यूनिट-टेस्ट किए गए कोड को लिखने में कितना समय का अंतर होता है, और उस समय के अंतर को प्रोजेक्ट स्कोप वाइडेंस के रूप में कैसे मापा जाता है?


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
maple_shaft

8
आप गलत समस्या को हल कर रहे हैं। आप बहुत व्यस्त हैं और लगता है कि कोई परियोजना प्रबंधन समर्थन नहीं है। क्या आप परियोजना के प्रयास का अनुमान लगा रहे हैं? क्या आप बग फिक्स, मीटिंग और अन्य गैर-कोडिंग कार्यों के लिए अपना 20% समय जला रहे हैं? आप कितना ओवरटाइम काम कर रहे हैं?
टोनी एनिस

20
क्या आपको एहसास है कि आप अनिवार्य रूप से कह रहे हैं "मेरे पास इसे दो बार करने का समय है, लेकिन सही तरीके से एक बार करने का समय नहीं है।"
रबरडक

5
@ रबरडक वास्तव में टाइम टू राइट टू टेस्ट बनाम टेस्ट के रूप में मापा गया प्रोजेक्ट जटिलता का एक बिंदु है, जहां "इसे दो बार लिखना", "इसे लिखें और यह परीक्षण है" की तुलना में कम समय लगता है। मुझे लगता है कि यह बैश ऑन्लाइनर के क्षेत्र में कहीं हो सकता है।
लिंडन व्हाइट

एक बार जब किसी प्रोजेक्ट को रद्द कर दिया गया, तो डेवलपर्स को प्रस्तुतिकरण और धन्यवाद मिला। मैंने बताया कि हम और भी अधिक उत्पादक हो सकते थे, हमें पता था कि उत्पाद जहाज नहीं जाएगा। तो, यह एक ऐसा मामला है जहां परीक्षण के बिना विकसित करना लाभप्रद होगा।
JDługosz

जवाबों:


149

बाद में आप परीक्षण करते हैं, परीक्षण लिखने के लिए अधिक खर्च होता है।

एक बग जितना लंबा रहता है, उसे ठीक करना उतना ही महंगा होता है।

घटते रिटर्न का नियम यह सुनिश्चित करता है कि आप खुद को गुमनामी में परख सकते हैं, यह सुनिश्चित करने की कोशिश कर रहे हैं कि कोई कीड़े न हों।

बुद्ध ने मध्यम मार्ग का ज्ञान सिखाया। टेस्ट अच्छे हैं। ऐसी बात है कि बहुत अच्छी बात है। कुंजी यह बताने में सक्षम हो रही है कि आप कब संतुलन से बाहर हैं।

बिना परीक्षण के लिखने वाली कोड की प्रत्येक पंक्ति में बाद में परीक्षणों को जोड़ने की लागत अधिक होगी, यदि आपने कोड लिखने से पहले परीक्षण लिखे थे।

परीक्षणों के बिना कोड की हर पंक्ति डिबग या रीराइट करने के लिए काफी अधिक कठिन होगी।

आपके द्वारा लिखा गया हर परीक्षा में समय लगेगा।

हर बग को ठीक करने में समय लगेगा।

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

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

व्यावहारिक रूप से, मैं उन सभी परीक्षणों को जोड़ता हूं जिनके साथ मैं दूर हो सकता हूं। मैं परीक्षण देखने के पक्ष में टिप्पणियों की उपेक्षा करता हूं। मुझे लगता है कि मुझे लगता है कि यह करने के लिए कोड पर भी भरोसा नहीं है। मुझे परीक्षणों पर भरोसा है। लेकिन मुझे कभी-कभार ओला मारी फेंकने और भाग्यशाली होने के लिए जाना जाता है।

हालाँकि, कई सफल कोडर TDD नहीं करते हैं। इसका मतलब यह नहीं है कि वे परीक्षण नहीं करते हैं। वे सिर्फ यह नहीं मानते हैं कि कोड की प्रत्येक पंक्ति में इसके खिलाफ एक स्वचालित परीक्षण है। यहां तक ​​कि अंकल बॉब मानते हैं कि वह अपने यूआई का परीक्षण नहीं करता है। वह यह भी आग्रह करता है कि आप सभी तर्क यूआई से बाहर ले जाएं।

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

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


68
इस तरह की एक चीज़ बहुत अच्छी बात है, न तो आपने या बुद्ध ने मेरी दादी की कुकीज़ का परीक्षण किया है :-)
पियरे अरलाउद

3
@NickAlexeev मुझे उस चार्ट से प्यार है। एक बात यह नहीं बताती है कि कोड के संशोधित होने पर यूनिट परीक्षण (जो आमतौर पर स्वचालित होते हैं) बग खोजने में बहुत अच्छे होते हैं। मुझे लगता है कि "रिलीज से पहले पाए गए कीड़े" और "रिलीज के बाद पाए जाने वाले कीड़े" को देखना अच्छा लगेगा। इकाई परीक्षण प्रतिगमन के खिलाफ रक्षा की सबसे अच्छी रेखा है।
corsiKa

3
मुझे लगता है कि यह एक बहुत ही संतुलित जवाब है: सब कुछ, यहां तक ​​कि तुच्छ चीजों का परीक्षण करना समय की बर्बादी हो सकती है। आसानी से टूटने वाले जटिल हिस्सों के लिए अच्छे परीक्षण होने से वास्तव में मदद मिल सकती है। मैंने अभी जावा से C ++ में एक छोटी लेकिन गैर-तुच्छ परियोजना को पोर्ट करना पूरा किया है। मैंने पहले परीक्षणों को चित्रित किया और इसने मुझे पूरे C ++ कार्यान्वयन की स्थापना करने में मार्गदर्शन किया। एक बार जब सभी परीक्षण हरे थे, केवल कुछ आसान वर्गों को चित्रित करने की आवश्यकता थी और यह बहुत आसानी से चला गया। दूसरी ओर, मेरे पास सभी कोड के लिए परीक्षण नहीं हैं: इससे कम से कम 3, 4 दिनों के लिए थोड़ा सा लाभ होने पर कार्यान्वयन को लंबा कर दिया जाएगा।
जियोर्जियो

5
इससे थोड़ी सी असहमति: 'आपको इस तथ्य के विरुद्ध सभी को तौलना चाहिए कि परीक्षण सुविधाओं को नहीं जोड़ते हैं। कोड सुविधाएँ जोड़ता है। और फीचर्स वो हैं जो बिलों का भुगतान करते हैं। ' मैं दृढ़ता से सुझाव दूंगा कि यह ऐसी सुविधाएँ नहीं हैं जो बिलों का भुगतान करती हैं - यह काम करने वाली सुविधाएँ हैं। (या लोगों को गैर-कार्यशील वितरण के लिए भुगतान मिलता है?)। बाकी जवाब मैं पूरी तरह से सहमत हूं।
टोनी सफ़ोकल 66

6
@ टोनीसफ़्लोक 66 आप सही हैं, यह काम करने वाले फीचर्स हैं जो बिलों का भुगतान करते हैं (फ्लिम्फ़्लम सेल्समैनशिप को छोड़कर), हालांकि, लोग टीडीडी होने से बहुत पहले ही काम करने की सुविधाएँ बना रहे थे। उनके चले जाने के बाद वे लंबे समय तक रहेंगे। याद रखें, टीडीडी परीक्षण का एक अनुशासित तरीका है। यह परीक्षण का एकमात्र अनुशासित तरीका नहीं है।
कैंडिड_ऑरेंज

112

मैं बाकी उत्तरों से सहमत हूं, लेकिन समय अंतर प्रश्न का सीधा उत्तर देने के लिए ।

रॉय ओशेरोव ने अपनी पुस्तक द आर्ट ऑफ यूनिट टेस्टिंग में, द्वितीय संस्करण पृष्ठ 200 में दो अलग-अलग क्लाइंट्स के लिए समान टीमों (कौशल वार) के साथ समान आकार की परियोजनाओं को लागू करने का एक केस स्टडी किया, जहां एक टीम ने परीक्षण किया, जबकि दूसरे ने नहीं किया।

उनके परिणाम इस प्रकार थे:

टीम की प्रगति और परीक्षण के साथ और बिना मापा गया आउटपुट

तो एक परियोजना के अंत में आपको कम समय और कम कीड़े दोनों मिलते हैं। यह निश्चित रूप से इस बात पर निर्भर करता है कि परियोजना कितनी बड़ी है।


32
यह वैज्ञानिक होने के लिए नमूना आकार बहुत छोटा है, लेकिन मुझे लगता है कि यह बहुत सारे लोगों के अनुभव का प्रतिनिधि है। मुझे लगता है कि जब मैं टीडीडी करता हूं, तो अधिकांश अतिरिक्त समय उन बगों को ठीक करने में व्यतीत होता है जो मेरी इकाई परीक्षणों को विफल करते हैं, स्वयं परीक्षणों को नहीं लिखते हैं। यह वास्तव में अतिरिक्त समय नहीं जोड़ रहा है, बस जब आप ढूंढते हैं और उन मुद्दों को ठीक करते हैं। कोई वास्तविक अतिरिक्त समय उन समस्याओं को ठीक करने में है जो आपको नहीं मिली होंगी, कम से कम पहले गो-राउंड में नहीं।
जिमीजैम

7
@ जिम्मीजम्स यह एक केस स्टडी है, जिसका उपयोग व्यापार में बड़े पैमाने पर किया जाता है, और विज्ञान में बहुत कुछ है जब यह बड़े पैमाने पर प्रजनन योग्य प्रयोग चलाने के लिए (अभी तक) संभव नहीं है। वहाँ मनोविज्ञान पत्रिकाओं से भरा है। "अवैज्ञानिक" सही शब्द नहीं है।
djechlin

25
मुझे क्यों लगता है कि अगर उस केस स्टडी के परिणाम विपरीत दिखाई दे रहे थे, तो इसने इसे पुस्तक में नहीं बनाया होगा ;-)
डॉक ब्राउन

11
@DocBrown मुझे आश्चर्य है कि सही उत्तर के साथ एक मिलने से पहले कितने केस अध्ययन किए गए और त्याग दिए गए :-)
gbjbaanb

6
@JimmyJames जो लगभग निश्चित रूप से विज्ञान के रूप में योग्य हैं। इसके अलावा एक अन्य वैज्ञानिक इस अध्ययन को "n = 1" केस स्टडी पढ़ सकते हैं, यह तय कर सकते हैं कि यह अधिक अध्ययन के लायक है, फिर बड़े पैमाने पर सांख्यिकीय अध्ययन, या यहां तक ​​कि एक नियंत्रित प्रयोग अनुदैर्ध्य चलाएं, और इसकी पुष्टि करें या इनकार करें। ठीक इसी तरह विज्ञान काम करता है। यह कैसे काम करने वाला है। आप और अधिक पढ़ सकते हैं कि विज्ञान यहाँ कैसे काम करता है en.wikipedia.org/wiki/Scientific_method
djechlin

30

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

अध्ययन के परिणाम विकास के समय में 15% -35% (जो कहीं 2x आंकड़ा है कि अक्सर TDD आलोचकों द्वारा उद्धृत किया जाता है) और 40% -90% से पूर्व-रिलीज़ दोष घनत्व में कमी के बीच वृद्धि हुई थी! )। ध्यान दें कि सभी टीमों को टीडीडी के साथ कोई पूर्व अनुभव नहीं था, इसलिए कोई यह मान सकता है कि समय में वृद्धि को कम से कम आंशिक रूप से सीखने के लिए जिम्मेदार ठहराया जा सकता है, और इस तरह समय के साथ और भी नीचे चला जाएगा, लेकिन अध्ययन द्वारा इसका आकलन नहीं किया गया।

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


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

24

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

तथ्य यह है, मैं एक अच्छा पर्याप्त कोडर नहीं हूँ बस मेरे कोड काम करने के लिए जैसे ही वह संकलन करता है। जब मैं कोड लिख / संशोधित करता हूं, तो मुझे यह सुनिश्चित करने के लिए कोड को चलाना होगा कि मैंने जो सोचा था वह वही करता है। एक परियोजना में, यह अंत की तरह लग रहा था:

  1. कोड संशोधित करें
  2. संकलन अनुप्रयोग
  3. अनुप्रयोग चलाएँ
  4. आवेदन में लॉग इन करें
  5. एक खिड़की खोलें
  6. दूसरी विंडो खोलने के लिए उस विंडो से एक आइटम चुनें
  7. उस विंडो में कुछ नियंत्रण सेट करें और एक बटन पर क्लिक करें

और हां, यह सब होने के बाद, यह वास्तव में सही होने के लिए आमतौर पर कुछ दौर की यात्राएं करता है।

अब, अगर मैं यूनिट परीक्षणों का उपयोग कर रहा हूँ तो क्या होगा? तब यह प्रक्रिया अधिक दिखती है:

  1. एक परीक्षण लिखें
  2. परीक्षण चलाएं, सुनिश्चित करें कि यह अपेक्षित तरीके से विफल हो गया है
  3. कोड लिखें
  4. फिर से परीक्षण चलाएं, देखें कि यह गुजरता है

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

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


1
और nCrunch जैसी किसी चीज का उपयोग करने से चरण 2 और 4 में कटौती हो सकती है, जिससे फीडबैक लूप और भी सख्त हो जाएगा।
व्यंग्यात्मक

"मुझे अभी भी एप्लिकेशन को मैन्युअल रूप से चलाना है" एक महत्वपूर्ण अवलोकन है, आईएमएचओ। चांदी की गोलियां नहीं।
डेन

20

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

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

तो किसी फ़ंक्शन / पद्धति का परीक्षण करने के लिए या नहीं (या किस प्रकार का) तय करते समय यह पूछने के लिए कि खुद से पूछें कि 'इस परीक्षण के साथ मैं क्या-क्या / उपयोगकर्ता की सुरक्षा कर रहा हूं?' यदि आप उस प्रश्न का उत्तर नहीं दे सकते हैं , तो आपके सिर के ऊपर से , तो यह परीक्षण संभवतः लिखने / बनाए रखने की लागत के लायक नहीं है। (या आप समस्या डोमेन है, जो एक है समझ में नहीं आता waaaay परीक्षण की कमी से भी बड़ा समस्या)।

http://rbcs-us.com/documents/Why-Most-Unit-Testing-is-Waste.pdf


1
मैं बीडीडी से सुपर परिचित नहीं हूं, लेकिन अनुमान लगाऊंगा कि यह विधि / फ़ंक्शन स्तर की तुलना में थोड़ा मोटे ग्रैन्युलैरिटी पर काम करता है और संभवत: उपयोगकर्ता-मूल्य के लिए एक कम दस कनेक्शन है।
जेरेड स्मिथ


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

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

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

9

यह व्यक्ति पर निर्भर करता है, साथ ही आपके द्वारा काम कर रहे कोड की जटिलता और आकार।

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

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


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

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

2
मैं सहमत हूँ। टीडीडी कठिन है। मानसिकता कठिन है। जो कोई भी कहता है "बस परीक्षण पहले लिखें" और दावा करता है कि यह मुफ़्त है यह नहीं जानता कि यह कैसे करना है। इसका अभ्यास होता है।
डफिमो

@kai: इसी तरह के कारणों से बहुत से लोग स्पर्श-प्रकार नहीं कर सकते। उन्होंने इसे एक बार आजमाया और पूरे एक घंटे के बाद भी; पहले से कहीं ज्यादा तेजी से टाइपिंग नहीं कर रहे थे ;-)
स्टीव जेसोप

@SteveJessop मुझे लगता है कि एक बहुत साफ तुलना है। या वास्तव में अनफिट होना और 10 मिनट के जॉग के लिए बाहर जाना, थकावट होना और यह सोचना कि आप एक घंटे में 10 मील क्यों नहीं दौड़ सकते। यह वास्तव में दिखाता है कि लाभ प्राप्त करने से पहले आपको कैसे काम करने की आवश्यकता है।
सारा

4

प्रश्न यह है कि अनटाइटेड कोड पर यूनिट-टेस्ट किए गए कोड को लिखने में कितना समय का अंतर होता है, और उस समय के अंतर को प्रोजेक्ट स्कोप वाइडेंस के रूप में कैसे मापा जाता है?

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

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

उपरोक्त विशेष रूप से गहरे कोड पर लागू होता है, और उथले कोड से कम होता है जैसे नए वेब पेज जोड़ना जहां नए पेज मौजूदा पृष्ठों को प्रभावित करने की संभावना नहीं है।

नतीजतन, काफी मात्रा में कीड़े उत्पादन में भाग जाते हैं, जिसे मुझे ठीक करना पड़ता है और बदले में मेरी अन्य परियोजनाओं को वापस सेट करता है।

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

एक बेहतर सवाल हो सकता है:

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

सीखना एक दो-चरण की प्रक्रिया है: इसे अच्छी तरह से करना सीखें, फिर अधिक तेज़ी से करना सीखें।


3

कुछ पहलुओं पर विचार करने के लिए, अन्य उत्तरों में उल्लेख नहीं किया गया है।

  • अतिरिक्त लाभ / अतिरिक्त लागत लेखन unittests के साथ अनुभव पर निर्भर करते हैं
    • मेरी पहली इकाई-परीक्षण परियोजना के साथ अतिरिक्त लागतें तिगुनी हो गईं क्योंकि मुझे बहुत कुछ सीखना था और मैंने बहुत सारी गलतियाँ कीं।
    • Tdd के साथ 10 साल के अनुभव के बाद मुझे पहले से परीक्षण लिखने के लिए 25% अधिक कोडिंग समय की आवश्यकता होती है।
  • अधिक tdd-moduls के साथ अभी भी मैनुअल-गुई-परीक्षण और एकीकरण-परीक्षण की आवश्यकता है
  • tdd केवल तभी काम करता है जब शुरुआत से किया जाता है।
    • एक मौजूदा, विकसित परियोजना के लिए tdd को लागू करना महंगा / अलग है। लेकिन आप इसके बजाय प्रतिगमन-परीक्षण लागू कर सकते हैं।
  • स्वचालित परीक्षणों (unittests और अन्य प्रकार के परीक्षणों) को काम करने के लिए maintanace const की आवश्यकता होती है।
    • कॉपी और पेस्ट के माध्यम से टेस्ट तैयार करने से टेस्टकोड-मेनटेन महंगे हो सकते हैं।
    • बढ़ते अनुभव के साथ टेस्टकोड अधिक मॉड्यूलर और बनाए रखने के लिए अधिक आसान हो जाता है।
  • बढ़ते अनुभव के साथ आप महसूस करेंगे कि यह स्वचालित परीक्षण बनाने के लायक है और कब नहीं।
    • उदाहरण, सरल गेटर्स / सेटर / रैपर को एकजुट करने का कोई बड़ा लाभ नहीं है
    • मैं गुई के माध्यम से स्वचालित परीक्षण नहीं लिखता
    • मुझे ध्यान है कि व्यवसायी का परीक्षण किया जा सकता है

सारांश

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

नोट: "यूनिट परीक्षण" के साथ मेरा मतलब है "अलगाव में परीक्षण मॉड्यूल"।

नोट: "प्रतिगमन परीक्षण" के साथ मेरा मतलब है

  • कुछ कोड लिखें जो कुछ आउटपुट-टेक्स्ट का उत्पादन करते हैं।
  • कुछ "प्रतिगमन परीक्षण" कोड लिखें जो यह पुष्टि करता है कि पीढ़ी का परिणाम अभी भी समान नहीं है।
  • रिग्रेशन टेस्ट आपको बताता है कि जब भी परिणाम बदले (जो ठीक हो सकता है या नए बग के लिए संकेतक हो सकता है)
  • "प्रतिगमन परीक्षण" का विचार अनुमोदन के समान है
    • ... परिणामों का एक स्नैपशॉट ले रहा है, और यह पुष्टि करता है कि वे नहीं बदले हैं।

प्रूफरीडिंग (परीक्षण के साहित्यिक
संतुलन

3

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

परीक्षण नहीं लिखना, क्रेडिट कार्ड होना बहुत पसंद है; हम अधिक खर्च करते हैं या अधिक कोड लिखते हैं। अधिक कोड में अधिक बग हैं।

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

धीरे-धीरे शुरू करें। आप न्याय करने से पहले कुछ प्रवाह बनाएं। आप हमेशा रुक सकते हैं।


3

TDD और अन्य परीक्षण पद्धतियों को बढ़ावा देने वाले प्रोग्रामर्स बोर्ड का एक लंबा इतिहास रहा है, मैं उनके तर्कों को याद नहीं करूंगा और उनसे सहमत नहीं होऊंगा, लेकिन यहां इस पर विचार करने के लिए अतिरिक्त चीजें हैं, जिन्हें थोड़ा स्पष्ट करना चाहिए:

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

मैं कहता हूँ कि परीक्षण अच्छा है, लेकिन सुनिश्चित करें कि आप जल्दी परीक्षण करें और परीक्षण करें कि लाभ कहाँ है।


1
"क्या मुझे वास्तव में VBA के लिए एक परीक्षण मॉड्यूल विकसित करना चाहिए?" धिक्कार है तुम्हें चाहिए। रबरडुकब.कॉम
फीचर्स#

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

सभी उचित बिंदु @AththurHavlicek।
रबरडक

2
VBA में लेखन परीक्षण अभी भी तुच्छ है। सभी फैंसी फीचर्स होने से कुछ unittest चौखटे हैं? यह कठिन है, लेकिन एक प्रोग्राम चलाना, mainTest()जो आपके सभी टेस्ट मॉड्यूल को कॉल करता है, वास्तव में उतना कठिन नहीं है।
एंडरलैंड

1

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

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

फिल्म स्वॉर्डफिश में एक दृश्य है जहां अगर स्मृति कार्य करती है, तो एक हैकर को अपने सिर पर बंदूक रखकर काम करना पड़ता है ... अन्यथा विचलित होता है। मुद्दा यह है कि जब आपका हेडस्पेस कोड में हो तो काम करना बहुत आसान होता है और आपके पास समय कम होने की बजाए आपके साथ लाइन में लगने वाले ग्राहक के साथ लाइन में लगने और अन्य प्राथमिकताओं को निचोड़ लेने का होता है।

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


आपके पहले वाक्य में उस बात को प्रतिगमन परीक्षण
बिल्ली

0

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

आंशिक पुनर्लेखन के लिए, मैंने सभी मुख्य कार्यक्षमता के लिए परीक्षण लिखने की कसम खाई। शुरुआत में, इसमें काफी लंबा समय लगा और मेरी उत्पादकता में काफी कमी आई, लेकिन बाद में मेरी उत्पादकता पहले से बेहतर हो गई।

उस सुधार का एक हिस्सा यह था कि मेरे पास कम उत्पादन कीड़े थे, जिसके कारण कम रुकावट पैदा हुई -> मेरा किसी भी समय बेहतर ध्यान केंद्रित था।

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

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


0

बस पिछले उत्तरों को पूरक करने के लिए: याद रखें कि परीक्षण स्वयं एक उद्देश्य नहीं है। परीक्षण करने का उद्देश्य आपके आवेदन के लिए विकास के माध्यम से अपेक्षित अप्रत्याशित व्यवहार के रूप में व्यवहार करना है, आदि।

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

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

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

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