क्या परीक्षण कवरेज कोड गुणवत्ता का पर्याप्त माप है?


20

अगर मेरे पास कोई कोड है जिसमें 80% परीक्षण कवरेज (सभी परीक्षण पास) हैं, तो क्या यह कहना उचित है कि यह किसी भी परीक्षण कवरेज के साथ कोड की तुलना में उच्च गुणवत्ता का है?

या यह कहना उचित है कि यह अधिक बनाए रखने योग्य है?


2
100% कवरेज का मतलब यह नहीं है कि यह अच्छी तरह से परीक्षण किया गया है। लेकिन 0% का मतलब है कि इसका परीक्षण बिल्कुल नहीं किया गया है।
मौविसील

1
तकनीकी रूप से नहीं। व्यावहारिक रूप से, हाँ। अनुभव ने बहुत सारे सॉफ्टवेयर इंजीनियरों और परीक्षकों को सिखाया है कि जब कोड कवरेज लगभग 80% तक पहुंच जाता है, तो यूनिट परीक्षण के लिए दोषों के प्रकार पर्याप्त हैं। यह पेरेटो सिद्धांत है। मूल रूप से एक बार जब आप उस बिंदु पर पहुंच जाते हैं, जहां आप 80% कोड को कवर कर रहे हैं, तो आपके परीक्षणों की गुणवत्ता की परवाह किए बिना, आपने संभवतः 20% कोड का परीक्षण किया है जो अधिकांश संभावित मुद्दों को काफी अच्छी तरह से बताता है। यह एक निरपेक्ष नहीं है, बल्कि एक पारंपरिक ज्ञान है। यदि आपके जीवन परीक्षण पर निर्भर करते हैं तो आपको अधिक गहन होना होगा।
कैलफूल

@JoeRounceville मुझे यकीन नहीं है ... मैं वास्तव में उपयोगी कुछ भी परीक्षण करते हुए उच्च परीक्षण कवरेज प्राप्त कर सकता हूं। कवरेज केवल आपको बताता है कि परीक्षण सूट द्वारा कोड को कितना छुआ जा रहा है, न कि परीक्षण सार्थक हैं।
एंड्रेस एफ।

1
@AndresF। इसलिए मैंने कहा "तकनीकी रूप से नहीं, व्यावहारिक रूप से हाँ"। लोग बेवकूफ नहीं हैं (आम तौर पर)। वे (आम तौर पर) केवल ब्रेनर मामलों का परीक्षण नहीं करते हैं। इसलिए, अनुभव के आधार पर , कई दुकानें लगभग 80% कवरेज को रोक देती हैं, जिससे यह (काफी सुरक्षित) धारणा बन जाती है कि उनके लोग नैतिक नहीं हैं।
कैलफूल

जवाबों:


24

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

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

परीक्षण डिज़ाइनों को बेहतर बनाने के लिए, आप (1) व्हाइटबॉक्स तकनीकों, (2) ब्लैकबॉक्स तकनीकों और (3) उत्परिवर्तन परीक्षण का उपयोग कर सकते हैं।

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

  • हर फंक्शन कहा जाता है? [कार्यात्मक कवरेज]
  • क्या हर बयान पर अमल होता है? [कथन कवरेज-- कार्यात्मक कवरेज और स्टेटमेंट कवरेज दोनों ही बहुत बुनियादी हैं, लेकिन कुछ भी नहीं से बेहतर]
  • प्रत्येक निर्णय (जैसे ifया while) के लिए, क्या आपके पास एक परीक्षण है जो इसे सच होने के लिए मजबूर करता है, और अन्य जो इसे गलत होने के लिए मजबूर करते हैं? [निर्णय कवरेज]
  • प्रत्येक स्थिति के लिए जो एक संयुग्मन (उपयोग करता है &&) या अव्यवस्था (उपयोग करता है ||) है, क्या प्रत्येक उपप्रकार का एक परीक्षण होता है जहां यह सच है या गलत है? [स्थिति कवरेज]
  • लूप कवरेज: क्या आपके पास एक परीक्षण है जो 0 पुनरावृत्तियों, 1 पुनरावृत्ति, 2 पुनरावृत्तियों को मजबूर करता है?
  • क्या प्रत्येक breakलूप से कवर किया गया है?

