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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

यह भी देखें

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