On the Effectiveness of Modular Testing with EvoSuite
यह शोध पत्र \textsc{emote} को प्रस्तुत करता है, जो EvoSuite टेस्ट जनरेटर का एक संवर्धन है जो गैर-लक्ष्य सेटअप कॉल्स पर प्रतिबंधों को शिथिल करके और फिटनेस फ़ंक्शन को परिष्कृत करके जावा प्रोग्रामों के लिए मॉड्यूलर टेस्टिंग प्रभावशीलता में सुधार करता है, जिसके परिणामस्वरूप लक्ष्य विधियों (target methods) के लिए ब्रांच कवरेज में 15.15% की वृद्धि होती है।
मूल पेपर CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) के तहत लाइसेंस किया गया है। नीचे दिए गए पेपर की यह व्याख्या AI से तैयार की गई है। इसे लेखकों ने न तो लिखा है, न इसका समर्थन किया है। तकनीकी सटीकता के लिए मूल पेपर देखें। पूरा डिस्क्लेमर पढ़ें
कल्पना कीजिए कि आप एक जटिल मशीन के एक विशिष्ट भाग, जैसे कि वेंडिंग मशीन के "पॉप" बटन का परीक्षण करने की कोशिश कर रहे हैं। यह देखने के लिए कि क्या वह बटन सही ढंग से काम करता है, आपको पहले मशीन के अंदर सोडा कैन रखना होगा। यदि आप खाली मशीन पर "पॉप" बटन का परीक्षण करने का प्रयास करते हैं, तो यह विफल हो जाएगा या कुछ भी नहीं करेगा, और आप यह नहीं सीख पाएंगे कि बटन को वास्तव में कैसे काम करना चाहिए।
यह वह मुख्य समस्या है जिसे एक टूल EvoSuite के माध्यम से संबोधित किया गया है।
समस्या: शून्य में परीक्षण (Testing in a Vacuum)
EvoSuite एक स्वचालित रोबोट है जिसे जावा कंप्यूटर प्रोग्रामों के लिए टेस्ट लिखने के लिए डिज़ाइन किया गया है। यह एक "जेनेटिक एल्गोरिदम" का उपयोग करता है, जो एक डिजिटल विकास प्रक्रिया (evolution process) की तरह है: यह हजारों यादृच्छिक (random) परीक्षण परिदृश्य बनाता है, देखता है कि कौन से सबसे अच्छा काम करते हैं, और बेहतर बनाने के लिए उन्हें आपस में मिलाता है।
हालाँकि, जब शोधकर्ताओं ने EvoSuite को केवल एक विशिष्ट विधि (एक सिंगल फंक्शन) को अलग से टेस्ट करने के लिए कहा, तो वे एक दीवार से टकरा गए। रोबोट को एक सख्त नियम दिया गया था: "आप केवल ऑब्जेक्ट बना सकते हैं और फिर तुरंत लक्षित बटन दबा सकते हैं। आपको इससे पहले कुछ भी अन्य करने से मना किया जाता है।"
उपमा (Analogy):
कल्पना कीजिए कि एक शेफ (EvoSuite) एक विशिष्ट रेसिपी स्टेप (लक्ष्य विधि) को टेस्ट करने की कोशिश कर रहा है। शेफ को कहा गया है, "आप केवल पैन को स्टोव पर रख सकते हैं और पैनकेक को पलट सकते हैं। आप इससे पहले तेल नहीं डाल सकते, अंडे नहीं फोड़ सकते, या पहले गर्मी (heat) चालू नहीं कर सकते।"
- परिणाम: पैनकेक जल जाता है या पैन में चिपक जाता है। टेस्ट विफल हो जाता है, इसलिए नहीं कि पलटने की तकनीक खराब है, बल्कि इसलिए क्योंकि शेफ को पहले पैन तैयार करने की अनुमति नहीं दी गई थी।
- वास्तविक दुनिया का प्रभाव: पेपर के उदाहरण में, एक विधि जिसका नाम
checkConsistencyहै, हमेशा विफल हो जाएगी क्योंकि रोबट को (नाम या प्रकार जैसी) आवश्यक डेटा सेट करने की अनुमति नहीं दी गई थी। रोबोट बार-बार खाली, टूटे हुए ऑब्जेक्ट्स का परीक्षण करता रहा।
समाधान: "emote"
लेखिका, एलिजाबेथ डिनेला ने इस टूल का एक नया संस्करण बनाया जिसे emote (Effective Modular Testing with EvoSuite) कहा जाता है।
क्या बदला?
- नियमों में ढील दी गई: emote रोबोट को बताता है, "आप सेटअप स्टेप्स का उपयोग कर सकते हैं।" ठीक वैसे ही जैसे एक डेवलपर मैन्युअल रूप से टेस्ट लिखता है, रोबोट को अब लक्ष्य को चलाने से पहले ऑब्जेक्ट को एक कार्यशील स्थिति में लाने के लिए हेल्पर मेथड्स (जैसे
setNameयाsetType) को कॉल करने की अनुमति है। - "फज़ ड्राइवर" (Fuzz Driver) की प्रेरणा: पेपर नोट करता है कि मानव डेवलपर्स पहले से ही ऐसा करते हैं। वे मुख्य कार्य से पहले मंच तैयार करने के लिए "फज़ ड्राइवर्स" (टेस्ट स्क्रिप्ट) लिखते हैं। emote बस इसी मानवीय अंतर्ज्ञान (intuition) को स्वचालित करता है।
ट्विस्ट: "चीटिंग" से बचना
एक पेच था। यदि आप रोबोट को कोई भी सेटअप मेथड उपयोग करने देते हैं, तो वह एक शॉर्टकट ढूंढ सकता है।
उपमा (Analogy):
कल्पना कीजिए कि आप यह टेस्ट करना चाहते हैं कि एक विशिष्ट दरवाजे का लॉक काम करता है या नहीं।
- चीटिंग: रोबोट बाहर से दरवाजा खोलने के लिए एक मास्टर की (master key) ढूंढ लेता है, या वह एक साइड डोर ढूंढ लेता है जो उसी कमरे तक ले जाता है। वह दावा करता है, "मैंने दरवाजा खोल दिया!" लेकिन उसने वास्तव में उस विशिष्ट लॉक का परीक्षण नहीं किया जिसे आपको जांचना था।
- समाधान: शोधकर्ताओं ने रोबलेट के "स्कोरकार्ड" (फिटनेस फंक्शन) में बदलाव किया। अब, रोबोट को कोड के हिस्सों को कवर करने के लिए तभी अंक मिलते हैं जब पथ (path) सीधे लक्षित विधि से शुरू होता है। यदि कोई हेल्पर मेथड गलती से लक्षित कोड को ट्रिगर करता है, तो वे अंक नहीं गिने जाते। यह रोबोट को वास्तव में उस विशिष्ट बटन को दबाने के लिए मजबूर करता है जिसे उसे टेस्ट करने के लिए सौंपा गया है।
परिणाम
टीम ने वास्तविक दुनिया के जावा प्रोजेक्ट्स (जिन्हें SF100 कहा जाता है) के संग्रह पर इस नए दृष्टिकोण का परीक्षण किया।
- परिणाम: रोबोट को सही ढंग से स्टेज सेट करने की अनुमति देकर, उनके टेस्ट बहुत अधिक प्रभावी हो गए।
- आंकड़े: नए टूल, emote ने लक्षित विधियों के कवरेज को 15.15% तक सुधार दिया। कुछ प्रोजेक्ट्स में, यह लगभग कुछ भी कवर न करने से लेकर 100% संभावित पथों को कवर करने तक पहुँच गया।
- यह क्यों मायने रखता है: इसने साबित कर दिया कि मूल सख्त नियम रोबोट को पीछे खींच रहे थे। इसे अधिक मानव डेवलपर की तरह कार्य करने की अनुमति देकर (पहले स्थिति/स्टेट सेट करना), यह अधिक बग ढूंढ सकता है और कोड को बहुत बेहतर ढंग से सत्यापित कर सकता है।
सारांश
पेपर तर्क देता है कि स्वचालित परीक्षण उपकरणों को इतने कठोर नहीं होना चाहिए कि वे आवश्यक "तैयारी" के चरणों को रोक दें। परीक्षण रोबोट को मुख्य कार्यक्रम से पहले दृश्य सेट करने की अनुमति देकर—और यह सुनिश्चित करके कि वह अप्रत्यक्ष रूप से लक्ष्य तक पहुँचकर "चीट" न करे—टूल अपने काम में काफी बेहतर हो जाता है।
अपने क्षेत्र के पेपरों की भीड़ में उलझे हुए हैं?
आपके रिसर्च कीवर्ड से मेल खाने वाले सबसे नए और अलग सोच वाले पेपरों का रोज़ाना Digest पाएँ—तकनीकी सारांश के साथ, आपकी भाषा में।