असफल इकाई परीक्षणों में जाँच का मूल्य क्या है?


13

जबकि यूनिट परीक्षणों को क्रियान्वित करने से रोकने के तरीके हैं, असफल इकाई परीक्षणों में जाँच का क्या मूल्य है?

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

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

इकाई परीक्षणों में जाँच का मूल्य क्या है जो बग को तब तक नियंत्रित करता है जब तक कि कोई व्यक्ति कोड को ठीक करने के लिए इधर-उधर न जा सके?

क्या इस इकाई परीक्षण को अनदेखा, प्राथमिकता, श्रेणी आदि के साथ चिह्नित किया जाना चाहिए, यह निर्धारित करने के लिए कि क्या एक निष्पादित निष्पादन के आधार पर निर्माण सफल रहा था? अंततः किसी को ठीक करने के बाद कोड को निष्पादित करने के लिए इकाई परीक्षण बनाया जाना चाहिए।

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


उन परीक्षण कवरेज संख्या को बढ़ाने का यह एक तरीका है।
— जेफओ

यदि आप पहले से ही यूनिट टेस्ट लिखने के प्रयास में हैं, तो जब आप समस्या को ठीक करने का निर्णय लेंगे, तो आप इसे फिर से क्यों लिखना चाहेंगे? सिर्फ इसलिए कि इसमें जाँच की गई है, इसका मतलब यह नहीं है कि इसे सुइट में चलाया जाना है। (आप "ज्ञात मुद्दे" के लिए एक श्रेणी बना सकते हैं, और उन परीक्षणों को एक बैकलॉग / TODO सूची के रूप में मान सकते हैं।)
— कालेब

जवाबों:


17

मुझे टूटे हुए unittests पसंद नहीं है क्योंकि वे अनावश्यक शोर पैदा करते हैं। प्रत्येक अशुभ के बाद मुझे सभी विफल मुद्दों (लाल) की जांच करनी होगी। क्या यह लाल है क्योंकि एक नई समस्या है या क्योंकि एक पुराना खुला है करने के लिए / ठीक करने के लिए। 20 से अधिक unittests हैं तो यह ठीक नहीं है।

इसके बजाय मैं उपयोग करता हूं

  • [Ignore("Reason")]विशेषता जो परिणाम को पीला या बनाती है
  • throw new NotImplementedException()यह परिणाम ग्रे बनाता है

नोट: मैं .net के लिए NUnit का उपयोग कर रहा हूं। मुझे यकीन नहीं है कि "ग्रे" सुविधा अन्य unittest चौखटे में है।

इसलिए मुझे इकाई परीक्षण-परिणामों के निम्नलिखित अर्थ पसंद हैं।

  • हरा: सब खत्म हो गया
  • धूसर: नियोजित नई विशेषताएँ जिन्हें कम प्राथमिकता के साथ किया जाना चाहिए
  • पीला: कीड़े अभी तक तय नहीं। जल्द ठीक किया जाना चाहिए
  • लाल: नए कीड़े। तुरंत ठीक किया जाना चाहिए

"लाल" को छोड़कर सब कुछ में जाँच की जा सकती है।

प्रश्न का उत्तर देने के लिए: "रेड-फेल-टेस्टी" में जांच करने के लिए मूल्य से अधिक नुकसान है, लेकिन "पीले-अनदेखा-परीक्षण" या "ग्रे-नोट-इम्प्लीमेंटेड-टेस्ट्स" में जांच करना टूडू-सूची के रूप में उपयोगी हो सकता है।


मैं इस दृष्टिकोण के साथ जो समस्या देख रहा हूं, वह यह है कि नजरअंदाज किए गए परीक्षण शायद कभी तय नहीं होंगे। आप केवल पूरे परीक्षण कोड को भी निकाल सकते हैं, क्या अंतर होगा (मैं यहां थोड़ा अहंकारी हो रहा हूं)
— लोविस

4
will probably never be fixedयदि आप स्वचालित परीक्षणों में खर्च करना चाहते हैं या नहीं तो एक राजनीतिक निर्णय है। "अनदेखा परीक्षणों" के साथ आपके पास उन्हें ठीक करने का मौका है। "नजरअंदाज किए गए परीक्षणों" को फेंकने का अर्थ है "स्वचालित परीक्षणों को तब तक और तब तक छोड़ देना जब तक कोई और अधिक न हो"
— k3b

8

मैं यह ढोंग नहीं करूंगा कि यह उद्योग मानक है, लेकिन मैं टूटे हुए परीक्षणों में मुझे या मेरे अन्य परियोजना सदस्यों को याद दिलाने के तरीके के रूप में देखता हूं कि कोड या इकाई परीक्षण के साथ या तो अभी भी कोई समस्या है।

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


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

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

