यूनिट परीक्षणों को खराब क्यों देखा जाता है?


93

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

व्यक्तिगत रूप से, मुझे लगता है कि यह नहीं है कि यह निम्नलिखित कारणों से कैसा होना चाहिए:

  1. यह इस विचार को बढ़ावा देता है कि कोड सही होना चाहिए और कोई बग मौजूद नहीं होना चाहिए - जो कि वास्तविक दुनिया में किसी भी आकार के कार्यक्रम के लिए निश्चित रूप से असंभव है।

  2. यह यूनिट परीक्षणों को सोचने का एक विघटनकारी है जो विफल हो जाएगा। या निश्चित रूप से इकाई परीक्षण के साथ आते हैं जो ठीक करने के लिए मुश्किल होगा।

  3. यदि किसी समय सभी इकाई परीक्षण पास हो जाते हैं, तो उस समय किसी भी समय सॉफ्टवेयर की स्थिति का कोई बड़ा चित्र नहीं होता है। कोई रोडमैप / लक्ष्य नहीं है।

  4. यह क्रियान्वयन से पहले इकाई परीक्षणों को आगे-पीछे करना बंद कर देता है।

मैं यह भी सुझाव दूंगा कि असफल इकाई परीक्षणों के साथ सॉफ्टवेयर जारी करना भी बुरा नहीं है। कम से कम तब आप जानते हैं कि सॉफ़्टवेयर के कुछ पहलू की सीमाएँ हैं।

क्या मुझसे कोई चूक हो रही है? संगठन सभी यूनिट परीक्षणों को पारित करने की अपेक्षा क्यों करते हैं? क्या यह सपनों की दुनिया में नहीं रह रहा है? और क्या यह वास्तव में कोड की वास्तविक समझ नहीं है?


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
maple_shaft

जवाबों:


270

इस प्रश्न में IMHO की कई गलत धारणाएँ हैं, लेकिन मुख्य मैं इस पर ध्यान केंद्रित करना चाहूंगा कि यह स्थानीय विकास शाखाओं, ट्रंक, स्टेजिंग या रिलीज़ शाखाओं के बीच अंतर नहीं करता है।

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

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

मैं यह भी सुझाव दूंगा कि असफल इकाई परीक्षणों के साथ सॉफ्टवेयर जारी करना भी बुरा नहीं है।

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

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


18
मुझे लगता है कि यह असली जवाब है। ओपी "रिलीज प्रक्रिया" और "कुछ स्क्रीन [परीक्षण के परिणाम दिखा रहा है") का उल्लेख करता है, जो एक बिल्ड सर्वर की तरह लगता है। रिलीज विकास के समान नहीं है (उत्पादन में विकास नहीं है!); देव में परीक्षण विफल होना ठीक है, वे TODO की तरह हैं; बिल्ड सर्वर पर धकेलने पर वे सभी हरे (संपन्न) होने चाहिए।
वारबो

7
सबसे ज्यादा वोट देने वाले से बेहतर जवाब। यह कुछ आदर्श दुनिया की स्थिति के बारे में उन्हें व्याख्यान के बिना कहां से आ रहा है की एक समझ से पता चलता है, ज्ञात कीड़े की संभावना को स्वीकार करता है (जिसके लिए कुछ दुर्लभ कोने के मामले को ठीक करने के लिए पूरे रोडमैप को नहीं छोड़ा गया है) और बताते हैं कि यूनिट परीक्षण केवल निश्चित रूप से होने चाहिए एक रिलीज शाखा / प्रक्रिया में हरा हो।
सेबेस्टियन वैन डेन ब्रोक

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

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

1
+1, हालाँकि मैं इस वाक्य में एक मामूली जोड़ (बोल्ड) का सुझाव देता हूं: "यह बोझिल हो जाता है, त्रुटि-प्रवण, स्थितियों में लोग शोर के रूप में परीक्षण सूट में विफलताओं को अनदेखा करते हैं , और यूनिट परीक्षणों के स्वचालन पहलू के एक बड़े हिस्से का खुलासा करते हैं। ।
mtraceur

228

