क्या परीक्षण संचालित विकास (TDD) वास्तव में एक वास्तविक विश्व परियोजना से लाभान्वित हुआ है?


36

मैं कोडिंग के लिए नया नहीं हूं। मैं 15 साल से अधिक समय से (गंभीरता से) कोडिंग कर रहा हूं। मैंने हमेशा अपने कोड के लिए कुछ परीक्षण किया है। हालाँकि, पिछले कुछ महीनों में मैं रूबी ऑन रेल्स का उपयोग करके परीक्षण संचालित डिज़ाइन / विकास (TDD) सीख रहा हूँ । अब तक, मैं लाभ नहीं देख रहा हूँ।

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

मुझे हालांकि कहना चाहिए, इस बिंदु पर, प्रदर्शन की निराशाजनक कमी के साथ मिश्रित निराशा का स्तर अस्वीकार्य से परे है। अब तक, टीडीडी से जो एकमात्र मूल्य मैं देख रहा हूं, वह RSpec फ़ाइलों की बढ़ती लाइब्रेरी है जो अन्य परियोजनाओं / फाइलों के लिए टेम्पलेट के रूप में काम करता है। जो वास्तविक परियोजना कोड फ़ाइलों की तुलना में बहुत अधिक उपयोगी नहीं है, शायद कम उपयोगी है।

उपलब्ध साहित्य को पढ़ने में, मुझे लगता है कि TDD सामने बड़े पैमाने पर सिंक लगता है, लेकिन अंत में भुगतान करता है। मैं बस सोच रहा हूँ, क्या कोई वास्तविक दुनिया के उदाहरण हैं? क्या यह भारी हताशा कभी वास्तविक दुनिया में भुगतान करती है?

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

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


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


3
butunclebob.com/ArticleS.Unclebus.JustTenMinutesWithoutAtest यहां एक चाचा बॉब की एक कहानी है जो उन्होंने वास्तविक विश्व स्थिति का सामना किया।
हकन डेरिल

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

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

जवाबों:


26

यह कागज दर्शाता है कि TDD 40-90% की कमी के बदले में 15-35% विकास का समय जोड़ता है, अन्यथा जैसी परियोजनाओं के लिए दोष घनत्व में कमी आती है।

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

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

पूर्ण कागज भी टीडीडी और उनके उच्च स्तरीय परिणामों (खंड 3 संबंधित निर्माण ), जॉर्ज और विलियम्स 2003, मुलर और हैगनर (2002), एर्दोग्मस एट अल सहित प्रासंगिक अनुभवजन्य अध्ययनों का संक्षेप में वर्णन करता है। (2005), मुलर और टीची (2001), जेनजन और सीडियन (2006)।


2
Meta.StackOverflow पर एक चर्चा के अनुसार , क्या आप उस पेपर से अतिरिक्त जानकारी जोड़ सकते हैं जो पूछने वाले के साथ-साथ भविष्य के लोगों के लिए भी प्रासंगिक हो, जो इस प्रश्न को खोजते हैं ?
थॉमस ओवेन्स

2
@ThomasOwens, मैं इस निष्कर्ष सोचा ( "TDD 15-35% विकास समय दोष घनत्व में 40-90% की कमी के लिए बदले में कहते हैं,") था में अतिरिक्त जानकारी है कि उत्तर मूल प्रश्न <_ <

4
इस पोस्ट को पर्याप्त जानकारी नहीं होने के लिए चिह्नित किया गया है। मैंने अभी तक पेपर नहीं पढ़ा है, लेकिन ऐसा प्रतीत होता है कि लोग उत्तर के शरीर में और अधिक जानकारी चाहते हैं। शायद अध्ययन में उपयोग की जाने वाली विशिष्ट स्थितियों के बारे में अधिक चर्चा करें?
थॉमस ओवेन्स

सभी आँकड़ों में से 99% काल्पनिक हैं। : पी लेकिन वास्तव में यह संदर्भ के बारे में है। किस तरह की टीम पर? सामान्य जावा देवों का एक बड़ा झुंड? हां, मेरा मानना ​​है कि TDD उत्पादकता के साथ उनकी मदद करेगा। लेकिन इसका मतलब यह नहीं है कि पहली बार में वास्तु कौशल को डिजाइन करने और मजबूत कोड को महत्व देने से उन्हें और भी अधिक मदद नहीं मिलेगी और IMO, टेस्ट-प्रथम TDD बहुत आसानी से उन्हें कभी भी सीखने से रोक सकता है कि वह ठीक से कैसे करें। और हां, मैंने सुना है कि यह डिजाइन के साथ मदद करता है। कुछ हद तक, यह शायद सच है, लेकिन यह अभी भी स्वीकार करने में असफल है और रूट समस्या आईएमओ के लिए एक बैंड सहायता है।
एरिक रिपेन

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

