प्लस ऐसा लगता है कि करने के लगातार बदलते कोड के साथ एक व्यापक टेस्ट स्वीट सिंक्रनाइज़ एक दर्द होगा। मैं समझता हूँ कि इकाई टेस्ट स्वीट रखरखाव के दौरान काफी मदद कर सकता है, एक बार सॉफ्टवेयर बनाया गया है, स्थिर, और कामकाज, लेकिन खेल में देर हो चुकी है कि wheras TDD रूप में अच्छी तरह पर जल्दी मदद करने के लिए माना जाता है।
मैं सहमत हैं कि जगह में एक इकाई परीक्षण सूट होने के भूमि के ऊपर इन जल्दी बदल जाता है, जब प्रमुख वास्तु परिवर्तन हो रहा है पर महसूस किया जा सकता है, लेकिन मेरी राय इकाई परीक्षण के क्या फ़ायदे तक इस पल्ला झुकना है कि है दोष यह है। मुझे लगता है कि अक्सर समस्या एक मानसिक है - हम कोड यूनिट के दूसरे वर्ग के नागरिकों के रूप में हमारे यूनिट परीक्षणों के बारे में सोचते हैं, और हम उनके साथ गड़बड़ करने से नाराज हैं। लेकिन समय के साथ, जैसा कि मैं उन पर निर्भर करता हूं और उनकी उपयोगिता की सराहना करता हूं, मैं उनके बारे में सोचने आया हूं क्योंकि कोड आधार के किसी भी अन्य भाग के रूप में उन्हें कम महत्वपूर्ण और रखरखाव और काम करने योग्य नहीं है।
क्या प्रमुख वास्तुशिल्प "परिवर्तन" वास्तव में केवल रेफैक्टरिंग कर रहे हैं? यदि आप केवल रेफैक्टरिंग कर रहे हैं, हालांकि नाटकीय रूप से, और परीक्षण विफल होने लगते हैं, जो आपको बता सकता है कि आपने अनजाने में कहीं कार्यक्षमता बदल दी है। जो आपको पकड़ने में मदद करने के लिए यूनिट परीक्षणों की आवश्यकता होती है। यदि आप एक ही समय में कार्यक्षमता और वास्तुकला में व्यापक परिवर्तन कर रहे हैं, तो आप धीमे होने और उस लाल/हरे/रिफैक्टर नाली में शामिल होने पर विचार करना चाहेंगे: कोई नई (या बदली गई) कार्यक्षमता w/o अतिरिक्त परीक्षण नहीं, और इसमें कोई बदलाव नहीं है रिफैक्टरिंग करते समय कार्यक्षमता (और ब्रेकिंग टेस्ट)।
अद्यतन (टिप्पणी के आधार पर):
@Cybis मेरी दावा है कि रिफैक्टरिंग परीक्षण नहीं तोड़ चाहिए, क्योंकि रिफैक्टरिंग व्यवहार परिवर्तन नहीं होना चाहिए के लिए एक दिलचस्प आपत्ति उठाया गया है। उनकी आपत्ति यह है कि रीफैक्टरिंग एपीआई बदलती है, और इसलिए "ब्रेक" का परीक्षण करती है।
सबसे पहले, मैं किसी को भी रिफैक्टरिंग पर कैननिकल संदर्भ देखने के लिए प्रोत्साहित करता हूं: Martin Fowler's bliki।
- Is changing an interface refactoring? मार्टिन एक "व्यवहार के संरक्षण" परिवर्तन के रूप में पुनर्रचना के लिए संदर्भित करता है, जो का मतलब है जब इंटरफ़ेस/एपीआई तो सभी को कॉल करने में परिवर्तन: बस अब मैं इसे और नीचे दिए कुछ मुझ पर बाहर कूद की समीक्षा की कि इंटरफ़ेस/एपीआई भी बदलना चाहिए। परीक्षण सहित, मैं कहता हूं।
- इसका मतलब यह नहीं है कि व्यवहार बदल गया है। दोबारा, फाउलर ने जोर दिया कि रिफैक्टरिंग की परिभाषा यह है कि परिवर्तन व्यवहार को संरक्षित करते हैं।
इस के प्रकाश में, अगर एक परीक्षण या परीक्षण को रिफैक्टरिंग के दौरान बदलना पड़ता है, तो मुझे यह परीक्षण "ब्रेकिंग" के रूप में नहीं दिखता है। यह पूरे कोड बेस के व्यवहार को संरक्षित करने के लिए, केवल रिफैक्टरिंग का हिस्सा है।मुझे एक परीक्षण के बीच कोई अंतर नहीं दिखता है और एक रिफैक्टरिंग के हिस्से के रूप में बदलने के लिए कोड बेस के किसी अन्य भाग के बीच कोई अंतर नहीं दिखता है। (यह कोड बेस के प्रथम श्रेणी के नागरिक होने के परीक्षणों के बारे में पहले विचार करने से पहले मैंने कहा था।)
इसके अतिरिक्त, मैं परीक्षणों की अपेक्षा करता हूं, संशोधित परीक्षण भी को रिफैक्टरिंग के बाद पास करना जारी रखता है पूरा हो गया है। जो भी परीक्षण परीक्षण कर रहा था (शायद उस परीक्षण में जोर देने वाले) को रिफैक्टरिंग के बाद भी वैध होना चाहिए। अन्यथा, यह एक लाल झंडा है कि रिफैक्टरिंग के दौरान किसी भी तरह व्यवहार बदल गया/पुनर्जीवित किया गया।
शायद यह दावा बकवास की तरह लगता है लेकिन इसके बारे में सोचें: हम उत्पादन कोड आधार में कोड के ब्लॉक को स्थानांतरित करने के बारे में कुछ भी नहीं सोचते हैं और उम्मीद करते हैं कि वे अपने नए संदर्भ (नई कक्षा, नई विधि हस्ताक्षर, जो कुछ भी) में काम करना जारी रखें। । मैं एक परीक्षण के बारे में एक ही तरह महसूस करता हूं: शायद एक रिफैक्टरिंग एपीआई को बदलती है कि एक परीक्षण को कॉल करना चाहिए, या एक वर्ग जिसे एक परीक्षण का उपयोग करना चाहिए, लेकिन अंत में परीक्षण के बिंदु को रिफैक्टरिंग के कारण नहीं बदला जाना चाहिए।
(केवल एक ही अपवाद है जिसे मैं इस बारे में सोच सकता हूं वह परीक्षण है जो कम स्तर के कार्यान्वयन विवरणों का परीक्षण करता है जिन्हें आप एक रिफैक्टरिंग के दौरान बदलना चाहते हैं, जैसे एक लिखित सूची को एक ऐरेलिस्ट या किसी चीज़ के साथ बदलना। लेकिन उस स्थिति में कोई भी तर्क दें कि परीक्षण अधिक परीक्षण कर रहे हैं और बहुत कठोर और नाजुक हैं।)
मैं एक ही चीज़ के बारे में सोच रहा हूं। एक तरह से, परीक्षणों को DRY का उल्लंघन करने के लिए कहा जा सकता है, क्योंकि कोड के एक टुकड़े का व्यवहार उस कोड में और उस कोड में दोनों परिलक्षित होता है जो परीक्षण करता है। – Boris