जब मुझे सिस्टम अंडर टेस्ट से क्लास से बाहर निकालना हो तो क्या मुझे अपनी यूनिट टेस्ट को रिफ्लेक्टर करना चाहिए?


13

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

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

क्या मैं ऐसा करने के बाद अपना टेस्ट कोड रिफलेक्टर करने वाला हूं? IE: एक ExtractedClassTest बनाएँ और OriginalClassTest से सभी प्रासंगिक परीक्षणों को इसमें स्थानांतरित करें? ऐसा लगता है कि यह थोड़ा जोखिम भरा हो सकता है: मैं इस प्रक्रिया में कुछ कवरेज खो सकता हूं, यह एक परीक्षण को आगे बढ़ाने के रूप में सरल नहीं हो सकता है और मैं कुछ परीक्षण कोड को फिर से लिखना चाहूंगा जो मुझे पता था कि काम करने के लिए इस्तेमाल किया गया था, लेकिन अब और नहीं हो सकता है। आदि।

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

मैं TDD में नया हूँ इसलिए मुझे एक विशेषज्ञ की सलाह चाहिए। धन्यवाद!

जवाबों:


7

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

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


6

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

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

पुराने परीक्षणों में जो कुछ भी बचा है, उसे केस-बाय-केस आधार पर लिया जाना चाहिए, लेकिन ज्यादातर उन्हें नई संरचना में फिर से लिखना चाहिए।

क्योंकि तुम सही हो, तुम एक रखरखाव दुःस्वप्न के साथ छोड़ दिया नहीं करना चाहती। लेकिन आप पहले की तुलना में कम पथ-कवरेज नहीं चाहते हैं।


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

1
@tieTYT: जवाब देने के लिए मुश्किल है कि वहाँ बैठे बिना आपको देखे। कभी-कभी टीडीडी की तुलना में अधिक काम की तरह प्रतीत होता है। दूसरी बार, आपको याद दिलाया जाता है कि आपने क्यों परेशान किया। और अन्य बार, यह आप है कि यह कठिन बना रहा है। अंतर बताने के लिए सीखना टीडीडी में अच्छा होने का एक बड़ा हिस्सा है।
पीडीआर

क्या आपको लगता है कि यह एक संभावना है कि इस मामले में मुझे अपने परीक्षणों को रद्द नहीं करना चाहिए था या क्या आपको लगता है कि इसकी संभावना नहीं है?
डैनियल कापलान

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