16

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

मैं पिछले तीन वर्षों से टीडीडी काम कर रहा हूं, और मेरा अनुभव इसके ठीक विपरीत है। मैं यूनिट परीक्षण लिखने में कम समय व्यतीत करता हूं कि मैं कोड डिबग करना होगा, क्या मैंने इकाई परीक्षण नहीं लिखा था।

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

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

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

लेकिन टीडीडी के काम करने में मेरी वर्तमान दक्षता इकाई परीक्षणों को लिखने के लिए दोनों माहिरों के संयोजन से आती है, लेकिन इस प्रणाली को लागू करने वाली तकनीक (सी # इस मामले में) में भी महारत हासिल है।

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

लेकिन यह वास्तविक परियोजनाओं पर कितना अच्छा काम करता है?

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

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

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

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


9

हमने बड़े पैमाने पर लाभ उठाया है।

हम टियर 1 मर्चेंट हैं, जिसका अर्थ है कि हम प्रति वर्ष छह लाख से अधिक भुगतान लेनदेन करते हैं।

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

कोड कवरेज आपको वह आत्मविश्वास देता है। बेशक यह अपने आप में पर्याप्त नहीं है, लेकिन यह बहुत अच्छी शुरुआत है।

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

व्यक्तिगत रूप से, मुझे परीक्षण लिखने से पहले किसी भी तर्क को लिखना मुश्किल लगता है। यह कहने के बाद, मुझे TDD तरीके से सोचना शुरू करने में थोड़ा समय लगा।

वीज़ा पीसीआई संदर्भ: http://usa.visa.com/merchants/risk_management/cisp_merchants.html


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

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

7

हालांकि परीक्षणों को अक्सर कुछ लोगों द्वारा बहुत अधिक करने का एक तरीका माना जा सकता है, मुझे लगता है कि यह वास्तव में कुछ मामलों में परेशानी के लायक है।

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

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

और एक निश्चित ग्रिड पर लागू होने वाली रणनीतियाँ काफी "यादृच्छिक" हैं, यह कहना है कि आप किसी विशेष ग्रिड पर सभी का उपयोग नहीं करेंगे।

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


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

6

टीडीडी का लाभ यह है कि आप वास्तविक कोड लिखने से पहले अपने कोड को कॉल करने का तरीका जानते हैं ।

दूसरे शब्दों में, TDD आपके एपीआई को डिजाइन करने में मदद करता है।

मेरे अनुभव में यह बेहतर एपीआई का परिणाम है जो बदले में बेहतर कोड देता है।


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

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

परीक्षण के मामले विनिर्देश के संस्करण चल रहे हैं और आपको बहुत आसानी से देखने की अनुमति देता है कि कैसे अपने एपीआई को लागू करना है। यह शायद "HOW" का सबसे उपयोगी रूप है -documentation जिसे मैंने अब तक देखा है ( "WHY" -documentation जैसे JavaDoc से तुलना करें ) क्योंकि आप निश्चित हैं कि यह सही है (अन्यथा परीक्षण विफल हो जाएगा)।

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


8
यह उत्तर पूरी तरह से प्रश्न के बगल में प्रतीत होता है, क्योंकि प्रश्न वास्तविक दुनिया के उदाहरणों के लिए कहता है । लेकिन जब से तीन लोगों ने सोचा कि "यह उत्तर उपयोगी है", मुझे कुछ याद आ रहा है।

3
सहमत हुए, लेकिन मुझे वोट डाउन करने के लिए प्रतिष्ठा की कमी है। यह सिर्फ "टीडीडी बेहतर परिणाम देता है" जिसका रखरखाव में कोई टीडीडी व्युत्पन्न परियोजना का कोई उदाहरण नहीं है, यह जवाब देने के लिए कि मैं बचना चाहता था।
जेम्स

अब जब कई लोग मुझसे सहमत हो गए, तो मैंने हिम्मत कर ली। क्या कोई उत्थानकर्ता या लेखक कृपया कदम बढ़ाएगा और हमें बताएगा कि यह एक अच्छा जवाब क्यों है?

@delnan "I dare downvote" - शब्दों का एक दिलचस्प विकल्प। क्या आपके स्वाद में गिरावट आई है?

हां, मैंने अपना डाउनवोट हटा दिया है कि मैंने इसे देखा।

5

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

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

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

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

आपने अपने प्रश्न में निम्नलिखित कहा है:

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

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

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

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

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

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

TL: DR - हाँ, वे एक वास्तविक विश्व सहायता हैं, लेकिन वे एक निवेश हैं। लाभ केवल बाद में स्पष्ट हो जाते हैं।


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

अफसोस की बात है, क्योंकि किसी और को यूनिट परीक्षण का निर्माण नहीं लगता है, कम से कम किसी भी कोड पर नहीं जो मुझे पिछले डेवलपर्स से विरासत में मिला है। अगर वे होते तो मेरा जीवन बहुत आसान होता। मेरा सुझाव है कि आप पुस्तक को लिंक में देखें, जिसमें वास्तविक दुनिया के उदाहरण हैं, हालांकि यह रेल के बजाय PHP के लिए है। amazon.com/…
गॉर्डन

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

4

मैं काम में अक्सर TDD का उपयोग कर रहा हूं। मेरा अनुभव है कि टीडीडी खुद को सही ठहराता है क्योंकि आप अतिरिक्त समय या प्रयास का भुगतान नहीं करते हैं, आप इसे बचाते हैं।

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

  • क्यूए बहुत कम बग रिपोर्ट करता है, इसलिए हम एक रिलीज के बाद अपने कोड की मरम्मत पर लागत बचाते हैं। ऐसा इसलिए है क्योंकि TDD आपको टेस्ट के बिना कोड लिखने की अनुमति नहीं देता है इसलिए कोड कवरेज बहुत बेहतर है।

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

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

  • यहां तक ​​कि अगर मैं एक डिबगर का उपयोग करता हूं तो यह पूरे एप्लिकेशन की तुलना में परीक्षण के निष्पादन को डिबग करने के लिए बहुत तेज है।

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


गुणवत्ता मुक्त है!
मैथअटैक

2
खराब गुणवत्ता महंगी है!
वोल्फगैंग

3

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


2

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

मैं अभी वहाँ नहीं मिला। मैं कफ से और बिना दोहन के कोड लिखने में बहुत अच्छा हूं। यह सब बकवास लिखने के लिए एक बड़े कचरे की तरह लगता है। लेकिन यह कई चीजें करता है, जिनमें शामिल हैं (अनन्य नहीं):

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

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


2

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

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

मैंने बहुत सारे रेल TDD नहीं किए हैं, लेकिन मैंने C ++, C #, Java और पायथन में बहुत कुछ किया है। मैं आपको बता सकता हूं कि यह निश्चित रूप से काम करता है। मेरा अनुमान है कि आप टेस्ट नामों के बारे में सोचने में बहुत समय बिता रहे हैं क्योंकि आप पर्याप्त आश्वस्त नहीं हैं। पहले अपना परीक्षण लिखें, लेकिन अपनी रचनात्मकता को बहने दें ...

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

एक टिप के लिए समय

टिप # 1

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

टिप # 2

एक सरल "canCreate" परीक्षण द्वारा नए वर्ग परीक्षणों को शुरू करें, बस अपने दिमाग को सही दिशा में सेट करने के लिए, जैसा कि "ठीक है, मैं अभी इस वर्ग पर काम कर रहा हूं ... सही है।"

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

और याद रखें

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

इसे दूसरा शॉट दो। और मुझे क्लीन कोड कास्ट देखने की सलाह देते हैं , खासकर टीडीडी के बारे में।


1

वास्तविक दुनिया गैर-तुच्छ उदाहरण:

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


-1

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

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

मैंने अभी तक जो कुछ भी कहा है उसका सभी को विशेष रूप से टीडीडी से कोई लेना-देना नहीं है, विशेष रूप से कार्यान्वयन से पहले परीक्षण लिखने के अर्थ में, लेकिन मेरा मानना ​​है कि परीक्षण कोड बनाम परीक्षण लिखने से पहले होने वाले लाभों को अलग करना महत्वपूर्ण है।

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

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

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

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

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

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


इससे पूछे गए प्रश्न का उत्तर देने का प्रयास भी नहीं किया जाता है: "क्या हमारे पास कोई उदाहरण है जो दिखावा वास्तविक है? क्या कोई वास्तव में विरासत में मिला है या कोड में वापस आया है जिसे TDD के साथ डिजाइन / विकसित किया गया था और इसमें यूनिट परीक्षणों का एक पूरा सेट है। वास्तव में एक भुगतान महसूस हुआ? "
gnat

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

मेरे पास TDD पर एक राय नहीं है, और मैं वोटों को पसंद / नापसंद नहीं करता (यह एक सवाल और जवाब साइट है, फेसबुक नहीं)। मेरे पढ़ने के अनुसार, यह "उत्तर" बस उस सवाल का जवाब नहीं देता है, जो न तो सकारात्मक है और न ही नकारात्मक रूप से
gnat

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

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