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

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

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

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

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

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

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

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

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

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

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

उदाहरण के लिए, निम्नलिखित सी ++ कोड खंड पर विचार करें: <वाक्यविन्यास लैंग = सीपीपी> अगर (ए && बी) { सी = 1; } अन्य { सी = 0; } 

हालत म्यूटेशन ऑपरेटर बदलेगा  साथ   और निम्नलिखित उत्परिवर्त उत्पन्न करें: <वाक्यविन्यास लैंग = सीपीपी> अगर (ए || बी) { सी = 1; } अन्य { सी = 0; } 

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

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

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

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

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

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

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

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

यह भी देखें

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