1
मैं सिर्फ विचार करने के लिए एक बिंदु जोड़ रहा था, कुछ निरंतर एकीकरण बिल्ड सर्वर परीक्षण चलाते हैं, और यदि वे विफल होते हैं, तो वे तैनात नहीं होते हैं। ठीक है, जैसे कि निर्माण विफल हो जाता है, कोड विफल हो जाता है, और टूटे हुए ज्ञात उत्पाद को तैनात करने का कोई मतलब नहीं है।
— कैफीक

@Chad: सही है, मैं CI सर्वर के बारे में पूरी तरह से भूल गया। यह निश्चित रूप से विचार करने के लिए एक बिंदु होगा। यह भी स्पष्ट है कि "टूटे" परीक्षणों से हमारा क्या मतलब है; क्या वे केवल "खराब" परीक्षण कर रहे हैं, या परीक्षण विफल हो रहा है क्योंकि एपीआई किसी तरह बदल गया है?
— टायसन टी।

प्रश्न स्पष्ट होना चाहिए था। यह होना चाहिए परीक्षण का संकलन होगा, लेकिन अपेक्षित परिणाम विफल हो जाएगा।

6

फेलिंग यूनिट टेस्ट विकास टीम को दृश्यता देते हैं कि विनिर्देशों पर सहमति के अनुरूप क्या करना चाहिए।

संक्षेप में, असफल इकाई परीक्षण टीम को "TODO" सूची देते हैं।

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

[* बशर्ते कि यूनिट परीक्षण वास्तव में कुछ उपयोगी का परीक्षण करें।]


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

6

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

यहां लिगेसी कोड के साथ प्रभावी ढंग से काम करने के अध्याय 13 की शुरुआत से एक पैराग्राफ है :

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


3

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

नोट: उस प्रोजेक्ट को बिल्ड सर्वर पर नहीं बनाए जाने के लिए सेट करना होगा, यदि आपका बिल्ड सर्वर चेकइन को रोकता है जो बिल्ड को तोड़ता है (यह मानते हुए कि आप एक टूटे हुए बिल्ड को परिभाषित करते हैं जिसमें सभी परीक्षण पास नहीं होते हैं)


+1 हालांकि चेकइन करने या न करने का कोई जवाब नहीं है लेकिन एक महत्वपूर्ण तर्क है: सर्वर का निर्माण करें
— k3b

मैं इस तरह के परीक्षण को अलग प्रोजेक्ट पर ले जाने के बजाय एक विशेषता का उपयोग करना चाहता हूं।
— कोडइन्चोस

2

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

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

इकाई परीक्षण की बात 100% सफलता के लिए नहीं है, बिंदु खोजने के लिए और कोड में सुधार को कीड़े है। परीक्षण नहीं कर 100% सफलता के लिए एक आसान तरीका है, लेकिन है कि परियोजना के लिए बहुत फायदेमंद नहीं है।


वाह ... "इकाई परीक्षण की बात 100% सफलता के लिए नहीं है", क्या आप कह रहे हैं कि उन्हें पास होने की आवश्यकता नहीं है?
— कैफीक

2
@Chad: मुद्दा यह है कि परीक्षण करने के लिए बेहतर है कि आप जानते हैं कि विफल हो जाएंगे, लेकिन परीक्षण नहीं होने के बजाय एक वास्तविक मुद्दे का प्रदर्शन कर रहे हैं ताकि आपके पास रात के निर्माण / परीक्षण के अंत में हरे रंग की जांच का निशान हो सके।
— अनहेल्सीप्लर

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

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

4
@unholysampler, CI या कोई CI, बिंदु यह है, जब आप परीक्षण चलाते हैं, और कुछ लाल बत्तियों को देखने के लिए उपयोग किया जाता है, तो आप इसके आदी हो जाते हैं। तो, जब कुछ ऐसा था जो हरा था, लाल हो गया ... आप कैसे जानते हैं? यह एक भयानक अभ्यास है, और कई संगठनों में स्वीकार किए जाने के कारणों में से एक परीक्षण विफल हो जाता है।
— कैफीक

1

हर विफलता के लिए एक बग दर्ज करें, और ध्यान दें कि परीक्षा परिणाम में। फिर यदि आप कभी भी अपना कार्य करते हैं और बग को ठीक करते हैं, तो आपका परीक्षण पास हो जाता है और आप उसे परीक्षा परिणाम से हटा देते हैं। कभी भी सिर्फ समस्याओं की अनदेखी न करें।


-3

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


1
यह प्रश्न का उत्तर नहीं देता है। यह नहीं पूछ रहा है कि TDD क्या है और अपेक्षित अपवादों के लिए परीक्षण क्यों।
— एंडी विसेंडांगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.