परीक्षण संचालित डिजाइन को अपनाने से मैं क्या खोता हूं?
केवल नकारात्मक सूची; नकारात्मक रूप में लिखे गए लाभों को सूचीबद्ध न करें।
परीक्षण संचालित डिजाइन को अपनाने से मैं क्या खोता हूं?
केवल नकारात्मक सूची; नकारात्मक रूप में लिखे गए लाभों को सूचीबद्ध न करें।
जवाबों:
कई डाउनसाइड्स (और मैं यह दावा नहीं कर रहा हूं कि कोई लाभ नहीं है - खासकर जब किसी परियोजना की नींव लिखते समय - यह अंत में बहुत समय बचाएगा):
यदि आप "वास्तविक" टीडीडी (रीड: रेड, ग्रीन, रिफलेक्टर स्टेप्स के साथ पहले टेस्ट) करना चाहते हैं, तो आपको मोक्स / स्टब्स का उपयोग करना शुरू करना होगा, जब आप इंटीग्रेशन पॉइंट्स का परीक्षण करना चाहते हैं।
जब आप मोक्स का उपयोग करना शुरू करते हैं, तो थोड़ी देर के बाद, आप डिपेंडेंसी इंजेक्शन (DI) और कंट्रोल ऑफ एवोल्यूशन (IoC) कंटेनर का उपयोग शुरू करना चाहेंगे। ऐसा करने के लिए आपको सब कुछ के लिए इंटरफेस का उपयोग करने की आवश्यकता है (जिसमें स्वयं बहुत नुकसान हैं)।
दिन के अंत में, आपको बहुत अधिक कोड लिखना होगा, जैसे कि आप इसे "सादे पुराने तरीके" से करते हैं। सिर्फ एक ग्राहक वर्ग के बजाय, आपको एक इंटरफ़ेस, एक मॉक क्लास, कुछ IoC कॉन्फ़िगरेशन और कुछ परीक्षण लिखने की आवश्यकता है।
और याद रखें कि परीक्षण कोड भी बनाए रखा जाना चाहिए और देखभाल की जानी चाहिए। टेस्ट सब कुछ के रूप में पठनीय होना चाहिए और अच्छा कोड लिखने में समय लगता है।
कई डेवलपर्स बिल्कुल समझ नहीं पाते हैं कि इन सभी को "सही तरीके से" कैसे किया जाए। लेकिन क्योंकि हर कोई उन्हें बताता है कि सॉफ्टवेयर विकसित करने के लिए TDD ही एकमात्र सच्चा तरीका है, वे बस वह सबसे अच्छा प्रयास करते हैं जो वे कर सकते हैं।
यह बहुत कठिन है जितना कोई सोच सकता है। अक्सर टीडीडी के साथ किए गए प्रोजेक्ट बहुत सारे कोड के साथ समाप्त होते हैं जो कोई भी वास्तव में नहीं समझता है। यूनिट परीक्षण अक्सर गलत चीज, गलत तरीके का परीक्षण करते हैं। और कोई भी इस बात से सहमत नहीं है कि एक अच्छा परीक्षण कैसा दिखना चाहिए, तथाकथित गुरु भी नहीं।
उन सभी परीक्षणों से आपके सिस्टम के व्यवहार और सरल परिवर्तनों के "परिवर्तन" (रीफैक्टरिंग के विपरीत) के लिए बहुत मुश्किल हो जाता है।
यदि आप टीडीडी साहित्य पढ़ते हैं, तो हमेशा कुछ बहुत अच्छे उदाहरण होते हैं, लेकिन अक्सर वास्तविक जीवन के अनुप्रयोगों में, आपके पास एक उपयोगकर्ता इंटरफ़ेस और एक डेटाबेस होना चाहिए। यह वह जगह है जहां टीडीडी वास्तव में कठिन हो जाता है, और अधिकांश स्रोत अच्छे उत्तर नहीं देते हैं। और अगर वे करते हैं, तो इसमें हमेशा अधिक सार शामिल होते हैं: नकली वस्तुएं, एक इंटरफ़ेस के लिए प्रोग्रामिंग, एमवीसी / एमवीपी पैटर्न आदि, जिसमें फिर से बहुत अधिक ज्ञान की आवश्यकता होती है, और ... आपको और भी अधिक कोड लिखना होगा।
इसलिए सावधान रहें ... यदि आपके पास उत्साही टीम नहीं है और कम से कम एक अनुभवी डेवलपर है जो अच्छी परीक्षा लिखना जानता है और अच्छी वास्तुकला के बारे में कुछ बातें भी जानता है, तो आपको टीडीडी रोड पर जाने से पहले दो बार सोचना होगा ।
जब आप उस बिंदु पर पहुंच जाते हैं जहां आपके पास बड़ी संख्या में परीक्षण हैं, तो सिस्टम को बदलने के लिए आपके कुछ या सभी परीक्षणों को फिर से लिखना पड़ सकता है, जिसके आधार पर परिवर्तन द्वारा अमान्य हो गए। यह एक अपेक्षाकृत जल्दी संशोधन को बहुत समय लेने वाली में बदल सकता है।
इसके अलावा, आप वास्तव में अच्छे डिजाइन के सिद्धांतों की तुलना में TDD पर आधारित डिजाइन निर्णय लेना शुरू कर सकते हैं। जबकि आपके पास एक बहुत ही सरल, आसान समाधान हो सकता है जो कि टीडीडी की मांग के तरीके का परीक्षण करना असंभव है, अब आपके पास एक बहुत अधिक जटिल प्रणाली है जो वास्तव में गलतियों के लिए अधिक संभावना है।
if part of the system is covered by tests and they pass, then everything is fine (including design)
।
मुझे लगता है कि मेरे लिए सबसे बड़ी समस्या समय का बहुत बड़ा नुकसान है, जो "इसमें हो रही है"। मैं अभी भी TDD के साथ अपनी यात्रा की शुरुआत में बहुत अधिक हूं ( यदि आप रुचि रखते हैं, तो मेरे परीक्षण रोमांच को अपडेट करने के लिए मेरा ब्लॉग देखें ) और मैंने शाब्दिक रूप से शुरू होने में घंटों बिताए हैं ।
अपने मस्तिष्क को "परीक्षण मोड" में लाने के लिए एक लंबा समय लगता है और "परीक्षण योग्य कोड" लिखना अपने आप में एक कौशल है।
टीबीएच, मैं सम्मानपूर्वक निजी तरीकों को सार्वजनिक करने पर जेसन कोहेन की टिप्पणियों से असहमत हूं , कि यह क्या है। मैंने पहले की तुलना में अपने नए तरीके के काम में कोई सार्वजनिक तरीका नहीं बनाया है । हालाँकि, इसमें वास्तु परिवर्तन शामिल है और आपके लिए कोड के "हॉट प्लग" मॉड्यूल की अनुमति है जिससे परीक्षण करने के लिए और सब कुछ आसान हो सके। आप चाहिए नहीं यह करने के लिए अपने कोड के आंतरिक अधिक सुगम बनाने जा। अन्यथा हम सब कुछ सार्वजनिक होने के साथ एक वर्ग में वापस आ गए हैं, उस में कहाँ है?
तो, (IMO) संक्षेप में:
पुनश्च: यदि आप सकारात्मकता के लिंक चाहते हैं, तो मैंने इस पर कई प्रश्न पूछे हैं और उत्तर दिए हैं, मेरी प्रोफ़ाइल देखें ।
कुछ वर्षों में मैंने टेस्ट ड्रिवेन डेवलपमेंट का अभ्यास किया है, मुझे कहना पड़ेगा कि सबसे बड़ी गिरावट हैं:
TDD जोड़े में सबसे अच्छा किया जाता है। एक के लिए, यह मुश्किल है कि आप केवल लिखने के लिए कार्यान्वयन को लिखने का आग्रह करें जब आप जानते हैं कि एक और / कैसे बयान लिखना है । लेकिन एक जोड़ी आपको काम पर रखेगी क्योंकि आप उसे काम पर रखते हैं। अफसोस की बात है कि कई कंपनियां / प्रबंधक यह नहीं सोचते हैं कि यह संसाधनों का अच्छा उपयोग है। एक सुविधा को लिखने के लिए दो लोगों को भुगतान क्यों करें, जब मेरे पास दो विशेषताएं हैं जिन्हें एक ही समय में करने की आवश्यकता है?
कुछ लोगों के पास यूनिट टेस्ट लिखने के लिए धैर्य नहीं है। कुछ को अपने काम पर बहुत गर्व है। या, कुछ इस तरह से स्क्रीन के अंत से विचलित तरीकों / कार्यों को देखने की तरह है। TDD हर किसी के लिए नहीं है, लेकिन मैं वास्तव में यह चाहते थे। यह उन गरीब आत्माओं के लिए सामान को बनाए रखना बहुत आसान बना देगा जो विरासत में मिली कोड।
आदर्श रूप से, आपके परीक्षण केवल तभी टूटेंगे जब आप एक खराब कोड निर्णय लेंगे। यही है, आपने सोचा था कि सिस्टम ने एक तरह से काम किया, और यह पता चला कि यह नहीं हुआ। परीक्षण का परीक्षण, या (छोटा) सेट को तोड़कर, यह वास्तव में अच्छी खबर है। आपको पता है कि आपका नया कोड सिस्टम को कैसे प्रभावित करेगा। हालांकि, यदि आपके परीक्षण खराब लिखे गए हैं, कसकर युग्मित हैं या इससे भी बदतर, उत्पन्न ( खांसी वीएस टेस्ट), तो अपने परीक्षणों को बनाए रखना जल्दी से एक गाना बजानेवालों बन सकता है। और, पर्याप्त परीक्षणों के बाद वे अधिक काम का कारण बनने लगते हैं जो कथित मूल्य वे पैदा कर रहे हैं, फिर परीक्षणों को हटाए जाने के लिए पहली चीज होगी जब शेड्यूल संकुचित हो जाता है (उदाहरण के लिए यह क्रंच समय तक हो जाता है)।
आदर्श रूप में, फिर से, यदि आप कार्यप्रणाली का पालन करते हैं, तो आपका कोड डिफ़ॉल्ट रूप से 100% परीक्षण किया जाएगा। आमतौर पर, सोचा, मैं 90% से ऊपर कोड कवरेज के साथ समाप्त होता हूं। यह आमतौर पर तब होता है जब मेरे पास कुछ टेम्पलेट शैली वास्तुकला होती है, और आधार का परीक्षण किया जाता है, और मैं कोनों को काटने की कोशिश करता हूं और टेम्पलेट अनुकूलन का परीक्षण नहीं करता। इसके अलावा, मैंने पाया है कि जब मैं एक नई बाधा का सामना करता हूं, जिसका मैं पहले सामना नहीं कर पाया था, तो मुझे इसके परीक्षण में सीखने की अवस्था है। मैं पुराने स्कुल तरीके से कोड की कुछ पंक्तियाँ लिखना स्वीकार करूंगा, लेकिन मुझे वास्तव में 100% पसंद है। (मुझे लगता है कि मैं स्कूल में एक अति प्राप्त करने वाला था, एर स्कुल)।
हालाँकि, इसके साथ ही मैं यह कहूंगा कि TDD के लाभ ने सरल विचार के लिए नकारात्मक को दूर कर दिया है कि यदि आप परीक्षणों का एक अच्छा सेट प्राप्त कर सकते हैं जो आपके आवेदन को कवर करते हैं लेकिन इतने नाजुक नहीं हैं कि एक परिवर्तन उन सभी को तोड़ देता है, तो आप करेंगे आप अपनी परियोजना के दिन 300 में नई सुविधाएँ जोड़ते रह सकते हैं जैसा कि आपने पहले दिन किया था। यह उन सभी के साथ नहीं होता जो टीडीडी की कोशिश करते हैं यह सोचते हुए कि यह उनके बग-राइड कोड के लिए एक जादू की गोली है, और इसलिए वे सोचते हैं कि यह हो सकता है 'टी वर्क, पीरियड।
व्यक्तिगत रूप से मैंने पाया है कि टीडीडी के साथ, मैं सरल कोड लिखता हूं, मैं यह बहस करने में कम समय व्यतीत करता हूं कि क्या कोई विशेष कोड समाधान काम करेगा या नहीं, और मुझे कोड की किसी भी पंक्ति को बदलने का कोई डर नहीं है जो मानदंडों को पूरा नहीं करता है दल।
टीडीडी मास्टर करने के लिए एक कठिन अनुशासन है, और मैं कुछ वर्षों के लिए इस पर रहा हूं, और मैं अभी भी हर समय नई परीक्षण तकनीक सीखता हूं। यह सामने आने वाला एक बड़ा निवेश है, लेकिन, यदि आपकी कोई स्वचालित इकाई परीक्षण नहीं हुआ तो दीर्घावधि में, आपकी स्थिरता बहुत अधिक होगी। अब, अगर केवल मेरे मालिक ही यह पता लगा सकते हैं।
आपकी पहली टीडीडी परियोजना में दो बड़े नुकसान, समय और व्यक्तिगत स्वतंत्रता हैं
आप समय खो देते हैं क्योंकि:
आप व्यक्तिगत स्वतंत्रता खो देते हैं क्योंकि:
उम्मीद है की यह मदद करेगा
TDD के लिए आपको यह योजना बनाने की आवश्यकता है कि उन परीक्षणों को पास करने के लिए कोड लिखने से पहले आपकी कक्षाएं कैसे संचालित होंगी। यह प्लस और माइनस दोनों है।
मुझे "वैक्यूम" में परीक्षण लिखना मुश्किल लगता है - फिर भी कोई भी कोड लिखा गया है। अपने अनुभव में जब भी मैं अपनी कक्षाओं को लिखने के दौरान अनिवार्य रूप से कुछ सोचता हूं, तो अपनी प्रारंभिक परीक्षाओं के दौरान यात्रा करना भूल जाता हूं। फिर यह न केवल मेरी कक्षाओं को रिफलेक्टर करने का समय है, बल्कि मेरे परीक्षणों का भी। इसे तीन या चार बार दोहराएं और इससे निराशा हो सकती है।
मैं पहले अपनी कक्षाओं का एक मसौदा लिखना पसंद करता हूं, फिर यूनिट परीक्षणों की एक बैटरी (और रखरखाव) लिखता हूं। मेरे पास एक मसौदा होने के बाद, टीडीडी मेरे लिए ठीक काम करता है। उदाहरण के लिए, यदि बग की सूचना दी जाती है, तो मैं उस बग का फायदा उठाने के लिए एक परीक्षण लिखूंगा और फिर कोड को ठीक करूंगा ताकि परीक्षण पास हो जाए।
टीडीडी के साथ प्रोटोटाइप करना बहुत मुश्किल हो सकता है - जब आप सुनिश्चित नहीं होते हैं कि आप किस सड़क पर समाधान के लिए जा रहे हैं, तो परीक्षणों को लिखना मुश्किल हो सकता है (बहुत व्यापक लोगों के अलावा)। यह दर्द हो सकता है।
ईमानदारी से, मुझे नहीं लगता कि परियोजनाओं के विशाल बहुमत के लिए "मुख्य विकास" के लिए कोई वास्तविक नकारात्मक पहलू है, हालांकि; यह बहुत अधिक नीचे बात की गई है जो आमतौर पर उन लोगों द्वारा होनी चाहिए, जो मानते हैं कि उनका कोड काफी अच्छा है कि उन्हें परीक्षणों की आवश्यकता नहीं है (यह कभी नहीं है) और जो लोग सीधे सादे हैं उन्हें लिखने के लिए परेशान नहीं किया जा सकता है।
खैर, और यह खींच, आपको अपने परीक्षणों को डिबग करने की आवश्यकता है। इसके अलावा, परीक्षणों को लिखने के लिए समय की एक निश्चित लागत है, हालांकि ज्यादातर लोग इस बात से सहमत हैं कि यह एक अप-फ्रंट निवेश है जो आवेदन के जीवनकाल में दोनों डिबगिंग और स्थिरता में सहेजता है।
व्यक्तिगत रूप से मेरे पास सबसे बड़ी समस्या है, हालांकि, वास्तव में परीक्षण लिखने के लिए अनुशासन उठ रहा है। एक टीम में, विशेष रूप से एक स्थापित टीम, उन्हें यह समझाने में मुश्किल हो सकती है कि खर्च किया गया समय सार्थक है।
यदि आपके परीक्षण बहुत गहन नहीं हैं, तो आप "सब कुछ काम करता है" की झूठी भावना में पड़ सकते हैं, क्योंकि आप परीक्षा पास करते हैं। सैद्धांतिक रूप से यदि आपके परीक्षण पास हो जाते हैं, तो कोड काम कर रहा है; लेकिन अगर हम पहली बार कोड लिख सकते हैं तो हमें परीक्षणों की आवश्यकता नहीं होगी। यहाँ नैतिक यह है कि किसी चीज़ को पूरा करने से पहले अपने आप से एक पवित्रता जाँच सुनिश्चित करें, बस परीक्षणों पर भरोसा न करें।
उस नोट पर, यदि आपकी पवित्रता की जाँच में कुछ ऐसा पाया जाता है जिसका परीक्षण नहीं किया गया है, तो वापस जाना सुनिश्चित करें और उसके लिए एक परीक्षण लिखें।
टीडीडी के लिए नकारात्मक पक्ष यह है कि यह आमतौर पर 'एजाइल' पद्धति से जुड़ा होता है, जो किसी प्रणाली के दस्तावेज़ीकरण पर कोई महत्व नहीं रखता है, बल्कि इसके पीछे की समझ यह है कि परीक्षण 'किसी भी अन्य के बजाय केवल एक विशिष्ट मान क्यों लौटना चाहिए' डेवलपर में सिर।
जैसे ही डेवलपर निकल जाता है या यह कारण भूल जाता है कि परीक्षण एक विशिष्ट मूल्य लौटाता है और कुछ अन्य नहीं, तो आप खराब हो जाते हैं। TDD ठीक है अगर यह पर्याप्त रूप से प्रलेखित है और मानव-पठनीय (यानी नुकीले बालों वाले प्रबंधक) दस्तावेज से घिरा हुआ है जिसे 5 वर्षों में संदर्भित किया जा सकता है जब दुनिया बदलती है और आपके ऐप को भी इसकी आवश्यकता होती है।
जब मैं दस्तावेज़ीकरण की बात करता हूं, तो यह कोड में ब्लर्ब नहीं है, यह आधिकारिक लेखन है जो एप्लिकेशन के लिए बाहरी रूप से मौजूद है, जैसे कि उपयोग के मामले और पृष्ठभूमि की जानकारी जिसे प्रबंधकों, वकीलों और गरीब एसएपी द्वारा संदर्भित किया जा सकता है जिन्हें अपडेट करना है 2011 में आपका कोड।
मैंने कई स्थितियों का सामना किया है जहां टीडीडी मुझे पागल बना देता है। कुछ नाम रखने के लिए:
टेस्ट केस मेंटेनेंस:
यदि आप एक बड़े उद्यम में हैं, तो कई संभावनाएं हैं कि आपको परीक्षण मामलों को स्वयं नहीं लिखना होगा या कम से कम उनमें से अधिकांश किसी और द्वारा लिखे गए हैं जब आप कंपनी में प्रवेश करते हैं। किसी एप्लिकेशन की विशेषताएं समय-समय पर बदलती रहती हैं और यदि आपके पास उनकी जगह लेने के लिए HP गुणवत्ता केंद्र जैसी कोई प्रणाली नहीं है, तो आप कुछ ही समय में पागल हो जाएंगे।
इसका मतलब यह भी है कि नई टीम के सदस्यों को यह परखने के लिए उचित समय मिलेगा कि वे क्या कर रहे हैं। बदले में, यह अधिक पैसे की जरूरत में अनुवाद किया जा सकता है।
परीक्षण स्वचालन जटिलता:
यदि आप कुछ या सभी परीक्षण मामलों को मशीन-रन करने योग्य परीक्षण स्क्रिप्ट में स्वचालित करते हैं, तो आपको यह सुनिश्चित करना होगा कि ये परीक्षण स्क्रिप्ट उनके संबंधित मैनुअल परीक्षण मामलों के अनुरूप हैं और एप्लिकेशन परिवर्तनों के अनुरूप हैं।
इसके अलावा, आप उन कोड्स को डीबग करने के लिए समय बिताएंगे जो आपको बग्स को पकड़ने में मदद करते हैं। मेरी राय में, इनमें से अधिकांश बग स्वचालन परीक्षण स्क्रिप्ट में एप्लिकेशन परिवर्तनों को प्रतिबिंबित करने के लिए परीक्षण टीम की विफलता से आते हैं। व्यावसायिक तर्क, जीयूआई और अन्य आंतरिक सामानों में परिवर्तन से आपकी स्क्रिप्ट चल रही है या बिना रुके चल सकती है। कभी-कभी परिवर्तन बहुत सूक्ष्म होते हैं और इसका पता लगाना मुश्किल होता है। एक बार जब मेरी सभी स्क्रिप्ट विफलता की रिपोर्ट करती हैं क्योंकि उन्होंने तालिका 1 से जानकारी पर अपनी गणना आधारित की थी जबकि तालिका 1 अब तालिका 2 थी (क्योंकि किसी ने कोड कोड में तालिका ऑब्जेक्ट का नाम स्वैप किया था)।
सबसे बड़ी समस्या वे लोग हैं जो उचित इकाई परीक्षण लिखना नहीं जानते हैं। वे ऐसे परीक्षण लिखते हैं जो एक-दूसरे पर निर्भर करते हैं (और वे चींटी के साथ दौड़ते हुए महान काम करते हैं, लेकिन तब अचानक असफल हो जाते हैं जब मैं उन्हें ग्रहण से चलाता हूं, सिर्फ इसलिए कि वे अलग-अलग क्रम में चलते हैं)। वे ऐसे परीक्षण लिखते हैं जो विशेष रूप से किसी भी चीज का परीक्षण नहीं करते हैं - वे सिर्फ कोड को डिबग करते हैं, परिणाम की जांच करते हैं, और इसे "1% 1" कहते हुए परीक्षण में बदलते हैं। वे कक्षाओं और विधियों के दायरे को चौड़ा करते हैं, सिर्फ इसलिए कि उनके लिए यूनिट टेस्ट लिखना आसान होगा। इकाई परीक्षणों का कोड भयानक है, सभी शास्त्रीय प्रोग्रामिंग समस्याओं (भारी युग्मन, विधियां जो 500 पंक्तियों लंबी, कठोर-कोडित मान, कोड दोहराव) हैं और बनाए रखने के लिए एक नरक है। कुछ अजीब कारणों से लोग यूनिट परीक्षणों को "वास्तविक" कोड से कुछ हीन मानते हैं, और वे डॉन ' उनकी गुणवत्ता के बारे में परवाह नहीं है। :-(
आप लेखन परीक्षण में बहुत समय बिताते हैं। बेशक, इस परियोजना के अंत तक कीड़े को तेजी से पकड़कर बचाया जा सकता है।
सबसे बड़ा नकारात्मक पक्ष यह है कि यदि आप वास्तव में टीडीडी को ठीक से करना चाहते हैं तो आपको सफल होने से पहले बहुत कुछ विफल करना होगा। यह देखते हुए कि कितनी सॉफ्टवेयर कंपनियां काम करती हैं (डॉलर प्रति KLOC) आखिरकार आपको निकाल दिया जाएगा। यहां तक कि अगर आपका कोड तेज़, क्लीनर, बनाए रखने में आसान है, और इसमें कम कीड़े हैं।
यदि आप एक ऐसी कंपनी में काम कर रहे हैं जो आपको KLOC (या कार्यान्वित की गई आवश्यकताओं - भले ही परीक्षण न किया गया हो) से भुगतान करती है, तो TDD (या कोड रिव्यू, या पेयर प्रोग्रामिंग, या कंटीन्यूअस इंटीग्रेशन, आदि) आदि से दूर रहें।
आप यह कहने की क्षमता खो देते हैं कि आप अपने सभी कोड का परीक्षण करने से पहले "किए गए" हैं।
आप इसे चलाने से पहले कोड की सैकड़ों या हजारों लाइनें लिखने की क्षमता खो देते हैं।
आप डिबगिंग के माध्यम से सीखने का अवसर खो देते हैं।
आप उस कोड को शिप करने के लिए लचीलापन खो देते हैं जिसके बारे में आप निश्चित नहीं हैं।
आप अपने मॉड्यूल को कसकर जोड़े रखने की स्वतंत्रता खो देते हैं।
आप निम्न स्तर के डिज़ाइन प्रलेखन को छोड़ने का विकल्प खो देते हैं।
आप उस स्थिरता को खो देते हैं जो कोड के साथ आती है जिसे हर कोई बदलने से डरता है।
मुश्किल, अप्रत्याशित आवश्यकताओं पर फिर से भरना प्रोग्रामर का निरंतर प्रतिबंध है। परीक्षण-संचालित विकास आपको पहले से ज्ञात, सांसारिक आवश्यकताओं पर ध्यान केंद्रित करने के लिए मजबूर करता है, और आपके विकास को पहले से ही कल्पना की गई सीमा तक सीमित करता है।
इसके बारे में सोचें, आप विशिष्ट परीक्षण मामलों के लिए डिजाइनिंग को समाप्त करने की संभावना रखते हैं, इसलिए आप रचनात्मक नहीं होंगे और यह सोचना शुरू कर देंगे "यदि उपयोगकर्ता एक्स, वाई, और जेड कर सकता है तो यह अच्छा होगा"। इसलिए, जब वह उपयोगकर्ता संभावित शांत आवश्यकताओं एक्स, वाई, और जेड के बारे में सभी उत्साहित होने लगता है, तो आपका डिज़ाइन पहले से निर्दिष्ट परीक्षण मामलों पर बहुत अधिक ध्यान केंद्रित किया जा सकता है, और इसे समायोजित करना मुश्किल होगा।
यह, ज़ाहिर है, एक दोहरी धार वाली तलवार है। यदि आप हर कल्पनीय, कल्पनाशील, एक्स, वाई और जेड के लिए अपना सारा समय डिजाइन करने में बिताते हैं, जो उपयोगकर्ता कभी भी चाहते हैं, तो आप अनिवार्य रूप से कभी भी कुछ भी पूरा नहीं करेंगे। यदि आप कुछ पूरा करते हैं, तो किसी के लिए भी (अपने आप सहित) यह असंभव होगा कि आप अपने कोड / डिज़ाइन में क्या कर रहे हैं।
यह एक्सएमएल-फीड्स और डेटाबेस जैसे "रैंडम" डेटा के लिए कठिन और समय लेने वाला लेखन परीक्षण हो सकता है (यह कठिन नहीं)। मैंने कुछ समय मौसम डेटा फीड के साथ काम करने में बिताया है। यह काफी भ्रमित करने वाला लेखन परीक्षण है, कम से कम, क्योंकि मुझे टीडीडी के साथ बहुत अधिक अनुभव नहीं है।
आप कई जिम्मेदारियों के साथ बड़ी कक्षाएं खो देंगे। आप कई जिम्मेदारियों के साथ बड़े तरीकों को खो देंगे। आप रिफ्लेक्टर करने के लिए कुछ क्षमता खो सकते हैं, लेकिन आप रिफ्लेक्टर की आवश्यकता को भी खो देंगे।
जेसन कोहेन ने कुछ इस तरह कहा: TDD को आपके कोड के लिए एक निश्चित संगठन की आवश्यकता होती है। यह वास्तुशिल्प रूप से गलत हो सकता है; उदाहरण के लिए, चूंकि निजी तरीकों को एक कक्षा के बाहर नहीं बुलाया जा सकता है, इसलिए आपको उन्हें परीक्षण योग्य बनाने के लिए तरीकों को गैर-निजी बनाना होगा।
मैं कहता हूं कि यह एक चूक का संकेत है - अगर निजी कोड को वास्तव में जांचने की आवश्यकता है, तो यह संभवतः एक अलग वर्ग में होना चाहिए।
दवे मान
आपको अनुप्रयोगों को एक अलग तरीके से लिखना होगा: एक जो उन्हें परीक्षण करने योग्य बनाता है। आपको आश्चर्य होगा कि यह पहली बार में कितना मुश्किल है।
कुछ लोगों को यह सोचने की अवधारणा मिलती है कि वे इसे लिखने से पहले क्या लिखने जा रहे हैं। मॉकिंग जैसी अवधारणाएँ कुछ के लिए भी मुश्किल हो सकती हैं। यदि वे परीक्षण के लिए डिज़ाइन नहीं किए गए थे तो विरासत ऐप्स में TDD बहुत मुश्किल हो सकता है। टीडीडी फ्रेंडली जो टीडीडी फ्रेंडली नहीं हैं, उसके आसपास भी एक संघर्ष हो सकता है।
टीडीडी एक ऐसा कौशल है जिससे जूनियर देव पहले संघर्ष कर सकते हैं (मुख्यतः क्योंकि उन्हें इस तरह से काम करना नहीं सिखाया गया है)।
कुल मिलाकर यद्यपि विपक्ष हल हो जाता है क्योंकि लोग कुशल हो जाते हैं और आप 'बदबूदार' कोड को खत्म कर देते हैं और एक अधिक स्थिर प्रणाली रखते हैं।
इसमें आने के लिए कुछ समय लगता है और कुछ समय के लिए इसे किसी प्रोजेक्ट में करना शुरू करना पड़ता है लेकिन ... मुझे हमेशा टेस्ट ड्रिवेन एप्रोच नहीं करने का अफसोस होता है जब मुझे मूर्खतापूर्ण बग मिलते हैं जो एक स्वचालित परीक्षण बहुत तेजी से मिल सकता था। इसके अलावा, TDD कोड गुणवत्ता में सुधार करता है।
सभी के अच्छे जवाब। मैं टीडीडी के अंधेरे पक्ष से बचने के लिए कुछ तरीके जोड़ूंगा:
मैंने एप्स को रैंडमाइज्ड सेल्फ-टेस्ट करने के लिए लिखा है। विशिष्ट परीक्षण लिखने के साथ समस्या यह है कि यदि आप उनमें से बहुत से लिखते हैं तो वे केवल उन मामलों को कवर करते हैं जिनके बारे में आप सोचते हैं। रैंडम-टेस्ट जनरेटर उन समस्याओं का पता लगाते हैं जिनके बारे में आपने नहीं सोचा था।
बहुत सारे यूनिट परीक्षणों की पूरी अवधारणा का अर्थ है कि आपके पास ऐसे घटक हैं जो जटिल डेटा संरचनाओं की तरह अमान्य राज्यों में जा सकते हैं। यदि आप जटिल डेटा संरचनाओं से दूर रहते हैं तो परीक्षण करने के लिए बहुत कम है।
इस हद तक कि आपका एप्लिकेशन इसे अनुमति देता है, डिजाइन से शर्मीली रहें, जो सूचनाओं, घटनाओं और दुष्प्रभावों के उचित क्रम पर निर्भर करता है। वे आसानी से गिर सकते हैं या हाथापाई कर सकते हैं इसलिए उन्हें बहुत परीक्षण की आवश्यकता होती है।
TDD को आपके कोड के लिए एक निश्चित संगठन की आवश्यकता होती है। यह पढ़ने में अक्षम या कठिन हो सकता है। या यहां तक कि वास्तुकला में भी गलत; उदाहरण के लिए, जब सेprivate
विधियों को एक वर्ग के बाहर नहीं बुलाया जा सकता है, इसलिए आपको उन्हें परीक्षण योग्य बनाने के लिए तरीकों को गैर-निजी बनाना होगा, जो कि गलत है।
जब कोड बदलता है, तो आपको परीक्षणों को भी बदलना होगा। इसे फिर से तैयार करने के साथ बहुत सारे अतिरिक्त काम हो सकते हैं।
मुझे जोड़ने दें कि यदि आप BDD सिद्धांतों को TDD परियोजना में लागू करते हैं, तो आप यहाँ सूचीबद्ध कुछ बड़ी कमियों (भ्रम, गलतफहमी, आदि) को कम कर सकते हैं। यदि आप BDD से परिचित नहीं हैं, तो आपको Dan North का परिचय पढ़ना चाहिए। कार्यस्थल पर टीडीडी को लागू करने से उत्पन्न कुछ मुद्दों के जवाब में उन्होंने इस अवधारणा को अपनाया। दान का परिचय बीडीडी को मिल सकता है यहां है ।
मैं केवल यह सुझाव देता हूं क्योंकि BDD इनमें से कुछ नकारात्मक को संबोधित करता है और अंतराल को रोकने का काम करता है। अपनी प्रतिक्रिया एकत्र करते समय आप इस पर विचार करना चाहेंगे।
आपको यह सुनिश्चित करना होगा कि आपके परीक्षण हमेशा अद्यतित हों, जिस क्षण आप लाल बत्तियों को अनदेखा करना शुरू करते हैं वह क्षण वह परीक्षण निरर्थक हो जाता है।
आपको यह भी सुनिश्चित करना होगा कि परीक्षण व्यापक हैं, या पल एक बड़ा बग दिखाई देता है, आप जिस प्रकार का प्रबंधन करते हैं, वह आपको अधिक कोड लिखने की शिकायत करने में समय बिताने के लिए आश्वस्त करेगा।
जिस व्यक्ति ने मेरी टीम को फुर्तीला विकास सिखाया था, वह योजना बनाने में विश्वास नहीं करता था, आपने केवल सबसे अधिक आवश्यकता के लिए लिखा था।
उनका आदर्श वाक्य रिफलेक्टर, रिफलेक्टर, रिफलेक्टर था। मुझे समझ में आया कि रिफ्लेक्टर का मतलब 'आगे की योजना नहीं' था।
विकास का समय बढ़ता है: प्रत्येक विधि को परीक्षण की आवश्यकता होती है, और यदि आपके पास निर्भरता के साथ एक बड़ा अनुप्रयोग है, तो आपको परीक्षणों के लिए अपना डेटा तैयार करने और साफ करने की आवश्यकता है।