क्या आपने कभी इस तथ्य के बाद, इकाई परीक्षणों को विरासत कोड में जोड़ा है? कितना जटिल कोड था और सब कुछ ठूंठ और ठगना कितना मुश्किल था? क्या अंतिम परिणाम सार्थक था?
क्या आपने कभी इस तथ्य के बाद, इकाई परीक्षणों को विरासत कोड में जोड़ा है? कितना जटिल कोड था और सब कुछ ठूंठ और ठगना कितना मुश्किल था? क्या अंतिम परिणाम सार्थक था?
जवाबों:
सबसे अच्छा तरीका है, मैंने पाया है कि इकाई परीक्षणों को बढ़ाने के लिए, न कि केवल कूदने के लिए और हम कहेंगे कि अब इकाई आवेदन का परीक्षण करेगी।
इसलिए, यदि आप बग फिक्स या रीफैक्टरिंग के लिए कोड को छूने जा रहे हैं, तो पहले यूनिट टेस्ट लिखें। बग के लिए यूनिट परीक्षण यह साबित करने में मदद करेगा कि समस्या कहां है, क्योंकि आप इसे डुप्लिकेट कर सकते हैं।
यदि रीफैक्टरिंग, आप इकाई परीक्षण लिखना चाहेंगे, लेकिन आप पा सकते हैं कि परीक्षण लिखना असंभव है, इसलिए आपको एक उच्च स्तर खोजने की आवश्यकता हो सकती है, जो उस फ़ंक्शन को कॉल करता है जिसे रिफैक्ट किया जाएगा, और यूनिट परीक्षण उस हिस्से को। फिर, जैसा कि आप आक्रामक कार्य को प्रतिबिंबित करते हैं, अपने परीक्षण लिखें ताकि आप यह सुनिश्चित कर सकें कि यह उसी तरह से काम कर रहा है जैसा कि इसे करना चाहिए।
ऐसा करने का कोई आसान तरीका नहीं है।
यह प्रश्न अधिक सुझावों के साथ मदद कर सकता है। आप एक बड़े, विरासत (C / C ++) कोडबेस में इकाई परीक्षण कैसे शुरू करते हैं?
माइकल फेयर्स की पुस्तक "वर्किंग इफेक्टिवली विथ लेगेसी कोड" इस विषय को कवर करने वाली एक पूरी पुस्तक है। माइकल ने कहा कि विरासत कोड के लिए परीक्षण शुरू करना अक्सर मुश्किल होता है क्योंकि यह परीक्षण योग्य होने के लिए संरचित नहीं होता है। मैं किताब से बाहर निकला सबसे अधिक "स्प्राउट फ़ंक्शंस" और "स्प्राउट क्लासेस" नाम के कुछ पैटर्न थे। स्प्राउट फंक्शन वह होता है जो कोड में आपके द्वारा किए जाने वाले बदलाव को इनकैप्सुलेट करता है। आप तब इन कार्यों को इकाई परीक्षण करते हैं। अंकुरित वर्ग एक ही विचार है, नई कार्यक्षमता को छोड़कर एक वर्ग में निहित है।
हां, और यह आमतौर पर दर्दनाक है। मैंने अक्सर इसके बजाय एकीकरण परीक्षण लिखना समाप्त कर दिया है।
द आर्ट ऑफ यूनिट टेस्टिंग नामक किताब ने इस पर कुछ अच्छी सलाह दी है। यह लिगेसी कोड के साथ वर्किंग इफेक्टिवली बुक की सिफारिश भी करता है ; मैंने अभी तक उत्तरार्द्ध नहीं पढ़ा है, लेकिन यह मेरे ढेर पर है।
संपादित करें: लेकिन हाँ, यहां तक कि न्यूनतम कोड कवरेज भी सार्थक था। इसने मुझे कोड को रीफ़्लैक्ट करने के लिए आत्मविश्वास और सुरक्षा जाल दिया।
संपादित करें: मैंने लिगेसी कोड के साथ वर्किंग इफेक्टिवली पढ़ा, और यह बेहतरीन है।
विरासत कोड इकाई परीक्षण के क्षेत्र में नए दृष्टिकोण पर भी देखो - असीस परियोजना है, यह प्रेरित है द्वारा ApprovalTests परियोजना और शेयरों अपनी महत्वपूर्ण अवधारणाओं।
जैसा कि इस लेख में दृष्टिकोण दृष्टिकोण के बारे में बताया गया है :
अक्सर आपके पास एक विशाल विरासत कोड प्रोजेक्ट होता है, जहां आपके पास कोई परीक्षण नहीं होता है, लेकिन आपको एक नई सुविधा, या रिफ़ेक्टर को लागू करने के लिए कोड बदलना होगा। विरासत कोड के बारे में दिलचस्प बात है - यह काम करता है! यह वर्षों तक काम करता है, चाहे वह कैसा भी हो। और यह उस कोड का एक बहुत बड़ा लाभ है। अनुमोदन के साथ, केवल एक परीक्षण के साथ आप सभी संभावित आउटपुट (HTML, XML, JSON, SQL या जो कुछ भी आउटपुट हो सकता है) प्राप्त कर सकते हैं और अनुमोदन कर सकते हैं, क्योंकि आप जानते हैं - यह काम करता है! आपके द्वारा इस तरह के एक परीक्षण को पूरा करने और परिणाम को मंजूरी देने के बाद, आप वास्तव में एक रिफलेक्टिंग के साथ अधिक सुरक्षित हैं, क्योंकि अब आप सभी मौजूदा व्यवहार को "बंद" कर देते हैं।
असिस टूल स्वचालित रूप से वर्णक्रमीय परीक्षण बनाने और चलाने के माध्यम से विरासत कोड को बदलने के बारे में है।
अधिक जानकारी के लिए देखें
इकाई परीक्षणों का एक विकल्प, विरासत कोड के साथ प्रभावी ढंग से काम करने में भी पेश किया जाता है जो कि चरित्र परीक्षण है । मेरे पास इस तरह के परीक्षणों के साथ दिलचस्प परिणाम थे। आप इकाई परीक्षणों की तुलना में सेट-अप करना आसान कर रहे हैं क्योंकि आप परीक्षण से परीक्षण कर सकते हैं (सीम कहा जाता है)। दोष यह है कि जब कोई परीक्षण विफल होता है, तो आपको समस्या के स्थान के बारे में कम संकेत मिलता है क्योंकि परीक्षण के तहत क्षेत्र इकाई परीक्षणों की तुलना में बहुत बड़ा हो सकता है। लॉगिंग यहाँ मदद करता है।
एक यूनिट टेस्ट फ्रेमवर्क जैसे कि एक्सनिट परिवार का उपयोग लक्षण परीक्षण लिखने के लिए किया जा सकता है।
तथ्यों के बाद लिखे गए ऐसे परीक्षणों में, अभिकथन कोड के वर्तमान व्यवहार को सत्यापित करते हैं। यूनिट परीक्षणों के विपरीत, वे यह साबित नहीं करते हैं कि कोड सही है, वे कोड के वर्तमान व्यवहार को कम कर रहे हैं।
प्रक्रिया TDD के समान है:
यदि आप कोड के बाहरी व्यवहार को संशोधित करते हैं तो परीक्षण विफल हो जाएंगे। कोड का बाहरी व्यवहार? परिचित लगता है ? हाँ यह है, यहाँ हम हैं। अब आप कोड को रिफलेक्टर कर सकते हैं।
जाहिर है कि जोखिम लक्षण वर्णन परीक्षणों की कवरेज पर निर्भर करता है।
फ्री, ओपन सोर्स यूनिट-टेस्टिंग यूटिलिटी लाइब्रेरी, एप्रूवलटेस्ट पर एक नजर डालें । यदि आप एक .NET डेवलपर हैं, निर्माता, Llewellyn Falco ने वीडियो की एक श्रृंखला बनाई है, जिसमें दिखाया गया है कि वह नए और विरासत कोड दोनों के लिए यूनिट परीक्षण में सुधार के लिए ApprovalTests का उपयोग कैसे करता है।
यदि आप विरासत कोड को फिर से तैयार करने की योजना बना रहे हैं तो उन यूनिट परीक्षणों का निर्माण करना आवश्यक है। मॉकिंग या स्टबिंग के बारे में चिंता न करें - सिस्टम के इनपुट और आउटपुट के परीक्षण के बारे में चिंता करें, ताकि आपके परिवर्तन या रीफैक्टरिंग प्रयास वर्तमान कार्यक्षमता को न तोड़ें।
मैं आपसे झूठ नहीं बोलूंगा, विरासत कोड के लिए यूनिट परीक्षण को फिर से बनाना मुश्किल है - लेकिन यह इसके लायक है।
मैं कुछ समय पहले XPDays http://xpdays.com.ua/archive/xp-days-ukraine-2012/materials/legacy-code/ पर लिगेसी टेस्ट पिरामिड के विचार के बारे में बोल रहा हूं।
इस प्रस्तुति को इस सवाल का जवाब देना चाहिए कि विरासत कोड के साथ काम करते समय एकीकरण / कार्यात्मक या उच्च स्तरीय स्वीकृति परीक्षणों के साथ शुरू करना कभी-कभी इतना महत्वपूर्ण क्यों होता है। और फिर धीरे-धीरे, कदम से कदम इकाई परीक्षण शुरू करते हैं। कोई कोड उदाहरण नहीं हैं - क्षमा करें, लेकिन आप माइकल्स पंख की किताब "लिगेसी कोड के साथ प्रभावी रूप से कार्य करना" में उनमें से गुच्छा पा सकते हैं।
इसके अलावा आप लिगेसी कोड रिट्रीट http://www.jbrains.ca/legacy-code-retreat की जांच कर सकते हैं और अपने क्षेत्र में उस मीटिंग की तलाश कर सकते हैं।