उत्परिवर्तन परीक्षण क्या है? (उदाहरण)
⚡ स्मार्ट सारांश
म्यूटेशन टेस्टिंग में जानबूझकर सोर्स कोड में छोटी-छोटी खामियां डाली जाती हैं और फिर प्रत्येक दोषपूर्ण संस्करण के खिलाफ मौजूदा टेस्ट सूट चलाया जाता है, यह मापने के लिए कि क्या वे परीक्षण परिवर्तन का पता लगाने के लिए पर्याप्त मजबूत हैं।
उत्परिवर्तन परीक्षण क्या है?
उत्परिवर्तन परीक्षण म्यूटेशन टेस्टिंग एक प्रकार का सॉफ्टवेयर परीक्षण है जिसमें सोर्स कोड के कुछ कथनों को बदला जाता है, ताकि यह जांचा जा सके कि टेस्ट केस सोर्स कोड में त्रुटियों का पता लगाने में सक्षम हैं या नहीं। म्यूटेशन टेस्टिंग का उद्देश्य टेस्ट केसों की मजबूती सुनिश्चित करना है, ताकि वे बदले हुए सोर्स कोड के विरुद्ध विफल हो जाएं।
किसी म्यूटेंट प्रोग्राम में किया गया परिवर्तन अत्यंत सूक्ष्म होना चाहिए, ताकि यह प्रोग्राम के समग्र उद्देश्य को प्रभावित न करे। म्यूटेशन टेस्टिंग को दोष-आधारित परीक्षण रणनीति भी कहा जाता है, क्योंकि इसमें प्रोग्राम में जानबूझकर दोष उत्पन्न करना शामिल होता है। यह एक प्रकार का सफेद Box परीक्षण जो मुख्य रूप से लागू होता है इकाई का परीक्षण.
म्यूटेशन टेस्टिंग का प्रस्ताव 1971 में रिचर्ड लिप्टन द्वारा एक छात्र शोध पत्र में दिया गया था और 1978 में डीमिलो, लिप्टन और सायवर्ड द्वारा लिखित "टेस्ट डेटा चयन पर संकेत" नामक शोध पत्र में इसे औपचारिक रूप दिया गया था। उस समय की कंप्यूटिंग लागत के कारण इसकी गति धीमी हो गई थी, लेकिन तब से कुछ भाषाओं के कारण इसने फिर से लोकप्रियता हासिल कर ली है। Java, सी#, Python, Javaस्क्रिप्ट और XML।
उत्परिवर्तन परीक्षण कैसे निष्पादित करें?
उत्परिवर्तन परीक्षण, जिसे उत्परिवर्तन विश्लेषण भी कहा जाता है, को निष्पादित करने के चरण निम्नलिखित हैं:
चरण १: प्रोग्राम के सोर्स कोड में त्रुटियाँ उत्पन्न करने के लिए कई संस्करण बनाए जाते हैं जिन्हें म्यूटेंट कहा जाता है। प्रत्येक म्यूटेंट में एक ही त्रुटि होनी चाहिए, और लक्ष्य म्यूटेंट संस्करण को विफल करना है, जिससे परीक्षण मामलों की प्रभावशीलता प्रदर्शित होती है।
चरण १: टेस्ट केस मूल प्रोग्राम और उत्परिवर्तित प्रोग्राम दोनों पर लागू किए जाते हैं। परीक्षण का मामला पर्याप्त होना चाहिए, और इसे प्रोग्राम में त्रुटियों का पता लगाने के लिए समायोजित किया जाता है।
चरण १: मूल और उत्परिवर्तित प्रोग्राम के परिणामों की तुलना करें।
चरण १: यदि मूल प्रोग्राम और उत्परिवर्तित प्रोग्राम अलग-अलग आउटपुट देते हैं, तो परीक्षण प्रक्रिया द्वारा उत्परिवर्तित प्रोग्राम को निष्क्रिय कर दिया जाता है। अतः, परीक्षण प्रक्रिया मूल और उत्परिवर्तित प्रोग्राम के बीच अंतर का पता लगाने के लिए पर्याप्त है।
चरण १: यदि मूल प्रोग्राम और उत्परिवर्तित प्रोग्राम एक ही आउटपुट उत्पन्न करते हैं, तो उत्परिवर्तित प्रोग्राम को जीवित रखा जाता है। ऐसे मामलों में, अधिक प्रभावी परीक्षण मामले बनाने की आवश्यकता होती है जो सभी उत्परिवर्तित प्रोग्रामों को नष्ट कर दें।
नीचे दिया गया आरेख tracइसमें मूल प्रोग्राम से लेकर उत्परिवर्ती पीढ़ी तक और अंत में मृत या जीवित के फैसले तक, वही पांच चरण शामिल हैं।
उत्परिवर्ती कार्यक्रम कैसे बनाएं?
म्यूटेशन किसी प्रोग्राम स्टेटमेंट में किया गया एक एकल सिंटैक्टिक परिवर्तन मात्र है। प्रत्येक म्यूटेंट प्रोग्राम मूल प्रोग्राम से ठीक एक म्यूटेशन द्वारा भिन्न होना चाहिए।
| मूल कार्यक्रम | उत्परिवर्ती कार्यक्रम |
| यदि (x>y) “हैलो” प्रिंट करें अन्य “हाय” प्रिंट करें |
यदि (x “हैलो” प्रिंट करें अन्य “हाय” प्रिंट करें |
ऊपर दिए गए उदाहरण में केवल तुलना ऑपरेटर बदला है, फिर भी जब x, y से बड़ा होता है तो "Hello" के बजाय "Hi" प्रिंट होता है। चित्र में यह एक वाक्यविन्यास संबंधी बदलाव दिखाया गया है।
म्यूटेंट प्रोग्राम में क्या परिवर्तन किया जाए?
म्यूटेंट प्रोग्राम बनाने के लिए कई तकनीकें उपलब्ध हैं। नीचे दी गई तीन श्रेणियां उन अधिकांश म्यूटेशन ऑपरेटरों को कवर करती हैं जो टूल्स के साथ आते हैं।
| Operaऔर प्रतिस्थापन ऑपरेटर | अभिव्यक्ति संशोधन ऑपरेटर | कथन संशोधन ऑपरेटर |
| ऑपरेंड को किसी अन्य ऑपरेंड से बदलें (x को y से, या y को x से) या किसी स्थिर मान से बदलें। | किसी प्रोग्राम स्टेटमेंट में किसी ऑपरेटर को बदलें, या एक नया ऑपरेटर डालें। | प्रोग्रामेटिक कथनों को उत्परिवर्ती प्रोग्राम बनाने के लिए संशोधित किया जाता है। |
| उदाहरण: यदि (x>y) तो x और y मानों को प्रतिस्थापित करें यदि (5>y) तो x को स्थिरांक 5 से प्रतिस्थापित करें |
उदाहरण: यदि(x==y) हम == को >= से बदल सकते हैं और म्यूटेंट प्रोग्राम इस प्रकार होगा: यदि(x>=y) और कथन में ++ प्रविष्ट करना यदि(x==++y) |
उदाहरण: if-else कथन में else भाग को हटाएँ प्रोग्राम के व्यवहार की जांच करने के लिए संपूर्ण if-else स्टेटमेंट को हटा दें। |
कुछ उदाहरण उत्परिवर्तन ऑपरेटर:
- GOTO लेबल प्रतिस्थापन
- रिटर्न स्टेटमेंट प्रतिस्थापन
- कथन हटाना
- एकल ऑपरेटर सम्मिलन (जैसे – और ++)
- तार्किक कनेक्टर प्रतिस्थापन
- तुलनीय सरणी नाम प्रतिस्थापन
- इफ-एल्स स्टेटमेंट के एल्स भाग को हटाना
- ऑपरेटरों को जोड़ना या बदलना
- डेटा बदलकर कथन प्रतिस्थापन
- चरों के लिए डेटा संशोधन
- कार्यक्रम में डेटा प्रकारों का संशोधन
Operaसीमा शर्त को छूने वाले कारक अक्सर जीवित रहते हैं, इसलिए उत्परिवर्तन के परिणाम अक्सर अंतराल की ओर इशारा करते हैं। सीमा मान विश्लेषण.
उत्परिवर्तन परीक्षण के प्रकार
In सॉफ्टवेयर इंजीनियरिंगउत्परिवर्तन परीक्षण को मूल रूप से तीन प्रकारों में वर्गीकृत किया गया है - कथन उत्परिवर्तन, मूल्य उत्परिवर्तन और निर्णय उत्परिवर्तन।
- कथन उत्परिवर्तन – किसी कथन को कॉपी, पेस्ट या डिलीट किया जाता है, इसलिए इसका परिणाम कोड की कुछ पंक्तियों को हटाना हो सकता है।
- मूल्य उत्परिवर्तन – प्राथमिक मापदंडों और स्थिरांकों के मानों को संशोधित किया जाता है, उदाहरण के लिए लूप की सीमा या थ्रेशहोल्ड को बदलना।
- निर्णय उत्परिवर्तन – नियंत्रण कथनों में परिवर्तन किया जाता है, उदाहरण के लिए फ्लिप।ping एक संबंधपरक या किसी शर्त का निषेध करना।
टूल्स अपने ऑपरेटरों को इन तीन शीर्षकों के अंतर्गत समूहित करते हैं, इसलिए जीवित उत्परिवर्ती उत्पन्न करने वाला परिवार परीक्षक को बताता है कि किस प्रकार का अभिकथन अनुपस्थित है। एक जीवित निर्णय उत्परिवर्ती आमतौर पर एक अनपरीक्षित शाखा को चिह्नित करता है, जो इसके साथ ओवरलैप करती है। लूप परीक्षण.
उत्परिवर्तन परीक्षण का स्वचालन
म्यूटेशन टेस्टिंग को मैन्युअल रूप से करना बेहद समय लेने वाला और जटिल काम है, इसलिए ऑटोमेशन टूल्स का उपयोग करना बेहतर है, जिससे लागत भी कम होती है। म्यूटेशन टूल म्यूटेंट्स को संकलित करता है, रन शेड्यूल करता है, यह रिकॉर्ड करता है कि प्रत्येक असफल टेस्ट ने किस म्यूटेंट को नष्ट किया और स्कोर रिपोर्ट करता है।
उपलब्ध उपकरणों की सूची:
- स्ट्राइकर — एक ओपन-सोर्स म्यूटेशन टेस्टिंग फ्रेमवर्क जिसके विभिन्न संस्करण उपलब्ध हैं Javaस्क्रिप्ट और TypeScript (स्ट्राइकरजेएस), सी# और .नेट (स्ट्राइकर.नेट), और स्काला (स्ट्राइकर4एस)।
- गड्ढे, जिसे PITest भी लिखा जाता है — उत्परिवर्तन परीक्षण प्रणाली Java और जेवीएम जो संकलित बाइटकोड को परिवर्तित करता है और मेवन में प्लग इन करता है और Gradle साथ-साथ निर्माण करता है JUnit.
दोनों एक बिल्ड स्टेप के रूप में चलते हैं, इसलिए वे एक ही श्रेणी में आते हैं। निरंतर एकीकरण पाइपलाइन बाकी के रूप में स्वचालन परीक्षण पर।
उत्परिवर्तन स्कोर
उत्परिवर्तन स्कोर को कुल उत्परिवर्तियों में से मारे गए उत्परिवर्तियों के प्रतिशत के रूप में परिभाषित किया जाता है।
उत्परिवर्तन स्कोर = (मारे गए उत्परिवर्ती / उत्परिवर्ती की कुल संख्या) * 100
नीचे दिए गए सूत्र को उसी रूप में दिखाया गया है जिस रूप में अधिकांश उपकरण इसे रिपोर्ट करते हैं।
परीक्षण मामलों को उत्परिवर्तन के लिए पर्याप्त तब कहा जाता है जब स्कोर 100 प्रतिशत तक पहुँच जाता है। व्यवहार में, हर में यह शामिल नहीं होना चाहिए। समतुल्य उत्परिवर्ती — ऐसे उत्परिवर्ती जिनकी परिवर्तित संरचना मूल संरचना के समान ही व्यवहार करती है, इसलिए कोई भी परीक्षण उन्हें नष्ट नहीं कर सकता। अतः उपकरण नष्ट हुए उत्परिवर्ती की संख्या को नष्ट हुए और जीवित बचे गैर-समतुल्य उत्परिवर्ती की संख्या से विभाजित करके रिपोर्ट करते हैं, और परीक्षक को समतुल्य उत्परिवर्ती को चिह्नित करने की अनुमति देते हैं।
प्रायोगिक परिणामों से पता चला है कि उत्परिवर्तन परीक्षण, परीक्षण मामलों की उपयुक्तता मापने का एक प्रभावी तरीका है। इसकी मुख्य कमी उत्परिवर्तियों को उत्पन्न करने और प्रत्येक उत्परिवर्ती पर प्रत्येक परीक्षण मामले को निष्पादित करने की लागत है।
उत्परिवर्तन परीक्षण बनाम Code व्याप्ति
हाई परीक्षण कवरेज यह मजबूत परीक्षणों को साबित नहीं करता है। लाइन और ब्रांच कवरेज यह रिकॉर्ड करता है कि कौन से स्टेटमेंट चले, न कि यह कि बाद में कुछ सत्यापित हुआ या नहीं, इसलिए एक परीक्षण जो किसी मेथड को कॉल करता है और कुछ भी असर्ट नहीं करता है, उसे भी कवर्ड माना जाता है। म्यूटेशन टेस्टिंग इस कमी को दूर करता है, क्योंकि एक म्यूटेंट तभी समाप्त होता है जब कोई असर्शन वास्तव में विफल हो जाता है।
| पहलू | Code व्याप्ति | उत्परिवर्तन स्कोर |
| यह क्या मापता है | परीक्षणों ने किन पंक्तियों या शाखाओं को निष्पादित किया? | परीक्षणों में किन त्रुटियों का पता चला? |
| दावों के प्रति संवेदनशील | नहीं — शून्य अभिकथन वाला परीक्षण भी कवरेज बढ़ाता है | हाँ— उत्परिवर्ती तभी जीवित रहता है जब कोई भी अभिकथन विफल न हो। |
| दौड़ की लागत | एक यंत्रयुक्त परीक्षण संचालन | प्रत्येक जीवित उत्परिवर्ती के लिए एक परीक्षण रन, अब तक धीमा। |
| विशिष्ट उपयोग | प्रत्येक कमिट पर त्वरित गेट | महत्वपूर्ण मॉड्यूल पर समय-समय पर गहन जांच |
| विफल मोड | बिना किसी वास्तविक सत्यापन के 100 प्रतिशत कवरेज | समतुल्य उत्परिवर्ती जिन्हें कभी मारा नहीं जा सकता |
ये दोनों मेट्रिक्स एक दूसरे के पूरक हैं। कवरेज उस कोड को दर्शाता है जिस तक कभी नहीं पहुंचा गया; म्यूटेशन स्कोर उस कोड को दर्शाता है जिस तक पहुंचा गया लेकिन जिसकी कभी जांच नहीं की गई। दोनों एक ही स्रोत को डेटा प्रदान करते हैं। दोष प्रबंधन प्रक्रियाइसके साथ-साथ, निम्नलिखित जैसे उपायों के साथ-साथ दोष घनत्व.
उत्परिवर्तन परीक्षण के लाभ
उत्परिवर्तन परीक्षण के लाभ निम्नलिखित हैं:
- यह स्रोत प्रोग्राम की उच्च कवरेज प्राप्त करने का एक शक्तिशाली तरीका है।
- यह स्वयं टेस्ट सूट का परीक्षण करता है, जो कोई अन्य नहीं करता। सॉफ्टवेयर परीक्षण तकनीक सीधे तौर पर करता है।
- म्यूटेशन टेस्टिंग सॉफ्टवेयर डेवलपर को त्रुटि का पता लगाने में काफी मदद करती है।
- यह विधि सोर्स कोड में मौजूद अस्पष्टताओं को उजागर करती है और उन त्रुटियों को सामने लाने की क्षमता रखती है जिन तक सामान्य प्रक्रियाओं के दौरान कभी पहुंचा नहीं जा सकता।
- बचे हुए उत्परिवर्ती कार्रवाई योग्य हैं: उनमें से प्रत्येक एक विशिष्ट पंक्ति और एक विशिष्ट परिवर्तन का नाम बताता है जिसे सूट ने अनदेखा कर दिया था।
- इस परीक्षण से ग्राहकों को अधिक विश्वसनीय और स्थिर प्रणाली प्राप्त होने का लाभ मिलता है।
उत्परिवर्तन परीक्षण के नुकसान
दूसरी ओर, उत्परिवर्तन परीक्षण के निम्नलिखित नुकसान हैं:
- उत्परिवर्तन परीक्षण अत्यंत महंगा और समय लेने वाला होता है, क्योंकि इसमें बड़ी संख्या में उत्परिवर्ती प्रोग्राम उत्पन्न और संकलित करने की आवश्यकता होती है।
- चूंकि इसमें काफी समय लगता है, इसलिए यह कहना उचित होगा कि इस परीक्षण को स्वचालन उपकरण के बिना नहीं किया जा सकता है।
- प्रत्येक उत्परिवर्ती प्रोग्राम को मूल प्रोग्राम के समान संख्या में परीक्षण मामलों द्वारा परीक्षण किया जाता है, इसलिए उत्परिवर्ती प्रोग्रामों की एक बड़ी आबादी को संपूर्ण परीक्षण सूट के विरुद्ध चलाया जाना चाहिए।
- समतुल्य उत्परिवर्तियों को किसी भी परीक्षण से नष्ट नहीं किया जा सकता है, और उन्हें वास्तविक जीवित बचे लोगों से अलग करने के लिए आमतौर पर मैन्युअल समीक्षा की आवश्यकता होती है।
- क्योंकि यह विधि स्रोत कोड को बदल देती है, इसलिए यह लागू नहीं होती है। काली Box परीक्षण.
उत्परिवर्तन परीक्षण का उपयोग कब करें
ऊपर दिए गए लागत विवरण के अनुसार, म्यूटेशन टेस्टिंग को पूरे कोडबेस पर हर कमिट पर शायद ही कभी चलाया जाता है। यह तभी फायदेमंद साबित होता है जब किसी अनडिटेक्टेड फॉल्ट का नुकसान बहुत ज्यादा हो और टेस्ट किया जा रहा कोड इतना छोटा हो कि उसमें तेजी से बदलाव हो सकें।
- सुरक्षा संबंधी या वित्तीय तर्क भुगतान की गणना, कर नियम और प्राधिकरण जांच - इन सभी मामलों में एक गलत जवाब देना दुर्घटना से भी बदतर हो सकता है।
- संदिग्ध रूप से उच्च कवरेज वाले सुइट्स — जब कवरेज लगभग 100 प्रतिशत हो लेकिन फिर भी खामियां सामने आ जाएं।
- पुराने कोड को रिफैक्टर किया जा रहा है उत्परिवर्तन के परिणाम यह प्रकट करते हैं कि क्या मौजूदा परीक्षण प्रतिगमन का पता लगा पाएंगे।
- पुस्तकालय और साझा घटक — पुन: उपयोग में एक दोष अंग यह प्रत्येक कॉलर के लिए कई गुना बढ़ जाता है।
- अभ्यास करती टीमें परीक्षण संचालित विकास — स्कोर यह सुनिश्चित करता है कि पहले लिखे गए टेस्ट वास्तव में काम करते हैं।
आमतौर पर डिस्पोजेबल प्रोटोटाइप, पतले ग्लू या बिना ब्रांचिंग लॉजिक वाले जेनरेटेड कोड, या धीमी गति से चलने वाले कोड सूट पर काम करना उचित नहीं होता है। एकीकरण परीक्षण जिसमें पहले से ही एक बार में घंटों लग जाते हैं।
इसलिए अधिकांश टीमें रन को परिवर्तित फ़ाइलों तक सीमित रखती हैं, महत्वपूर्ण मॉड्यूल के लिए एक सीमा निर्धारित करती हैं, और व्यापक रन को चलने देती हैं। प्रतिगमन परीक्षण सुइट बाकी को ले जाता है सॉफ्टवेयर परीक्षण जीवन चक्र.



