क्या कोड के लिए यूनिट परीक्षणों को लिखने में कोई मूल्य है जो पहले से ही अनुप्रयोगों के वारिस होने पर काम करता है?


27

जाहिर है कि कुछ पुराने एप्लिकेशन यूनिट टेस्ट के लिए बहुत मुश्किल नहीं हो सकते हैं, क्योंकि जिस तरह से यह पहली जगह में लिखा गया था।

लेकिन स्थानों में, कुछ सहायक विधियों की तरह, जो शायद इकाई परीक्षण हो सकते हैं, क्या मुझे उनके लिए इकाई परीक्षण लिखने से परेशान होना चाहिए?

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

क्या ऐसा करने में कोई मूल्य है?

इस बात को भी ध्यान में रखें कि विधि की परिभाषा अस्पष्ट हो सकती है, और मुझे यह शोध करने की आवश्यकता हो सकती है कि दी गई स्थितियों में वास्तव में कुछ तरीकों का क्या करना चाहिए।


4
अपने आप को एक एहसान करो और विरासत कोड के साथ प्रभावी ढंग से कार्य करना पढ़ें । अगर एक पूरी किताब इस और अन्य संबंधित सवालों के जवाब देने के लिए समर्पित है।
रीन हेनरिच्स

जवाबों:


15

मुझे लगता है कि आपको आवेदन के लिए संभव के रूप में कई परीक्षणों को लिखना चाहिए। वे आपको कोडबेस सीखने में मदद करेंगे और आपको अंतिम रूप देने या नए विकास के लिए तैयार करेंगे।

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

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

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

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

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


13

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


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

8
 > Is there any value in writing unit tests for code that 
 > already works when inheriting applications?

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

हाँ, आप उन कार्यों के लिए आवेदन के लिए एकीकरण परीक्षण लिख सकते हैं जहाँ आप परिवर्तन करने की योजना बनाते हैं। इस तरह से आप कर सकते हैं प्रतिगमन परीक्षण करता है, तो अपने परिवर्तनों को कुछ विभाजन देखने के लिए।

गुणवत्ता और डेवलपर के दृष्टिकोण से हाँ यह परीक्षण के लिए मूल्यवान है।

व्यावसायिक दृष्टिकोण से नहीं क्योंकि ग्राहक को बेचने के लिए बहुत कठिन है कि आपको कोई वास्तविक व्यापार मूल्य प्राप्त करने के लिए समय / धन की आवश्यकता नहीं है लेकिन अस्पष्ट वादा करता है कि व्यवसाय-परिवर्तन चीजों को बदतर नहीं करेगा।


इस मामले के लिए इकाई परीक्षण के बजाय एकीकरण परीक्षणों के लिए +1। बहुत व्यावहारिक सलाह
gbjbaanb

5

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

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


सच्चाई का मंचन करने के लिए क्यों?
वेन मोलिना

4

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

यह लक्षण वर्णन कार्यक्षमता के आधार रेखा के रूप में कार्य करता है। यहां तक ​​कि अगर व्यवहार एक व्यावसायिक दृष्टिकोण से गलत है, तो आप व्यवहार को अपमानजनक रूप से आगे बढ़ाते हैं। एक विरासत परियोजना में कर्षण प्राप्त करना मुश्किल हो सकता है, और यह आपको एक आधार रेखा देता है ताकि आप चीजों को खराब किए बिना आगे बढ़ सकें।

तो, आप कर सकते हैं सभी यूनिट परीक्षण लिखें। जिस कोड का परीक्षण नहीं किया जा सकता है, उसके कोड को कोड में "सीम" लगाकर अलग-अलग निर्भरता के लिए अपने कोड को रीफ़्रैक्टर करें - उन स्थानों पर जहां आप उस कोड को अलग कर सकते हैं जिसे आप उस कोड से परीक्षण करना चाहते हैं जिसे आप परीक्षण नहीं करना चाहते हैं।

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


2

मैंने खुद इस बारे में विचार किया है, क्योंकि हमारे सिस्टम में बहुत सी अनजाने सीमेन्टली बुरी तरह से लिखी गई हैं, लेकिन काम करने वाली विरासत कोड है।