... हरे रंग में गुजरने वाली सभी इकाई परीक्षण - जो अच्छा माना जाता है।

यह है अच्छा। इसके बारे में कोई "माना नहीं" जाता है।

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

नहीं। यह साबित करता है कि आपने इस बिंदु तक कोड का परीक्षण कर लिया है। यह पूरी तरह से संभव है कि आपके परीक्षण हर मामले को कवर न करें। यदि ऐसा है, तो कोई भी त्रुटि अंततः बग रिपोर्ट में बदल जाएगी और आप समस्याओं को पुन: पेश करने के लिए [असफल] परीक्षण लिखेंगे और फिर आवेदन को ठीक करेंगे ताकि परीक्षण पास हो जाएं।

यह यूनिट परीक्षणों को सोचने का एक विघटनकारी है जो विफल हो जाएगा।

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

डेवलपर और परीक्षक की मानसिकता की तुलना करने के लिए:

  • जैसे ही कोड ऐसा करता है वैसे ही एक डेवलपर रुक जाता है।
  • एक परीक्षक बंद हो जाता है जब वे अब कोड ब्रेक नहीं बना सकते हैं।

ये मौलिक रूप से अलग-अलग दृष्टिकोण हैं और एक है जो कई डेवलपर्स के लिए सामंजस्य करना मुश्किल है।

या निश्चित रूप से इकाई परीक्षण के साथ आते हैं जो ठीक करने के लिए मुश्किल होगा।

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

  • डिबगिंग "साबित" करता है कि कोड वही करता है जो आप उसे आज चाहते हैं
  • परीक्षण "साबित" करते हैं कि कोड अभी भी वही करता है जो आप इसे समय के साथ चाहते हैं ।

यदि किसी समय सभी इकाई परीक्षण पास हो जाते हैं, तो उस समय किसी भी समय सॉफ्टवेयर की स्थिति का कोई बड़ा चित्र नहीं होता है। कोई रोडमैप / लक्ष्य नहीं है।

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

यह क्रियान्वयन से पहले इकाई परीक्षणों को आगे-पीछे करना बंद कर देता है।

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

मैं यह भी सुझाव दूंगा कि असफल इकाई परीक्षणों के साथ सॉफ्टवेयर जारी करना भी बुरा नहीं है। कम से कम तब आप जानते हैं कि सॉफ़्टवेयर के कुछ पहलू की सीमाएँ हैं।

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

क्या यह सपनों की दुनिया में नहीं रह रहा है?

कुछ भी हैं, तो यह में रहने वाले है असली दुनिया , स्वीकार करते हैं कि डेवलपर्स, न तो सर्वज्ञ है और न ही infallable हैं हम चाहते हैं कि ऐसा गलती करते हैं और है कि हम एक की जरूरत है सुरक्षा तंत्र हमें पकड़ने के लिए अगर और हम जब ऐसा गंदगी!
टेस्ट दर्ज करें।

और क्या यह वास्तव में कोड की वास्तविक समझ नहीं है?

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


7
@ टिबोस: एक परीक्षण को अक्षम करना एक फ़ंक्शन को टिप्पणी करने जैसा है। आपके पास संस्करण नियंत्रण है। इसका इस्तेमाल करें।
केविन

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

4
@ डॉर्किंग: मेरा मतलब है कि कोड को कमेंट न करें, इसे हटाएं। यदि आप बाद में निर्णय लेते हैं कि आपको इसकी आवश्यकता है, तो इसे संस्करण नियंत्रण से पुनर्स्थापित करें। एक अक्षम परीक्षण करना अलग नहीं है।
केविन

4
"यह पूरी तरह से संभव है कि आपके परीक्षण हर मामले को कवर न करें।" मैं इतना कहना चाहूंगा कि परीक्षण के हर गैर-तुच्छ टुकड़े के लिए, आप निश्चित रूप से हर मामले को कवर नहीं करते हैं
corsiKa

