विरासत कोड में यूनिट परीक्षणों को जोड़ना [बंद]


79

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


4
मैं "वर्किंग इफ़ेक्टली विथ लेगेसी कोड" देखूँगा। उम्मीद है कि यह मुझे इन सभी स्थिर निर्भरताओं के लिए रैपर लिखने के लिए कुछ अच्छे संकेत देगा!
BuckeyeSoftwareGuy

जवाबों:


57

सबसे अच्छा तरीका है, मैंने पाया है कि इकाई परीक्षणों को बढ़ाने के लिए, न कि केवल कूदने के लिए और हम कहेंगे कि अब इकाई आवेदन का परीक्षण करेगी।

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

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

ऐसा करने का कोई आसान तरीका नहीं है।

यह प्रश्न अधिक सुझावों के साथ मदद कर सकता है। आप एक बड़े, विरासत (C / C ++) कोडबेस में इकाई परीक्षण कैसे शुरू करते हैं?


8
वृद्धिशील परीक्षणों को जोड़ने के लिए +1।
ट्रूविल

42

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


10

हां, और यह आमतौर पर दर्दनाक है। मैंने अक्सर इसके बजाय एकीकरण परीक्षण लिखना समाप्त कर दिया है।

आर्ट ऑफ यूनिट टेस्टिंग नामक किताब ने इस पर कुछ अच्छी सलाह दी है। यह लिगेसी कोड के साथ वर्किंग इफेक्टिवली बुक की सिफारिश भी करता है ; मैंने अभी तक उत्तरार्द्ध नहीं पढ़ा है, लेकिन यह मेरे ढेर पर है।

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

संपादित करें: मैंने लिगेसी कोड के साथ वर्किंग इफेक्टिवली पढ़ा, और यह बेहतरीन है।


4
+1 के लिए "लिगेसी कोड के साथ प्रभावी ढंग से काम करना": महान सलाह से भरा; वास्तव में यह ग्रीनफ़ील्ड वातावरण के लिए भी अच्छी तरह से पढ़ने लायक है, बस परीक्षण क्षमता के लिए निर्माण कोड पर एक महान संसाधन के रूप में।
3ow पर itowlson

1
इकाई परीक्षण w / एकीकरण परीक्षणों की जगह के विचार के लिए +1। उचित मजाक के साथ, पूर्व काफी अच्छे हैं, काफी बार
डीवीके

7

विरासत कोड इकाई परीक्षण के क्षेत्र में नए दृष्टिकोण पर भी देखो - असीस परियोजना है, यह प्रेरित है द्वारा ApprovalTests परियोजना और शेयरों अपनी महत्वपूर्ण अवधारणाओं।

जैसा कि इस लेख में दृष्टिकोण दृष्टिकोण के बारे में बताया गया है :

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

असिस टूल स्वचालित रूप से वर्णक्रमीय परीक्षण बनाने और चलाने के माध्यम से विरासत कोड को बदलने के बारे में है।

अधिक जानकारी के लिए देखें


यह कैसे अधिक upvotes नहीं है? यदि रेपो यह दावा करता है कि यह क्या करता है, तो यह चयनित उत्तर होना चाहिए।
लोलोलोल ओल

क्या यह कार्यों, बीडब्ल्यूटी में दुष्प्रभावों से निपटता है? इस समस्या को हल करने के लिए भी संभव है?
लोलोलोल ओल

5

इकाई परीक्षणों का एक विकल्प, विरासत कोड के साथ प्रभावी ढंग से काम करने में भी पेश किया जाता है जो कि चरित्र परीक्षण है । मेरे पास इस तरह के परीक्षणों के साथ दिलचस्प परिणाम थे। आप इकाई परीक्षणों की तुलना में सेट-अप करना आसान कर रहे हैं क्योंकि आप परीक्षण से परीक्षण कर सकते हैं (सीम कहा जाता है)। दोष यह है कि जब कोई परीक्षण विफल होता है, तो आपको समस्या के स्थान के बारे में कम संकेत मिलता है क्योंकि परीक्षण के तहत क्षेत्र इकाई परीक्षणों की तुलना में बहुत बड़ा हो सकता है। लॉगिंग यहाँ मदद करता है।


एक यूनिट टेस्ट फ्रेमवर्क जैसे कि एक्सनिट परिवार का उपयोग लक्षण परीक्षण लिखने के लिए किया जा सकता है।

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

प्रक्रिया TDD के समान है:

  • कोड के एक हिस्से के लिए एक परीक्षण लिखें
  • इसे निष्पादित करें - विफल
  • कोड के देखे गए व्यवहार से परीक्षण को ठीक करें
  • इसे निष्पादित करें - पास करें
  • दोहराना

यदि आप कोड के बाहरी व्यवहार को संशोधित करते हैं तो परीक्षण विफल हो जाएंगे। कोड का बाहरी व्यवहार? परिचित लगता है ? हाँ यह है, यहाँ हम हैं। अब आप कोड को रिफलेक्टर कर सकते हैं।

जाहिर है कि जोखिम लक्षण वर्णन परीक्षणों की कवरेज पर निर्भर करता है।


5

फ्री, ओपन सोर्स यूनिट-टेस्टिंग यूटिलिटी लाइब्रेरी, एप्रूवलटेस्ट पर एक नजर डालें । यदि आप एक .NET डेवलपर हैं, निर्माता, Llewellyn Falco ने वीडियो की एक श्रृंखला बनाई है, जिसमें दिखाया गया है कि वह नए और विरासत कोड दोनों के लिए यूनिट परीक्षण में सुधार के लिए ApprovalTests का उपयोग कैसे करता है।


4

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

मैं आपसे झूठ नहीं बोलूंगा, विरासत कोड के लिए यूनिट परीक्षण को फिर से बनाना मुश्किल है - लेकिन यह इसके लायक है।


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

1

मैं कुछ समय पहले XPDays http://xpdays.com.ua/archive/xp-days-ukraine-2012/materials/legacy-code/ पर लिगेसी टेस्ट पिरामिड के विचार के बारे में बोल रहा हूं।

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

इसके अलावा आप लिगेसी कोड रिट्रीट http://www.jbrains.ca/legacy-code-retreat की जांच कर सकते हैं और अपने क्षेत्र में उस मीटिंग की तलाश कर सकते हैं।

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