क्या हमें हमेशा उन्हें ठीक करते समय टेस्ट बग्स को यूनिट करना चाहिए?


29

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

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

इसलिए मेरा सवाल है: आप उन बगों के लिए कैसे परीक्षण करते हैं जो प्रजनन के लिए मुश्किल हैं? आप उन चीजों को बनाने से कैसे बचते हैं जो कार्यान्वयन का परीक्षण करते हैं, और रिफैक्टिंग और पठनीयता को चोट पहुँचाते हैं?


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

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

1
अगर यह किसी यूनिटेस्ट के लिए बहुत जटिल है, तो यह एकीकरण परीक्षण का हिस्सा है
शाफ़्ट फ्रीक

ऐसा लगता है कि एकीकरण परीक्षण की आवश्यकता है, न कि इकाई परीक्षण की। इस तथ्य के आधार पर कि आप इतना मजाक कर रहे हैं। एक सामान्य नियम मैंने देखा है कि आप उस कोड का परीक्षण नहीं करते हैं जो आपके कोडबेस के बाहर घटकों से बात करता है (डेटाबेस से बात करते हुए, फ़ाइल सिस्टम से पढ़ना, आदि) जो लगता है कि यह क्या कर रहा है।
लुकास

जवाबों:


27

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

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


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

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

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

+1 के लिए "चूंकि बग को नीचे चलाने के लिए रुकावटों में यूनिट टेस्ट विकसित करने और बनाए रखने की तुलना में अधिक ओवरहेड होते हैं।"
पीटर के।

16

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


7

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

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

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

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


5

हाँ तुम्हें करना चाहिए।

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

हालांकि यह टीडीडी अभ्यास नहीं है। TDD परीक्षण में आपके डिज़ाइन को चलाया जाता है, लेकिन आपके मामले में डिज़ाइन पहले ही तय कर लिया गया है।

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