6
@ टिबोस ऑफ यूनिट टेस्टिंग का कहना है कि फेल टेस्ट लिखने से लेकर उसके लिए कोड लिखने तक का चक्र समय छोटा होना चाहिए (जैसे 20 मिनट। कुछ का दावा 30 सेकंड)। यदि आपके पास तुरंत कोड लिखने का समय नहीं है, तो यह संभवतः बहुत जटिल है। यदि यह जटिल नहीं है, तो परीक्षण को हटा दें क्योंकि इसे फिर से लिखा जा सकता है यदि गिरा हुआ फीचर फिर से जुड़ जाता है। इस पर टिप्पणी क्यों नहीं की? आपको पता नहीं है कि इस सुविधा को फिर से जोड़ा जाएगा, इसलिए टिप्पणी का परीक्षण (या कोड) केवल शोर है।
सीजे डेनिस

32

यूनिट परीक्षणों को खराब क्यों देखा जाता है?

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

आप जो याद कर रहे हैं वह संदर्भ है ; यूनिट परीक्षणों को विफल होने की अनुमति कहाँ है?

सामान्य उत्तर यह है कि यूनिट परीक्षणों को केवल निजी सैंडबॉक्स में विफल होने की अनुमति है।

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

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

इसी तरह, एक नया डेवलपर बोर्डिंग के दौरान अधिक तेज़ी से उत्पादक बन सकता है, क्योंकि उन्हें यह पता लगाने में समय बिताने की ज़रूरत नहीं है कि कौन से परीक्षण विफल हो रहे हैं "स्वीकार्य"।

अधिक सटीक होना: अनुशासन यह है कि निर्माण के दौरान चलने वाले परीक्षण पास होने चाहिए।

वहाँ है, के रूप में सबसे अच्छा मैं बता सकता हूँ, असफल परीक्षणों के साथ कुछ भी गलत नहीं है जो अक्षम हैं

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

उन्हीं तकनीकों का उपयोग असफल परीक्षणों को भी अक्षम करने के लिए किया जा सकता है।

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

संक्षेप में: रनिंग सूट में विफल परीक्षणों के एक समूह को छोड़ने की तुलना में ट्रैकिंग कार्य के लिए अन्य तकनीकें हैं ।


मैंने कहा है | "नहीं है ... कुछ भी नहीं होने के साथ गलत नाकाम रहने के परीक्षण है कि कर रहे हैं विकलांग "।
सीजे डेनिस

यह परिवर्तन निश्चित रूप से अर्थ को स्पष्ट करता है। धन्यवाद।
VoiceOfUnreason

26

कई शानदार उत्तर हैं, लेकिन मैं एक और कोण जोड़ना चाहूंगा कि मेरा मानना ​​है कि अभी तक अच्छी तरह से कवर नहीं किया गया है: वास्तव में परीक्षण होने की बात है।

इकाई परीक्षण यह जाँचने के लिए नहीं हैं कि आपका कोड बग मुक्त है।

मुझे लगता है कि यह मुख्य गलत धारणा है। यदि यह उनकी भूमिका थी, तो आपको वास्तव में सभी स्थानों पर परीक्षण विफल होने की उम्मीद होगी। लेकिन बदले,

यूनिट परीक्षण यह जाँचता है कि आपका कोड वह करता है जो आपको लगता है कि वह करता है।

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

अब, उपरोक्त सभी कार्य केवल तभी होते हैं जब सभी परीक्षण हरे होते हैं, एक मजबूत सकारात्मक परिणाम देते हैं: यह ठीक यही है कि कोड कैसे काम करता है। लाल परीक्षणों के पास वह संपत्ति नहीं है। "यह वही है जो यह कोड नहीं करता है" शायद ही कभी एक उपयोगी जानकारी है।

स्वीकृति परीक्षण हो सकता है कि आप क्या देख रहे हैं।

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


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

24

मैं इसे टूटी हुई खिड़की सिंड्रोम के सॉफ्टवेयर के रूप में देखता हूं ।

कार्य परीक्षण मुझे बताते हैं कि कोड एक गुणवत्ता का है और कोड के मालिक इसके बारे में परवाह करते हैं।

जब आपको गुणवत्ता के बारे में परवाह करनी चाहिए, तो यह निर्भर करता है कि आप किस स्रोत कोड शाखा / भंडार पर काम कर रहे हैं। देव कोड बहुत अच्छी तरह से टूटे हुए परीक्षणों को प्रगति में काम का संकेत दे सकता है (उम्मीद है!)।

