म्यूटेशन टेस्टिंग

"उत्परिवर्तन विश्लेषण" यहाँ पुननिर्देशित करें। जैविक भाषा के लिए,जीन उत्परिवर्तन विश्लेषण देखें।

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

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

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

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

लक्ष्य
उत्परिवर्तन परीक्षण के लक्ष्य एकाधिक हैं:
 * कोड के कमजोर परीक्षण वाले टुकड़ों की पहचान करें (जिनके लिए उत्परिवर्ती नहीं मारे गए हैं) * कमजोर परीक्षणों की पहचान करें (जो उत्परिवर्ती को कभी नहीं मारते) * उत्परिवर्तन स्कोर की गणना करें, उत्परिवर्तन स्कोर मारे गए उत्परिवर्ती की संख्या/उत्परिवर्ती की कुल संख्या है।
 * कार्यक्रम में त्रुटि प्रसार और प्रसारित होने अवस्था के बारे में जानें।

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

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

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

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

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

उदाहरण के लिए, निम्नलिखित सी ++ कोड खंड पर विचार करें: यदि (a && b) { c = 1;

} अन्य { c = 0; }

अवस्था उत्परिवर्तन ऑपरेटर और निम्नलिखित उत्परिवर्त उत्पन्न करें: यदि (a || b) { c = 1; } अन्य {

c = 0;

}

अब, इस उत्परिवर्ती को मारने के परीक्षण के लिए, निम्नलिखित तीन शर्तें पूरी की जानी चाहिए:

1. परीक्षण उत्परिवर्तित कथन तक पहुंचना चाहिए।

2. टेस्ट इनपुट डेटा को उत्परिवर्ती और मूल प्रोग्राम के लिए अलग-अलग प्रोग्राम स्टेट्स बनाकर प्रोग्राम स्टेट को संक्रमित करना चाहिए। उदाहरण के लिए, के साथ एक परीक्षण  और   यह करेंगे।
 * 1) गलत कार्यक्रम स्थिति ('सी' का मान) कार्यक्रम के आउटपुट के लिए प्रचारित होना चाहिए और परीक्षण द्वारा जांच की जानी चाहिए।

इन स्थितियों को सामूहिक रूप से RIP मॉडल कहा जाता है।

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

हालांकि, ऐसे मामले हैं जहां एक परीक्षण मामला खोजना संभव नहीं है जो इस उत्परिवर्ती को मार सके। परिणामी कार्यक्रम व्यावहारिक रूप से मूल के बराबर है। ऐसे उत्परिवर्ती को समतुल्य उत्परिवर्ती कहा जाता है।

उत्परिवर्तन परीक्षण के व्यावहारिक उपयोग के लिए समतुल्य उत्परिवर्ती का पता लगाना सबसे बड़ी बाधाओं में से एक है। उत्परिवर्ती समकक्ष हैं या नहीं, यह जांचने के लिए आवश्यक प्रयास छोटे कार्यक्रमों के लिए भी बहुत अधिक हो सकते हैं। समतुल्य उत्परिवर्ती समस्या को दूर करने के लिए दृष्टिकोणों की एक विस्तृत श्रृंखला की एक व्यवस्थित साहित्य समीक्षा 17 प्रासंगिक तकनीकों (22 लेखों में) और तकनीकों की तीन श्रेणियों की पहचान की: पता लगाना (डीईएम); सुझाव (SEM); और समतुल्य उत्परिवर्ती पीढ़ी (AEMG) से बचना। प्रयोग ने संकेत दिया कि सामान्य रूप से हायर ऑर्डर  उत्परिवर्तन  और विशेष रूप से जूडीडिफऑप रणनीति समतुल्य उत्परिवर्ती समस्या के लिए एक आशाजनक दृष्टिकोण प्रदान करती है।

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

उत्परिवर्तन ऑपरेटर्स
शोधकर्ताओं द्वारा कई  उत्परिवर्तन  ऑपरेटरों का पता लगाया गया है। यहाँ अनिवार्य भाषाओं के लिए उत्परिवर्तन संचालकों के कुछ उदाहरण दिए गए हैं:

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

यह भी देखें

 * Bebugging (या फॉल्ट सीडिंग)
 * विवेक परीक्षण
 * दोष इंजेक्शन