आप एक अच्छा बिंदु बनाते हैं:

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

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

जब भी मेरे पास समय होता है

आपके पास समय है जब वह प्राथमिकता प्राप्त करता है, ठीक है ?, तो यह वैसे भी कभी नहीं होगा। :)


1

क्या आप उस कोडबेस के पहलुओं का लाभ उठाने की कोशिश कर रहे हैं जो पहले एक उत्पादन अनुप्रयोग में उपयोग नहीं किया गया है? पहले उन परिदृश्यों के लिए इकाई परीक्षण लिखें। आपको यहां अपने काम को प्राथमिकता देने में सक्षम होने की आवश्यकता है, और मुझे लगता है कि द आर्ट ऑफ़ यूनिट टेस्टिंग को उस संबंध में कुछ सलाह दी गई थी (विशेष रूप से परीक्षण विरासत कोडबेस से संपर्क करने के लिए)।


1

यह मत मानो कि सब कुछ सिर्फ इसलिए काम कर रहा है क्योंकि एप्लिकेशन चल रहा है और चल रहा है ... आमतौर पर, "समय का परीक्षण" केवल यह दर्शाता है कि ए) आपको अभी तक बाकी दोष नहीं मिला है या बी) जो लोग मिल गए हैं उनकी रिपोर्ट नहीं की है। (या शायद दोनों।) और यहां तक ​​कि कोड जो संभवतः वर्तमान में काम कर रहा है, हो सकता है कि अगली बार आपको बदलाव करने के लिए काम न करना पड़े।

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

जब आप कोड बदलते हैं, तो आपको निश्चित रूप से परीक्षण लिखना चाहिए, चाहे वह फिक्सिंग हो या फिर रिफलेक्टरिंग। हो सकता है कि आप परीक्षण लिखने के लिए अच्छी तरह से कर सकते हैं, अगर किसी अन्य कारण से कुछ समय बचाने के लिए नहीं तो अगली बार आपको एक दोष को ठीक करना होगा (और अगली बार होगा) ... हालांकि इस मामले में, आप करेंगे उस समय को उन लोगों की अपेक्षाओं के विरुद्ध संतुलित करना होगा जो उस सॉफ़्टवेयर का दिखावा करते हैं जो हमेशा दोष-मुक्त होता है और इस तरह भविष्य के रखरखाव की ओर बिताया गया समय "बर्बाद" होता है। (इसका मतलब यह नहीं है कि आपको वर्तमान शेड्यूल को अनदेखा करना चाहिए, हालांकि।) कुछ बिंदु पर, यदि आप ऐसा करते हैं, तो आपके पास पर्याप्त कवरेज होगा जिसे आप विरासत अनुप्रयोगों पर परीक्षण के मूल्य को प्रदर्शित करना शुरू कर सकते हैं, और इससे आपको खर्च करने में मदद मिल सकती है। भविष्य के ऐप्स पर वह समय, जो अंततः उत्पादक विकास पर खर्च करने के लिए समय खाली करना चाहिए।


0

अपने लाला-भूमि के दिल से, मैं हाँ और न केवल यही कहूंगा, बल्कि इसे हैक कर लें, इसे रिफैक्ट करें और परीक्षण रखें, लेकिन सुनिश्चित करें कि आप अन्य महत्वपूर्ण परियोजनाओं में पीछे नहीं रहें। एक कामकाजी प्रोग्रामर के रूप में, यदि आपकी नौकरी खतरे में है या यदि किसी प्रबंधक ने आपको स्वामित्व लेने के लिए कहा है, तो हाँ। यदि टीम या कंपनी को नुकसान हो सकता है, तो अपने प्रबंधक से बातचीत करके उसे बताएं कि कंपनी को आपदा से बचाने के लिए परीक्षण करना आवश्यक है। अगर वह कहता है कि चिंता मत करो, तो आप हुक से बाहर हैं (जरूरी नहीं, दोष प्रतिनिधि प्रबंधन कौशल है, इसलिए सुनिश्चित करें कि आप हुक से बाहर हैं ... वास्तव में!)

सौभाग्य!

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