एक लाइव सिस्टम के लिए एक शाखा / रिपॉजिटरी पर टूटे हुए परीक्षणों को तुरंत खतरे की घंटी बजाना चाहिए। यदि टूटे हुए परीक्षणों को विफल करने की अनुमति दी जाती है या यदि उन्हें स्थायी रूप से "अनदेखा" के रूप में चिह्नित किया जाता है - तो समय के साथ उनकी संख्या बढ़ने की उम्मीद करें। यदि इनकी नियमित रूप से समीक्षा नहीं की जाती है तो मिसाल कायम की जाएगी कि टूटे हुए परीक्षणों को छोड़ दिया जाना ठीक है।

टूटी हुई परीक्षाओं को बहुत से दुकानों में इतने गौर से देखा जाता है कि उन पर प्रतिबंध हो सकता है कि क्या टूटे हुए कोड को भी प्रतिबद्ध किया जा सकता है


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

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

यह उत्तर मेरे बहुत आत्म अनुभव से महान है। एक बार कुछ लोगों को असफल परीक्षणों के एक समूह को अनदेखा करने, या कुछ बिंदुओं में सर्वोत्तम प्रथाओं को तोड़ने के लिए उपयोग किया जाता है, तो कुछ महीने बीतने दें और आपको अनदेखा परीक्षणों का% नाटकीय रूप से बढ़ जाएगा, कोड की गुणवत्ता "हैक-स्क्रिप्ट" स्तर तक गिर जाएगी । और इस प्रक्रिया को हर किसी को याद करना बहुत कठिन होगा।
usr-local-

11

यहाँ अंतर्निहित तार्किक गिरावट है:

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

इकाई परीक्षण के साथ, यह है अच्छा है जब सभी परीक्षण पास। यह एक परीक्षण विफल होने पर भी अच्छा है। दोनों के विरोध में नहीं है।

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


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

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

9

फिल डब्ल्यू का जवाब बहुत अच्छा है। मैं इसे प्रतिस्थापित नहीं कर सकता।

हालाँकि, मैं एक और हिस्से पर ध्यान केंद्रित करना चाहता हूं जो भ्रम का हिस्सा हो सकता है।

कुछ संगठनों में, जाहिरा तौर पर, सॉफ़्टवेयर रिलीज़ प्रक्रिया का हिस्सा इकाई परीक्षण का उपयोग करना है, लेकिन किसी भी समय सभी इकाई परीक्षणों को पास करना होगा

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

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


यह टीम के नियमों के अनुसार टकराव पैदा कर सकता है। मैं वास्तव में कुछ हफ्ते पहले इसका सामना किया था:

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

या तो नियम ठीक होगा। लेकिन दोनों नियम एक साथ काम नहीं कर सकते। यदि मुझे एक बड़ा बदलाव सौंपा गया है, जिसे पूरा होने में कई दिन लगेंगे, तो मैं एक ही समय में दोनों नियमों का पालन नहीं कर पाऊंगा। जब तक मैं हर दिन अपने बदलावों पर टिप्पणी नहीं करूंगा और केवल सब कुछ हो जाने के बाद उन्हें अनियंत्रित कर दूंगा; जो सिर्फ बकवास काम है।

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


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

1
अधूरे बदलावों को धकेलना बेतुका है, मैं ऐसा करने का कोई औचित्य नहीं देख सकता। परिवर्तन पूरा होने पर कोड समीक्षा क्यों नहीं?
कैलम ब्रैडबरी

ठीक है, एक के लिए, यह सुनिश्चित करने का एक त्वरित तरीका है कि कोड न केवल देव के लैपटॉप / वर्कस्टेशन पर है, अगर उनकी हार्ड डिस्क काम करना बंद कर दे या अन्यथा खो जाए - अगर काम करने के बीच में भी कमिट करने की नीति है, तो जोखिम में सीमित मात्रा में काम होता है।
ग्वेन इवांस

1
फीचर झंडे स्पष्ट विरोधाभास को ठीक करते हैं।
रबरडक