(2) आवश्यकताएं उपलब्ध होने पर ब्लैकबॉक्स तकनीकों का उपयोग किया जाता है, लेकिन कोड स्वयं नहीं है। ये उच्च-गुणवत्ता परीक्षण कर सकते हैं:

  • क्या आपके ब्लैकबॉक्स परीक्षण कई परीक्षण लक्ष्यों को कवर करते हैं? आप चाहते हैं कि आपके परीक्षण "मोटे" हों: न केवल वे फीचर एक्स का परीक्षण करते हैं, बल्कि वे वाई और जेड का भी परीक्षण करते हैं। विभिन्न विशेषताओं की परस्पर क्रिया बग को खोजने का एक शानदार तरीका है।
  • एकमात्र मामला जिसे आप "वसा" परीक्षण नहीं चाहते हैं, जब आप एक त्रुटि स्थिति का परीक्षण कर रहे हैं। उदाहरण के लिए, अमान्य उपयोगकर्ता इनपुट के लिए परीक्षण। यदि आपने कई अमान्य इनपुट परीक्षण लक्ष्यों (उदाहरण के लिए, एक अमान्य ज़िप कोड और एक अमान्य सड़क पता) को प्राप्त करने का प्रयास किया है, तो संभावना है कि एक मामला दूसरे को मास्क कर रहा है।
  • इनपुट प्रकारों पर विचार करें और इनपुट के प्रकारों के लिए "समतुल्यता वर्ग" बनाएं। उदाहरण के लिए, यदि आपका कोड यह देखने के लिए परीक्षण करता है कि क्या त्रिभुज समबाहु है, तो परीक्षण जो पक्षों के साथ एक त्रिकोण का उपयोग करता है (1, 1, 1) संभवतः उसी प्रकार की त्रुटियां पाएंगे जो परीक्षण डेटा (2, 2, 2) और (3, 3, 3) मिलेगा। इनपुट के अन्य वर्गों के बारे में सोचकर अपना समय बिताना बेहतर है। उदाहरण के लिए, यदि आपका कार्यक्रम करों को संभालता है, तो आप प्रत्येक टैक्स ब्रैकेट के लिए एक परीक्षण चाहते हैं। [इसे समतुल्य विभाजन कहते हैं।]
  • विशेष मामले अक्सर दोषों से जुड़े होते हैं। आपके परीक्षण डेटा में सीमा मूल्य भी होना चाहिए, जैसे कि समतुल्य कार्य के किनारों पर, ऊपर या नीचे। उदाहरण के लिए, एक छँटाई एल्गोरिथ्म का परीक्षण करने में, आप एक खाली सरणी, एक एकल तत्व सरणी, दो तत्वों के साथ एक सरणी और फिर एक बहुत बड़ी सरणी के साथ परीक्षण करना चाहेंगे। आपको न केवल इनपुट के लिए, बल्कि आउटपुट के लिए भी सीमा मामलों पर विचार करना चाहिए। [यह कॉल सीमा-मूल्य विश्लेषण है।]
  • एक और तकनीक है "त्रुटि अनुमान लगाना।" क्या आपके पास कुछ विशेष संयोजन का प्रयास करने की भावना है जो आप अपने कार्यक्रम को तोड़ने के लिए प्राप्त कर सकते हैं? तो बस कोशिश करो! याद रखें: आपका लक्ष्य बग ढूंढना है, यह पुष्टि करने के लिए नहीं कि कार्यक्रम वैध है । कुछ लोगों को त्रुटि अनुमान लगाने की आदत है।

(3) अंत में, मान लीजिए कि आपके पास पहले से ही व्हाइटबॉक्स कवरेज के लिए बहुत सारे अच्छे परीक्षण हैं, और लागू ब्लैकबॉक्स तकनीकें हैं। आप और क्या कर सकते हैं? यह आपके टेस्ट का परीक्षण करने का समय है । एक तकनीक जिसे आप उपयोग कर सकते हैं वह है म्यूटेशन टेस्टिंग।

बग के निर्माण की उम्मीद में, म्यूटेशन टेस्टिंग के तहत, आप अपने प्रोग्राम में (प्रति की) एक संशोधन करते हैं। एक उत्परिवर्तन हो सकता है:

एक चर के संदर्भ को दूसरे चर में बदलें; एब्स डालें () फ़ंक्शन; कम-से-अधिक से अधिक-से बदलें; एक बयान को हटा दें; एक स्थिर के साथ एक चर बदलें; ओवरराइडिंग विधि को हटा दें; एक सुपर विधि का संदर्भ हटाएं; तर्क क्रम बदलें

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


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

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


7

एक परिभाषा के अनुसार यह अधिक सुव्यवस्थित है, क्योंकि किसी भी परिवर्तन को परीक्षणों द्वारा पकड़े जाने की अधिक संभावना है।

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

मुझे पता है कि मैं किस कोड को बनाए रखना और बढ़ाना पसंद करूंगा।


7

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

यह कहना है कि कोड 80% के साथ कवर उचित हो सकता है अच्छा परीक्षण है शायद स्वीकार्य गुणवत्ता के हैं, और शायद अपेक्षाकृत पोषणीय। लेकिन यह वास्तव में बहुत कम गारंटी देता है।


3

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

इसे और अधिक रख-रखाव कहना उचित होगा।


2

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

यह ध्यान देने योग्य है कि वीडियो स्ट्रीमिंग वीडियो में महान नहीं है, इसलिए यदि आप पूर्ण रूप से देखना चाहते हैं तो यह डाउनलोड करने के लायक हो सकता है।


-2

मैं "हालत कवरेज" के संबंध में पिछले कुछ समय से खुद से यह सवाल पूछ रहा हूं। तो इस पेज के बारे में atollic.com से "कोड कोड विश्लेषण क्यों?"

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

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

एक दिलचस्प नेकर क्यूब परिवर्तन-दृष्टि में, परीक्षण कोड अब परीक्षण के तहत कोड द्वारा परीक्षण किया जा रहा है!


-3

यह गारंटी देने के कई तरीके हैं कि एक कार्यक्रम वह करता है जो आप चाहते हैं, और यह सुनिश्चित करने के लिए कि संशोधनों में कोई प्रभाव नहीं होगा।

परीक्षण एक है। डेटा के उत्परिवर्तन से बचना एक और है। तो एक प्रकार की प्रणाली है। या औपचारिक सत्यापन।

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


क्या यह केवल आपकी राय है या आप इसे किसी तरह वापस कर सकते हैं?
gnat

2
परीक्षण एक कार्यक्रम की गारंटी देने का एक तरीका नहीं है जो आप करना चाहते हैं।
एंड्रेस एफ।

1
फिर मुझे आश्चर्य होता है कि परीक्षण क्या है
एंड्रिया

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

जब मैंने लिखा था तो मैं शायद थोड़ा भड़क गया था - मैं एक फोन पर था - लेकिन मुझे अभी भी लगता है कि एक बिंदु है। मैं PHP पर नहीं मारना चाहता, लेकिन मुझे लगता है कि यह कहते हुए कि हास्केल विश्वसनीयता का एक बहुत बड़ा हिस्सा देता है एक उद्देश्य वक्तव्य है
एंड्रिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.