4.2 टेस्ट कवरेज और टेस्ट प्रभावशीलता
अवलोकन और प्रेरणा
टेस्ट कवरेज एक टेस्ट सूट द्वारा निष्पादित कोड के प्रतिशत को मापता है: लाइन कवरेज, ब्रांच कवरेज, या अधिक सख़्त पथ कवरेज। यह इस पूरी पुस्तक में सबसे व्यापक रूप से ट्रैक किए जाने वाले मेट्रिक्स में से एक है, गणना करने में सस्ता, एक एकल प्रतिशत के रूप में दृश्यमान करना आसान, और परिणामस्वरूप सबसे अधिक बार चालाकी किया गया मेट्रिक्स में से एक, ठीक उस तरीक़े से जिसकी विषय 1.2 किसी भी मेट्रिक के लिए भविष्यवाणी करता है जो एक लक्ष्य बन जाता है। एक टेस्ट सूट लगभग कुछ भी सार्थक सत्यापित किए बिना उच्च कवरेज प्राप्त कर सकता है, क्योंकि कवरेज मापता है कि क्या कोड एक टेस्ट रन के दौरान निष्पादित हुआ, यह नहीं कि क्या टेस्ट ने वास्तव में जाँचा कि कोड सही ढंग से व्यवहार करता है।
कवरेज और वास्तविक टेस्ट प्रभावशीलता के बीच यह अंतर एक मामूली फ़ुटनोट नहीं है; यह इस विषय की केंद्रीय चिंता है। एक टेस्ट जो एक फ़ंक्शन को कॉल करता है और उसके परिणाम के बारे में कुछ भी अभिकथित नहीं करता वह कवरेज को उतना ही बढ़ाता है जितना एक टेस्ट जो एज केसों में फ़ंक्शन के व्यवहार को पूरी तरह सत्यापित करता है। इस विषय द्वारा सुझाया गया समाधान, म्यूटेशन परीक्षण, जान-बूझकर कोड में छोटी, कृत्रिम त्रुटियाँ पेश करता है और जाँचता है कि क्या टेस्ट सूट वास्तव में उन्हें पकड़ता है, इस अंतर का प्रत्यक्ष उत्तर है, और यह विषय इसे कवरेज के आवश्यक पूरक के रूप में मानता है, एक वैकल्पिक अतिरिक्त के रूप में नहीं।
बड़ी टीमों के लिए, कवरेज लक्ष्यों को अक्सर एक गुणवत्ता गेट के रूप में संगठन-व्यापी अपनाया जाता है, ठीक उस प्रकार का प्रोत्साहित, उच्च-दृश्यता मेट्रिक जिसके बारे में विषय 1.2 चेतावनी देता है कि यह चालाकी के प्रति सबसे अधिक उजागर है। एंटरप्राइज़ और सरकारी संगठन जो एक जोड़ी हुई प्रभावशीलता जाँच के बिना एक व्यापक कवरेज प्रतिशत आवश्यकता निर्धारित करते हैं, वे प्रभावी रूप से ठीक उसी सीमा-चालाकी पैटर्न को प्रोत्साहित कर रहे हैं जिसका यह पुस्तक वर्णन करती है: विशुद्ध रूप से एक संख्या तक पहुँचने के लिए लिखे गए तुच्छ परीक्षण, वास्तविक दोष रोकथाम में बिना किसी संबंधित सुधार के।
प्रमुख सिद्धांत
- कवरेज निष्पादन मापता है, सत्यापन नहीं। एक टेस्ट द्वारा चलाई गई एक पंक्ति यह कुछ नहीं बताती कि क्या टेस्ट ने इसके बारे में कुछ भी सार्थक जाँचा।
- बिना किसी प्रभावशीलता जाँच वाला एक कवरेज लक्ष्य एक पाठ्यपुस्तक गुडहार्ट के नियम सेटअप है (विषय 1.2): संख्या सुधरती है जबकि वास्तविक गुणवत्ता नहीं।
- म्यूटेशन परीक्षण कवरेज का आवश्यक पूरक है, प्रतिस्थापन नहीं; दोनों को साथ में उपयोग करें।
- कवरेज एक अधिकतम करने के लक्ष्य की तुलना में एक फ़र्श के रूप में अधिक उपयोगी है। एक कम संख्या वास्तव में अपरीक्षित कोड उजागर करती है; 100% का पीछा करना अक्सर घटते या नकारात्मक प्रतिफल उत्पन्न करता है।
- महत्वपूर्ण-पथ कवरेज समान, व्यापक कवरेज से अधिक मायने रखता है। यदि यह विफल हो जाए तो सभी कोड समान जोखिम नहीं रखते।
सिफ़ारिशें
अपरीक्षित कोड खोजने के लिए कवरेज का उपयोग करें, अधिकतम करने के लिए एक लक्ष्य के रूप में नहीं
एक कवरेज रिपोर्ट को मुख्य रूप से इस बात के नक़्शे के रूप में मानें कि क्या पूरी तरह अपरीक्षित है, जो वास्तव में उपयोगी जानकारी है, 100% की ओर धकेलने के लिए एक स्कोर के रूप में नहीं। शून्य कवरेज वाला कोड बंद करने लायक़ एक वास्तविक अंतर है; कवरेज को 85% से 95% तक धकेलने का सीमांत मूल्य आमतौर पर कहीं कम है और अक्सर इसमें लगने वाले प्रयास के लायक़ नहीं है, विशेष रूप से यदि वह प्रयास केवल उच्च संख्या तक पहुँचने के लिए कम-मूल्य वाले परीक्षण उत्पन्न करता है।
हर कवरेज लक्ष्य को म्यूटेशन परीक्षण के साथ जोड़ें
म्यूटेशन परीक्षण उपकरण स्वचालित रूप से आपके कोड में छोटी त्रुटियाँ पेश करते हैं, एक तुलना ऑपरेटर को पलटना, एक सीमा शर्त बदलना, और फिर हर उत्परिवर्तित संस्करण के विरुद्ध आपके टेस्ट सूट को चलाते हैं। एक टेस्ट सूट जो अधिकांश म्यूटेंटों को “मार” देता है (उनके विरुद्ध विफल होता है) वास्तव में व्यवहार को सत्यापित कर रहा है; उच्च लाइन कवरेज लेकिन कम म्यूटेशन-किल दर वाला एक टेस्ट सूट सार्थक रूप से इसे जाँचे बिना कोड को निष्पादित कर रहा है। यह युग्मन कवरेज-लक्ष्य चालाकी के विरुद्ध एकल सबसे प्रभावी गार्डरेल है, और यह पुस्तक इसे मानक प्रथा के रूप में सुझाती है, एक उन्नत या वैकल्पिक तकनीक नहीं।
पहले महत्वपूर्ण पथों पर कवरेज और म्यूटेशन परीक्षण को प्राथमिकता दें
सभी कोड समान जोखिम नहीं रखते। एक भुगतान-प्रोसेसिंग पथ, एक प्रमाणीकरण जाँच, या एक डेटा-माइग्रेशन स्क्रिप्ट एक शायद ही कभी उपयोग की जाने वाली प्रशासनिक रिपोर्ट से कहीं अधिक कठोर परीक्षण की हक़दार है। पूरे कोडबेस में समान कवरेज का पीछा करने की बजाय, अपने उच्चतम-जोखिम, उच्चतम-परिणाम कोड पथों की पहचान करें और पहले कवरेज और म्यूटेशन परीक्षण दोनों प्रयासों को वहाँ केंद्रित करें, वास्तव में कम-जोखिम कोड पर कम कवरेज को एक निगरानी की बजाय एक जान-बूझकर, सूचित समझौते के रूप में स्वीकार करते हुए।
विशिष्ट कवरेज-चालाकी पैटर्नों के लिए देखें
एक बार जब यह एक लक्ष्य बन जाता है तो कवरेज के साथ चालाकी होने के सबसे सामान्य तरीक़ों में शामिल हैं: ऐसे परीक्षण जो एक फ़ंक्शन को कॉल करते हैं लेकिन परिणाम के बारे में कुछ भी सार्थक अभिकथित नहीं करते (इस मेट्रिक पर लागू विषय 1.2 की सीमा चालाकी), अंतर्निहित समस्या को ठीक करने की बजाय विफल होने वाले परीक्षणों को अक्षम या हटाना, और यह संबोधित करने की बजाय कि यह परीक्षण करने में कठिन क्यों है, परीक्षण करने में कठिन कोड को कवरेज गणना से पूरी तरह बाहर करना। केवल कवरेज प्रतिशत पर भरोसा करने की बजाय, समय-समय पर परीक्षणों के एक नमूने का सीधे ऑडिट करें, उनके वास्तविक अभिकथन पढ़ते हुए।
अपनी CI पाइपलाइन में एक कवरेज सीलिंग नहीं, एक कवरेज फ़र्श निर्धारित करें
अपनी बिल्ड पाइपलाइन को इस तरह कॉन्फ़िगर करें कि यदि नए कोड के लिए एक सहमत फ़र्श से कवरेज गिरती है तो यह विफल हो, गिरावट को रोकते हुए, हर परिवर्तन के लिए समग्र संख्या को ऊँचा धकेलने की आवश्यकता की बजाय। यह भेद मायने रखता है: एक फ़र्श उस निरंतर ऊपर की ओर दबाव के बिना पतन के विरुद्ध रक्षा करता है जो संख्या को और आगे बढ़ाने के विशुद्ध रूप से लिखे गए कम-मूल्य परीक्षण उत्पन्न करता है।
समझौते: लाभ और हानि
| दृष्टिकोण | लाभ | हानि |
|---|---|---|
| अकेले कवरेज प्रतिशत | सस्ता, सरल, टूलिंग द्वारा व्यापक रूप से समर्थित | आसानी से चालाकी होती है; सत्यापन नहीं, निष्पादन मापता है |
| म्यूटेशन परीक्षण के साथ कवरेज | सत्यापित करता है कि परीक्षण वास्तव में व्यवहार जाँचते हैं, चालाकी का प्रतिरोध करता है | अधिक गणनात्मक रूप से महंगा; टूलिंग निवेश की आवश्यकता |
| कोडबेस में समान कवरेज लक्ष्य | बताना और लागू करना सरल | कम-जोखिम कोड पर प्रयास बर्बाद करता है; कहीं और वास्तव में महत्वपूर्ण पथों में कम-निवेश करता है |
| जोखिम-आधारित, महत्वपूर्ण-पथ-पहले कवरेज | प्रयास को वहाँ केंद्रित करता है जहाँ यह सबसे अधिक मायने रखता है | वास्तव में महत्वपूर्ण पथों को सही ढंग से पहचानने के लिए निर्णय की आवश्यकता |
केंद्रीय तनाव है सरलता बनाम ईमानदारी। एक एकल कवरेज प्रतिशत रिपोर्ट करना आसान है और एक लक्ष्य के रूप में निर्धारित करना आसान है, लेकिन वह सरलता ठीक वही है जो इसे एक बार प्रोत्साहित संख्या बनने पर इतना आसानी से चालाकी योग्य बनाती है। तनाव को म्यूटेशन परीक्षण और जोखिम-आधारित प्राथमिकता की अतिरिक्त जटिलता को एक ईमानदार संकेत की लागत के रूप में स्वीकार करके, और अपनी टीम को स्पष्ट रूप से संप्रेषित करके हल करें कि क्यों एक कम समग्र कवरेज संख्या, सही ढंग से महत्वपूर्ण पथों पर केंद्रित और एक मज़बूत म्यूटेशन-किल दर द्वारा समर्थित, एक उच्च, अधिक समान रूप से वितरित लेकिन कम प्रभावी रूप से सत्यापित संख्या से अधिक मूल्यवान है।
अपनी टीम के साथ चर्चा करने के प्रश्न
हमारे उच्चतम-जोखिम कोड पथों पर हमारी म्यूटेशन-किल दर क्या है, और यह उसी कोड पर हमारे कवरेज प्रतिशत से कैसे तुलना करती है? एक उच्च कवरेज संख्या और एक कम म्यूटेशन-किल दर के बीच एक बड़ा अंतर सबसे स्पष्ट संभव संकेत है कि अकेले कवरेज आपको वह नहीं बता रहा जो आप सोचते हैं कि यह बता रहा है।
क्या हमने कभी मुख्य रूप से एक कवरेज संख्या बढ़ाने के लिए एक परीक्षण लिखा है, इसे क्या सत्यापित करना चाहिए इसके बारे में बहुत कम वास्तविक विचार के साथ? यहाँ ईमानदार रहें; यह टीमें स्वीकार करने की तुलना में अधिक बार होता है, विशेष रूप से समयसीमा दबाव के तहत जब एक कवरेज गेट एक मर्ज को अवरुद्ध कर रहा है।
क्या हमारा कवरेज प्रयास हमारे उच्चतम-जोखिम कोड पथों पर केंद्रित है, या यदि वह कोड विफल हो जाए तो परिणाम की परवाह किए बिना समान रूप से फैला हुआ है? अपने कोडबेस के एक ईमानदार जोखिम आकलन के विरुद्ध अपने वर्तमान कवरेज वितरण को मैप करें और बेमेल के लिए देखें।
क्या हमने कभी इसके द्वारा उजागर की गई अंतर्निहित समस्या को ठीक करने की बजाय एक विफल परीक्षण को अक्षम या हटाया है? यह कवरेज चालाकी के सबसे हानिकारक रूपों में से एक है, क्योंकि यह वास्तविक सुरक्षा को सक्रिय रूप से हटाता है जबकि रिपोर्ट की गई कवरेज संख्या शायद ही कभी हिलती है।
क्या हमारी CI पाइपलाइन नए कोड के लिए एक कवरेज फ़र्श लागू करती है, या यह घटते प्रतिफल की परवाह किए बिना एक निरंतर-उच्च सीलिंग के लिए धकेलती है? चर्चा करें कि क्या आपका वर्तमान गेट डिज़ाइन सही प्रोत्साहन बनाता है, गिरावट के विरुद्ध रक्षा करना, या ग़लत, निरंतर ऊपर की ओर दबाव जो कम-मूल्य परीक्षण पैडिंग को पुरस्कृत करता है।
हमारे कोडबेस में कौन-सा कोड कवरेज गणना से बाहर रखा गया है, और क्या वह बहिष्करण न्यायोचित है या यह एक वास्तविक परीक्षण अंतर छुपा रहा है? अपने वास्तविक बहिष्करण कॉन्फ़िगरेशन की समीक्षा करें; यह सामान्य है कि यह सूची समय के साथ चुपचाप बढ़ती है बिना किसी के यह फिर से जाँचे कि क्या हर बहिष्करण अभी भी न्यायोचित है।
क्षेत्र दृष्टिकोण
स्टार्टअप। इतनी जल्दी औपचारिक कवरेज लक्ष्य अक्सर अनावश्यक होते हैं; परीक्षण-लेखन प्रयास को सीधे अपने सबसे जोखिम भरे, सबसे व्यावसायिक-महत्वपूर्ण कोड पथों (आमतौर पर भुगतान या मुख्य-कार्यप्रवाह तर्क) पर केंद्रित करें, एक ऐसे कोडबेस में एक व्यापक प्रतिशत का पीछा करने की बजाय जो अभी भी तेज़ी से बदल रहा है और वैसे भी जल्द ही काफ़ी हद तक फिर से लिखा जा सकता है।
छोटा व्यवसाय। अधिकांश CI प्लेटफ़ॉर्म न्यूनतम सेटअप लागत पर स्वचालित रूप से कवरेज रिपोर्ट करते हैं; एक विशिष्ट लक्ष्य प्रतिशत का पीछा करने की बजाय मुख्य रूप से पूरी तरह अपरीक्षित महत्वपूर्ण कोड को खोजने के लिए इसका उपयोग करें, और केवल एक बार म्यूटेशन परीक्षण पर विचार करें जब आपके पास यह उजागर करने पर कार्य करने की इंजीनियरिंग क्षमता हो।
एंटरप्राइज़। इस पैमाने पर व्यापक, संगठन-व्यापी कवरेज लक्ष्य एक सामान्य और परिणामी ग़लती है, क्योंकि वे एक साथ दर्जनों टीमों में ठीक उसी चालाकी को प्रोत्साहित करते हैं जिसका यह विषय वर्णन करता है। सेवा गंभीरता के अनुसार भिन्न जोखिम-आधारित कवरेज अपेक्षाएँ स्थापित करें, और विशेष रूप से अपनी उच्चतम-जोखिम प्रणालियों के लिए म्यूटेशन परीक्षण अवसंरचना में निवेश करें।
सरकार। कवरेज आवश्यकताएँ कभी-कभी ख़रीद या अनुपालन दस्तावेज़ीकरण में गुणवत्ता आश्वासन के लिए एक भोंडे, आसानी से निर्दिष्ट किए जाने योग्य प्रॉक्सी के रूप में दिखाई देती हैं। जहाँ संभव हो, किसी भी अनुबंध-आवश्यक कवरेज प्रतिशत को एक म्यूटेशन-परीक्षण या दोष-आधारित प्रभावशीलता आवश्यकता के साथ जोड़ें, ताकि अनुबंध प्रोत्साहन अनजाने में ठीक उसी कम-मूल्य परीक्षण पैडिंग को पुरस्कृत न करे जिसके विरुद्ध यह विषय चेतावनी देता है।
उदाहरण
एंटरप्राइज़। एक ई-कॉमर्स प्लेटफ़ॉर्म के नेतृत्व ने सभी नए कोड के लिए एक कंपनी-व्यापी 95% कवरेज आवश्यकता निर्धारित की थी, एक कठोर CI गेट के रूप में लागू। कथित रूप से अच्छी तरह-परीक्षित कोड में उत्पादन दोषों की एक लहर से प्रेरित दो साल बाद के एक ऑडिट ने कोडबेस के अधिकांश हिस्से में 40% से कम की म्यूटेशन-किल दर पाई: टीमें ऐसे परीक्षण लिख रही थीं जो कोड पथों को निष्पादित करते थे बिना उनके व्यवहार पर सार्थक रूप से अभिकथन किए, विशुद्ध रूप से समयसीमा दबाव के तहत गेट को संतुष्ट करने के लिए। कंपनी ने व्यापक कवरेज आवश्यकता को एक जोखिम-स्तरीकृत नीति से बदल दिया: भुगतान और प्रमाणीकरण कोड के लिए 80% किल-दर सीमा से ऊपर सख़्त कवरेज और अनिवार्य म्यूटेशन परीक्षण, और कम-जोखिम आंतरिक टूलिंग के लिए एक बहुत हल्का कवरेज फ़र्श, जिसने दोनों ने बर्बाद परीक्षण प्रयास को कम किया और वास्तव में महत्वपूर्ण पथों में दोष दरों को मापने योग्य रूप से सुधारा।
सरकार। एक सार्वजनिक स्वास्थ्य एजेंसी की लाभ-पात्रता प्रणाली को अपने विकास विक्रेता समझौते के तहत अनुबंध द्वारा 90% टेस्ट कवरेज बनाए रखने की आवश्यकता थी। कवरेज आवश्यकता पूरी होने के बावजूद शिप हुए एक महत्वपूर्ण पात्रता-गणना दोष के बाद एक घटना-पश्चात समीक्षा ने पाया कि ज़िम्मेदार विशिष्ट फ़ंक्शन ने अपनी कवरेज पूरी तरह ऐसे परीक्षणों के माध्यम से हासिल की थी जो फ़ंक्शन को वैध इनपुट के साथ कॉल करते थे लेकिन कभी सीमा शर्तों या अमान्य इनपुट का परीक्षण नहीं करते थे, ठीक वहीं जहाँ दोष हुआ। एजेंसी के संशोधित विक्रेता अनुबंध को अब किसी भी पात्रता-गणना कोड के लिए कवरेज के साथ-साथ एक दस्तावेज़ीकृत म्यूटेशन-परीक्षण स्कोर की आवश्यकता है, उस विशिष्ट अंतर को बंद करते हुए जिसने अनुपालन करने वाले लेकिन अप्रभावी परीक्षण को अनुबंध को संतुष्ट करने की अनुमति दी थी।
व्यावसायिक तर्क: प्रेरणाएँ, ROI, और TCO
कवरेज को म्यूटेशन परीक्षण के साथ जोड़ने का प्रतिफल एक उत्पादन दोष की क़ीमत होने से पहले स्पष्ट और वास्तविक परीक्षण गुणवत्ता के बीच अंतर को पकड़ना है। ऊपर का ई-कॉमर्स उदाहरण पैटर्न को स्पष्ट रूप से दिखाता है: अकेले एक कवरेज आवश्यकता ने सुरक्षा की एक झूठी भावना उत्पन्न की थी जिसे दोषों की एक लहर ने अंततः उस म्यूटेशन-परीक्षण निवेश से कहीं अधिक लागत पर उजागर किया जो अंतर को पहले पकड़ लेता।
कुल स्वामित्व लागत में म्यूटेशन परीक्षण की गणनात्मक लागत शामिल है, जो साधारण कवरेज इंस्ट्रूमेंटेशन की तुलना में चलाना अधिक महंगा है और इसलिए आमतौर पर एक पूरे कोडबेस की बजाय महत्वपूर्ण-पथ कोड के लिए आरक्षित है, साथ ही परिणामों की व्याख्या करने और उन पर कार्य करने का इंजीनियरिंग समय। वह लागत विशेष रूप से उच्चतम-जोखिम कोड के लिए न्यायोचित है, जहाँ परीक्षण प्रभावशीलता में एक अनदेखे अंतर की लागत सबसे अधिक है।
विरोधी-पैटर्न और नुक़सान
- कवरेज प्रतिशत को एक प्रत्यक्ष गुणवत्ता फ़ैसला मानना: यह निष्पादन मापता है, सत्यापन नहीं।
- मुख्य रूप से एक कवरेज गेट को संतुष्ट करने के लिए परीक्षण लिखना: ठीक वही कम-मूल्य, सीमा-चालाकी पैटर्न उत्पन्न करता है जिसके विरुद्ध विषय 1.2 चेतावनी देता है।
- अंतर्निहित समस्या को ठीक करने की बजाय विफल परीक्षणों को अक्षम या हटाना: रिपोर्ट की गई संख्या को शायद ही प्रभावित करते हुए वास्तविक सुरक्षा को हटाता है।
- कोड जोखिम की परवाह किए बिना एक समान कवरेज लक्ष्य लागू करना: कम-जोखिम कोड पर प्रयास बर्बाद करता है और वास्तव में महत्वपूर्ण पथों में कम-निवेश करता है।
- समय के साथ चुपचाप एक बहिष्करण सूची बढ़ाना: एक तकनीकी रूप से सटीक लेकिन भ्रामक कवरेज आँकड़े के पीछे वास्तविक परीक्षण अंतरों को छुपाता है।
- एक कवरेज फ़र्श की बजाय एक कवरेज सीलिंग का पीछा करना: एक निरंतर ऊपर की ओर दबाव बनाता है जो वास्तविक सत्यापन पर परीक्षण पैडिंग को पुरस्कृत करता है।
परिपक्वता मॉडल
- स्तर 1, आरंभ: कवरेज को मापा नहीं जाता, या बिना किसी फ़र्श, लक्ष्य, या प्रभावशीलता जाँच के असंगत रूप से मापा जाता है।
- स्तर 2, विकास: एक कवरेज लक्ष्य मौजूद है और ट्रैक किया जाता है, लेकिन कोई म्यूटेशन परीक्षण या जोखिम-आधारित प्राथमिकता यह सूचित नहीं करती कि प्रयास कैसे आवंटित किया जाता है।
- स्तर 3, मानकीकरण: कवरेज फ़र्श CI में लगातार लागू किए जाते हैं, जोखिम-आधारित प्राथमिकता निर्देशित करती है कि कवरेज प्रयास कहाँ केंद्रित होता है।
- स्तर 4, प्रबंधन: म्यूटेशन परीक्षण महत्वपूर्ण-पथ कोड पर चलता है, कवरेज के साथ-साथ पूरी की जानी चाहिए एक ट्रैक की गई किल-दर सीमा के साथ, और बहिष्करण सूचियों का समय-समय पर ऑडिट किया जाता है।
- स्तर 5, संयोजन: संगठन म्यूटेशन-परीक्षण-सूचित प्राथमिकता से ट्रेस किए गए विशिष्ट दोष कमियों की ओर इशारा कर सकता है, और कवरेज और प्रभावशीलता डेटा साथ में सीधे परीक्षण निवेश निर्णयों को सूचित करते हैं।
चर्चा के लिए विचार
- हमारे एकल सबसे महत्वपूर्ण कोड पथ पर हमारी म्यूटेशन-किल दर क्या है, और क्या हम इसे बिल्कुल जानते हैं?
- क्या हमने कभी विशुद्ध रूप से एक कवरेज गेट को संतुष्ट करने के लिए एक कम-मूल्य परीक्षण लिखा है?
- क्या हमारा वर्तमान कवरेज प्रयास वहाँ केंद्रित है जहाँ जोखिम सबसे अधिक है, या समान रूप से फैला हुआ है?
- वर्तमान में कवरेज गणना से कौन-सा कोड बाहर रखा गया है, और क्या वह बहिष्करण अभी भी न्यायोचित है?
- क्या हमारी उच्चतम-जोखिम प्रणाली पर एक म्यूटेशन-परीक्षण निवेश इसकी गणनात्मक लागत के लायक़ होगा?
मुख्य निष्कर्ष
- टेस्ट कवरेज निष्पादन मापता है, सत्यापन नहीं; एक कवर की गई पंक्ति यह कुछ नहीं बताती कि क्या इसे सार्थक रूप से जाँचा गया।
- यह सत्यापित करने के लिए कि परीक्षण वास्तव में वास्तविक त्रुटियाँ पकड़ते हैं, केवल यह नहीं कि वे कोड चलाते हैं, कवरेज को म्यूटेशन परीक्षण के साथ जोड़ें।
- पूरे कोडबेस में समान कवरेज का पीछा करने की बजाय परीक्षण प्रयास को महत्वपूर्ण, उच्च-जोखिम पथों पर केंद्रित करें।
- कवरेज का उपयोग निरंतर अधिकतम करने के लिए एक सीलिंग के रूप में नहीं, गिरावट के विरुद्ध रक्षा करने के लिए एक फ़र्श के रूप में करें।
- विशिष्ट कवरेज-चालाकी पैटर्नों के लिए देखें: कम-मूल्य परीक्षण, अक्षम किए गए विफल परीक्षण, और चुपचाप बढ़ती बहिष्करण सूचियाँ।
संदर्भ और आगे पढ़ने के लिए
- Working Effectively with Legacy Code, by Michael Feathers (मौजूदा, परीक्षण करने में कठिन कोडबेस के लिए टेस्ट कवरेज रणनीति)।
- Jia, Yue, and Mark Harman, “An Analysis and Survey of the Development of Mutation Testing,” IEEE Transactions on Software Engineering (2011): म्यूटेशन परीक्षण तकनीकों और उनकी प्रभावशीलता का एक व्यापक सर्वेक्षण।
- xUnit Test Patterns, by Gerard Meszaros (वास्तव में प्रभावी, केवल कवरेज-संतुष्ट करने वाले नहीं, परीक्षण लिखने से प्रासंगिक परीक्षण डिज़ाइन पैटर्न)।
- Accelerate: The Science of Lean Software and DevOps, by Nicole Forsgren, Jez Humble, and Gene Kim (परीक्षण प्रथाओं और डिलीवरी प्रदर्शन के बीच संबंध)।