1
@ फैटर हां, मौजूदा लॉजिक के लिए भी।
रबरडक

6

यदि आप सभी यूनिट परीक्षणों को ठीक नहीं करते हैं, तो आप तेजी से उस स्थिति में पहुंच सकते हैं जहां कोई भी टूटे हुए परीक्षणों को ठीक नहीं करता है।

  1. गलत है क्योंकि यूनिट टेस्ट पास करना सही नहीं है

  2. यह कोड के साथ आने के लिए एक कीटाणुनाशक है जिसे परीक्षण करना भी मुश्किल होगा, जो डिजाइन के दृष्टिकोण से अच्छा है

  3. कोड कवरेज वहाँ मदद कर सकता है (हालांकि यह एक रामबाण नहीं है)। इसके अलावा इकाई परीक्षण परीक्षण का सिर्फ एक पहलू है - आप एकीकरण / स्वीकृति परीक्षण भी चाहते हैं।


6

पहले से ही अच्छे उत्तरों में कुछ अंक जोड़ने के लिए ...

लेकिन किसी भी समय सभी इकाई परीक्षणों को पारित करना होगा

यह एक रिलीज प्रक्रिया की समझ की कमी को दर्शाता है। एक परीक्षण विफलता TDD के तहत एक नियोजित सुविधा का संकेत दे सकती है जो अभी तक लागू नहीं हुई है; या यह एक ज्ञात मुद्दे को इंगित कर सकता है, जिसमें भविष्य की रिलीज़ के लिए नियत योजना है; या यह कुछ ऐसा हो सकता है जहां प्रबंधन ने निर्णय लिया है कि यह ठीक करने के लिए पर्याप्त महत्वपूर्ण नहीं है क्योंकि ग्राहकों को नोटिस करने की संभावना नहीं है। इन सभी शेयरों में महत्वपूर्ण बात यह है कि प्रबंधन ने विफलता के बारे में निर्णय लिया है।

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

अन्य उत्तरों में परीक्षण की सीमाएँ शामिल हैं।

मुझे समझ में नहीं आता कि आपको क्यों लगता है कि बग को खत्म करना एक नकारात्मक पहलू है। यदि आप उस कोड को वितरित नहीं करना चाहते हैं जिसे आपने चेक किया है (अपनी क्षमता के अनुसार) वह करता है जो कि माना जाता है, तो आप सॉफ्टवेयर में भी काम क्यों कर रहे हैं?

यदि किसी समय सभी इकाई परीक्षण पास हो जाते हैं, तो उस समय किसी भी समय सॉफ्टवेयर की स्थिति का कोई बड़ा चित्र नहीं होता है। कोई रोडमैप / लक्ष्य नहीं है।

रोडमैप क्यों होना चाहिए?

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

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


6

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

सच नहीं। आपको क्यों लगता है कि यह असंभव है? कार्यक्रम के लिए यहाँ उदाहरण है कि यह काम करता है:

public class MyProgram {
  public boolean alwaysTrue() {
    return true;
  }

  @Test
  public void testAlwaysTrue() {
    assert(alwaysTrue() == true);
  }
}

यह यूनिट परीक्षणों को सोचने का एक विघटनकारी है जो विफल हो जाएगा। या निश्चित रूप से इकाई परीक्षण के साथ आते हैं जो ठीक करने के लिए मुश्किल होगा।

उस मामले में यह इकाई परीक्षण नहीं हो सकता है, लेकिन अगर यह जटिल है तो एकीकरण परीक्षण

यदि किसी समय सभी इकाई परीक्षण पास हो जाते हैं, तो उस समय किसी भी समय सॉफ्टवेयर की स्थिति का कोई बड़ा चित्र नहीं होता है। कोई रोडमैप / लक्ष्य नहीं है।

सच है, इसे एक कारण के लिए इकाई परीक्षण कहा जाता है , यह कोड की एक छोटी इकाई की जांच करता है।

यह क्रियान्वयन से पहले इकाई परीक्षणों को आगे-पीछे करना बंद कर देता है।

डेवलपर्स मर्जीअगर वे इसके लाभों को नहीं समझते हैं तो किसी भी परीक्षण को लिखने वाले को रोकेंउनके स्वभाव से (जब तक वे क्यूए से नहीं आए)


"डेवलपर्स अपनी प्रकृति द्वारा किसी भी परीक्षण को लिखने वाले [sic] को रोकेंगे" - यह पूरी तरह से बकवास है। मैं डेवलपर्स की एक पूरी कंपनी में काम करता हूं जो टीडीडी और बीडीडी का अभ्यास करता है।
रबरडक

@ रुबरडक मैंने सवाल में एक "तथ्य" का जवाब देने की कोशिश की और मैं अतिरंजित था। मैं अपडेट
करूंगा

"X को Y करने से रोका जाएगा यदि वे Y के लाभों को नहीं समझते हैं" किसी भी X और Y के बारे में लागू होता है, तो यह कथन संभवतः विशेष रूप से उपयोगी नहीं है। यह शायद परीक्षण लिखने के लाभों की व्याख्या करने के लिए और अधिक विशेष रूप से ऐसा करने के लिए अधिक समझ में आता है।
18'18

2
"किसी भी आकार के एक कार्यक्रम के लिए असंभव" का अर्थ "सभी कार्यक्रम, कोई फर्क नहीं पड़ता कि किस आकार का है", इसका मतलब है "किसी भी महत्वपूर्ण कार्यक्रम (एक गैर-तुच्छ लंबाई)" आपका प्रयास काउंटर-उदाहरण अनुचित है, क्योंकि यह isn ' t एक महत्वपूर्ण और उपयोगी कार्यक्रम।
बेन वोयगेट

@BenVoigt मुझे नहीं लगता कि मुझे एक जवाब के रूप में "महत्वपूर्ण कार्यक्रम" देने की उम्मीद है।
user7294900

4

यह इस विचार को बढ़ावा देता है कि कोड सही होना चाहिए और कोई बग मौजूद नहीं होना चाहिए

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

यह यूनिट परीक्षणों को सोचने का एक विघटनकारी है जो विफल हो जाएगा। या निश्चित रूप से इकाई परीक्षण के साथ आते हैं जो ठीक करने के लिए मुश्किल होगा।

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

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

यदि किसी समय सभी इकाई परीक्षण पास हो जाते हैं, तो उस समय किसी भी समय सॉफ्टवेयर की स्थिति का कोई बड़ा चित्र नहीं होता है। कोई रोडमैप / लक्ष्य नहीं है।

टेस्ट एक तरह का सूक्ष्म लक्ष्य है। परीक्षण-संचालित विकास में, प्रोग्रामर पहले एक परीक्षण (एकवचन) लिखेगा, और फिर कुछ कोड को लागू करने के लिए एक स्पष्ट लक्ष्य होगा; फिर अगले परीक्षण, और इतने पर।

कोड लिखे जाने से पहले परीक्षणों का कार्य पूर्णता में नहीं होना है।

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

यह क्रियान्वयन से पहले इकाई परीक्षणों को आगे-पीछे करना बंद कर देता है।

मैं यह नहीं देखता कि यह कथन कैसे सत्य होगा। लेखन परीक्षण आदर्श रूप से कार्यान्वयन का एक हिस्सा होना चाहिए ।

क्या मुझसे कोई चूक हो रही है? संगठन सभी यूनिट परीक्षणों को पारित करने की अपेक्षा क्यों करते हैं?

क्योंकि संगठनों को उम्मीद है कि परीक्षणों में कोड की प्रासंगिकता होगी। परीक्षण लेखन जो सफल होता है, इसका मतलब है कि आपने अपने आवेदन के कुछ हिस्से का दस्तावेजीकरण किया है, और यह साबित किया है कि आवेदन वही करता है जो वह (परीक्षण) कहता है। न कम न ज़्यादा।

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

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

क्या यह सपनों की दुनिया में नहीं रह रहा है?

नहीं। परीक्षण-संचालित एप्लिकेशन के साथ काम करना शुद्ध आनंद है - जब तक कि आप सिर्फ उस अवधारणा को पसंद नहीं करते हैं जो किसी भी कारण ("अधिक प्रयास" आदि) के बारे में है जिसे हम किसी अन्य प्रश्न में चर्चा कर सकते हैं।

और क्या यह वास्तव में कोड की वास्तविक समझ नहीं है?

बिलकुल नहीं, ऐसा क्यों होगा?

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

जाहिर है, खराब टेस्ट लिखना बुरा है। लेकिन प्रति परीक्षण के कार्य से इसका कोई लेना-देना नहीं है।


3

(मेरी मूल टिप्पणियों से)

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

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


2

स्वचालित परीक्षणों का उद्देश्य आपको यह बताना है कि आपने कब जल्दी से जल्दी कुछ तोड़ दिया है । वर्कफ़्लो कुछ इस तरह दिखता है:

  1. एक बदलाव करें
  2. अपने परिवर्तन का निर्माण और परीक्षण करें (आदर्श रूप से स्वचालित रूप से)
  3. यदि परीक्षण विफल हो जाते हैं, तो इसका मतलब है कि आपने पहले काम किया कुछ तोड़ दिया था
  4. यदि परीक्षण पास हो जाते हैं, तो आपको विश्वास होना चाहिए कि आपके परिवर्तन ने कोई नई व्यवस्था नहीं दी है (परीक्षण कवरेज के आधार पर)

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

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

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

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

यह लिखने की इकाई परीक्षणों को सामने से अलग करता है

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

यदि किसी समय सभी इकाई परीक्षण पास हो जाते हैं, तो उस समय किसी भी समय सॉफ्टवेयर की स्थिति का कोई बड़ा चित्र नहीं होता है। कोई रोडमैप / लक्ष्य नहीं है।

इकाई परीक्षण रोडमैप / लक्ष्य निर्धारित करने के लिए नहीं हैं, हो सकता है कि इसके लिए एक बैकलॉग का उपयोग करें? यदि आपके सभी परीक्षण पास हो जाते हैं तो "बड़ी तस्वीर" यह है कि आपका सॉफ़्टवेयर टूटा नहीं है (यदि आपका परीक्षण कवरेज अच्छा है)। बहुत बढ़िया!


2

मौजूदा उत्तर निश्चित रूप से अच्छे हैं, लेकिन मैंने किसी को भी प्रश्न में इस मूलभूत गलत धारणा को संबोधित नहीं किया है:

किसी भी समय सभी इकाई परीक्षणों में उत्तीर्ण होना चाहिए

नहीं। अधिकांश आश्वस्त रूप से, यह सच नहीं होगा। जबकि मैं सॉफ्टवेयर विकसित कर रहा हूं, NCrunch सबसे अधिक बार या तो भूरा होता है (बिल्ड विफलता) या लाल (असफल परीक्षण)।

जहाँ NCrunch को हरा होना चाहिए (सभी परीक्षण पास करना) है जब मैं स्रोत नियंत्रण सर्वर के लिए प्रतिबद्ध करने के लिए तैयार हूं, क्योंकि उस बिंदु पर अन्य मेरे कोड पर निर्भरता ले सकते हैं।

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

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

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


एक साइड नोट के रूप में, यूनिट परीक्षण कभी-कभी टेस्ट ड्रिवेन डेवलपमेंट के साथ हाथ से हाथ जाता है। टीडीडी के सिद्धांतों में से एक यह है कि टूटे हुए परीक्षण आपके गाइडपोस्ट हैं। जब कोई परीक्षा विफल हो जाती है, तो आपको कोड को ठीक करने की आवश्यकता होती है ताकि परीक्षण पास हो जाए। इस सप्ताह के शुरू से एक ठोस उदाहरण यहाँ दिया गया है:

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

इसके बजाय, मेरी लाइब्रेरी Antlr और Oracle 12c सिंटैक्स का उपयोग करते हुए क्वेरी को पार्स करती है, और फिर सिंटैक्स ट्री पर विभिन्न अभिक्रियाओं को लपेटता है। जैसी चीजें, यह मान्य है (कोई पार्स त्रुटियां नहीं उठाया गया था), इसके सभी पैरामीटर पैरामीटर संग्रह से संतुष्ट हैं, डेटा रीडर द्वारा पढ़े गए सभी अपेक्षित कॉलम क्वेरी में मौजूद हैं, आदि ये सभी आइटम हैं जो कि माध्यम से फिसल गए हैं विभिन्न समय पर उत्पादन।

मेरे एक साथी इंजीनियर ने सोमवार को मुझे एक प्रश्न भेजा था जो सप्ताहांत में विफल हो गया था (या बल्कि, सफल हो गया था)। मेरी लाइब्रेरी ने कहा कि सिंटैक्स ठीक था, लेकिन जब सर्वर ने इसे चलाने की कोशिश की तो यह उड़ गया। और जब उन्होंने क्वेरी को देखा, तो यह स्पष्ट था कि:

UPDATE my_table(
SET column_1 = 'MyValue'
WHERE id_column = 123;

मैंने प्रोजेक्ट को लोड किया और एक यूनिट टेस्ट जोड़ा, जिसमें कहा गया था कि यह क्वेरी मान्य नहीं होनी चाहिए। जाहिर है, परीक्षण विफल रहा।

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

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


0

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

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

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


मुझे लगता है कि आप "बाहरी परीक्षण" के रूप में जो वर्णन कर रहे हैं, उसे अक्सर कहीं और "एकीकरण" परीक्षणों के रूप में वर्णित किया जाता है।
GalacticCowboy

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

0

"लेकिन किसी भी समय सभी इकाई परीक्षणों को पास करना होगा"

यदि आपकी कंपनी में यही रवैया है, तो यह एक समस्या है। CERTAIN समय पर, जब हम घोषित करते हैं कि कोड अगले वातावरण में जाने के लिए तैयार है, तो सभी यूनिट परीक्षणों को पास होना चाहिए। लेकिन विकास के दौरान, हमें नियमित रूप से कई यूनिट परीक्षणों के असफल होने की उम्मीद करनी चाहिए।

कोई भी वाजिब व्यक्ति यह अपेक्षा नहीं करता है कि कोई प्रोग्रामर अपने काम को पहली कोशिश में पूरा करे। हम जो अपेक्षा करते हैं, वह यह है कि जब तक कोई ज्ञात समस्या न हो, वह उस पर काम करता रहेगा।

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

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

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


-7

यह पुष्टिकरण पूर्वाग्रह का एक विशिष्ट उदाहरण है , जिसमें लोग ऐसी जानकारी की तलाश करते हैं जो उनके मौजूदा विश्वासों की पुष्टि करता है।

इस होने का एक प्रसिद्ध उदाहरण, 2,4,6 खेल में है।

  • मेरे सिर में एक नियम है कि तीन नंबरों की कोई भी श्रृंखला पास होगी या विफल होगी,
  • 2,4,6 पास है
  • आप तीन नंबर के सेट को सूचीबद्ध कर सकते हैं, और मैं आपको बताऊंगा कि क्या वे पास या असफल हैं।

अधिकांश लोग एक नियम चुनते हैं, कहते हैं "1 और 2 नंबर के बीच का अंतर 2 और 3 के बीच के अंतर के समान है।"

वे कुछ नंबरों का परीक्षण करेंगे:

  • 4, 8, 12? उत्तीर्ण करना
  • 20, 40, 60? उत्तीर्ण करना
  • 2, 1004, 2006? उत्तीर्ण करना

वे कहते हैं "हां, हर अवलोकन मेरी परिकल्पना की पुष्टि करता है, यह सच होना चाहिए।" और पहेली देने वाले व्यक्ति को उनके शासन की घोषणा करें।

लेकिन उन्हें कभी भी तीन नंबर के किसी भी सेट में एक भी 'असफल' नहीं मिला। नियम वास्तव में उनके पास सभी सूचनाओं के लिए 'तीन नंबरों के लिए नंबरों की आवश्यकता' हो सकती थी।

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

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


2
यह प्रश्न के लिए प्रासंगिक कैसे है? विफल रहने इकाई परीक्षण कर रहे हैं परिभाषा के द्वारा, एक समस्या का सबूत।
फ्रैक्स

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