- Meta ने फ़रवरी में प्रकाशित पेपर "Automated Unit Test Improvement using Large Language Models at Meta" में TestGen-LLM नामक टूल पेश किया था
- इस टूल का उद्देश्य पूरी तरह स्वचालित तरीके से test coverage बढ़ाना है, और यह मौजूदा codebase की तुलना में सुधार सुनिश्चित करता है
- Meta ने TestGen-LLM का कोड सार्वजनिक नहीं किया, इसलिए इसे open source Cover Agent के एक हिस्से के रूप में सीधे इम्प्लीमेंट करने का निर्णय लिया गया
- यहाँ इम्प्लीमेंटेशन प्रक्रिया, मिली जानकारियाँ, और वास्तविक codebase में TestGen-LLM का उपयोग करते समय सामने आई समस्याएँ साझा की गई हैं
स्वचालित test generation का मानदंड
- generative AI का उपयोग करके स्वचालित test generation कोई नई बात नहीं है
- अधिकांश LLM code generation में दक्ष हैं और test generation भी कर सकते हैं
- जब डेवलपर LLM से test generate कराते हैं, तो सबसे आम समस्या यह होती है कि generated tests में से अधिकतर या तो काम नहीं करते या कोई खास मूल्य नहीं जोड़ते
- इसे दूर करने के लिए TestGen-LLM के लेखकों ने regression unit tests के लिए निम्न मानदंड सुझाए:
- क्या test सही तरह compile और run होता है?
- क्या test code coverage बढ़ाता है?
- यदि इन दो बुनियादी प्रश्नों का उत्तर नहीं मिलता, तो LLM द्वारा दिए गए generated tests को स्वीकारने या विश्लेषण करने का कोई कारण नहीं है
- यदि ये प्रश्न पास हो जाते हैं, तो उसके बाद manual review किया जाता है
- test कितना अच्छी तरह लिखा गया है?
- यह वास्तव में कितना मूल्य जोड़ सकता है?
- क्या यह अतिरिक्त आवश्यकताओं को पूरा करता है?
TestGen-LLM का approach और रिपोर्ट किए गए परिणाम
- TestGen-LLM (और Cover-Agent) पूरी तरह headless तरीके से चलता है
- पहले बहुत सारे tests generate किए जाते हैं, फिर जो build/run नहीं होते उन्हें फ़िल्टर किया जाता है, जो pass नहीं होते उन्हें हटा दिया जाता है, और जो code coverage नहीं बढ़ाते उन्हें भी त्याग दिया जाता है
- बहुत नियंत्रित परिस्थितियों में generated tests बनाम सभी चरण पार करने वाले tests का अनुपात 1:4 था, जबकि वास्तविक परिदृश्यों में Meta के लेखकों ने 1:20 का अनुपात रिपोर्ट किया
- automated process के बाद Meta मानव reviewer से tests को स्वीकार या अस्वीकार कराता है
- पेपर के लेखकों के अनुसार, सर्वोत्तम स्थिति में 73% acceptance rate के साथ औसतन 1:2 acceptance ratio देखा गया
- पेपर में बताए अनुसार, TestGen-LLM टूल हर run में एक single test generate करता है, जिसे विशेषज्ञ डेवलपर द्वारा पहले से लिखे गए मौजूदा test suite में जोड़ा जाता है
- साथ ही, यह किसी दिए गए test suite के लिए test generate करना अनिवार्य रूप से सुनिश्चित नहीं करता
Cover-Agent इम्प्लीमेंटेशन
- Cover-Agent v0.1 को इस प्रकार इम्प्लीमेंट किया गया:
- user input लेना (test किए जाने वाले source file, सुधारने के लिए मौजूदा test suite, coverage report, test suite build और run command, code coverage लक्ष्य और अधिकतम iteration count, अतिरिक्त context और prompt options)
- उसी style में और अधिक tests generate करना
- runtime environment का उपयोग करके उन tests को verify करना (क्या वे build होते हैं और pass करते हैं)
- code coverage increase जैसे metrics की समीक्षा करके देखना कि test मूल्य जोड़ता है या नहीं
- मौजूदा test suite और coverage report को update करना
- code के मानदंड तक पहुँचने तक दोहराना (code coverage threshold पूरा होना या maximum iterations तक पहुँचना)
TestGen-LLM को इम्प्लीमेंट और समीक्षा करते समय सामने आई समस्याएँ
- पेपर में दिए गए उदाहरणों में Kotlin का उपयोग test लिखने के लिए किया गया है, जहाँ whitespace महत्वपूर्ण नहीं है
- दूसरी ओर Python जैसी भाषाओं में tabs और spaces न केवल महत्वपूर्ण हैं, बल्कि parsing engine के लिए आवश्यक भी हैं
- GPT 3.5 जैसे कम परिष्कृत models, स्पष्ट prompt देने पर भी, लगातार सही indentation वाला code वापस नहीं करते
- इसका एक उदाहरण Python में लिखी test class है, जहाँ हर test function को indented होना चाहिए
- इसे पूरे development lifecycle में ध्यान में रखना पड़ा, और preprocessing library के आसपास अधिक जटिलता जोड़नी पड़ी
- ऐसे scenarios में Cover-Agent को मज़बूत बनाने के लिए अभी भी बहुत सुधार की गुंजाइश है
- Cover-Agent flow के हिस्से के रूप में users को LLM को अतिरिक्त input या निर्देश देने की सुविधा जोड़ी गई (
--additional-instructions option)
- इससे डेवलपर project-specific अतिरिक्त जानकारी देकर Cover-Agent को customize कर सकते हैं
- उदाहरण के लिए, इन निर्देशों का उपयोग करके Cover-Agent को meaningful edge cases वाले समृद्ध test set बनाने के लिए निर्देशित किया जा सकता है
- AI-आधारित applications में Retrieval-Augmented Generation(RAG) के अधिक व्यापक होने की सामान्य प्रवृत्ति से सहमत होते हुए, यह पुष्टि हुई कि unit test generation के साथ अधिक context होने से higher-quality tests और higher pass rate संभव होते हैं
- test generation process को बेहतर बनाने के लिए, LLM के लिए context के रूप में अतिरिक्त libraries या text-based design documents को manually जोड़ना चाहने वाले users के लिए
--included-files option दिया गया
- कई iterations की आवश्यकता वाले जटिल code, LLM के लिए एक और चुनौती पेश करते हैं
- जैसे-जैसे failed (या मूल्य न जोड़ने वाले) tests generate होते गए, बाद की iterations में वही अस्वीकृत tests बार-बार सुझाए जाने का pattern दिखने लगा
- इसे हल करने के लिए prompt में "failed tests" section जोड़ा गया, ताकि वह feedback LLM तक पहुँचे और वह unique tests generate करे तथा जिन tests को उपयोग योग्य नहीं माना गया है (यानी टूटे हुए या coverage increase कम होने वाले) उन्हें कभी दोहराए नहीं
- मौजूदा test suite का विस्तार करते समय library imports न जोड़ पाने की समस्या भी पूरे process में सामने आई एक और चुनौती थी
- डेवलपर test generation process में कभी-कभी testing framework के प्रति केवल एक ही approach अपनाने में अल्पदृष्टि वाले हो सकते हैं
- कई अलग-अलग mocking frameworks के अलावा, अन्य libraries भी test coverage हासिल करने में मदद कर सकती हैं
- TestGen-LLM पेपर (और Cover-Agent) का उद्देश्य मौजूदा test suite का विस्तार करना है, इसलिए पूरी test class को पूरी तरह पुनर्गठित करना इसके दायरे से बाहर है
- यह test generation की तुलना में test extension की एक सीमा है, और इसे भविष्य की iterations में हल करने की योजना है
- यह अलग पहचानना महत्वपूर्ण है कि TestGen-LLM के approach में हर test के लिए अगला test सुझाए जाने से पहले डेवलपर की manual review आवश्यक होती है
- इसके विपरीत, Cover-Agent में coverage requirements पूरी होने तक (या maximum iterations पर रुकने तक) प्रक्रिया के दौरान manual intervention के बिना यथासंभव अधिक tests generate, verify और propose किए जाते हैं
- इससे AI का उपयोग करते हुए background में चलने वाला ऐसा कम-विघ्नकारी automated test generation approach बनता है, जिसमें डेवलपर process पूरा होने के बाद पूरे test suite की एक बार समीक्षा कर सकता है
निष्कर्ष और आगे की योजना
- बहुत से लोग (मेरे सहित) TestGen-LLM पेपर और टूल को लेकर उत्साहित हैं, लेकिन इस पोस्ट में उसकी सीमाओं पर चर्चा की गई है
- हमारा अब भी मानना है कि हम पूरी तरह automated workflow चलाने वाले AI टीममेट के युग में नहीं, बल्कि AI assistant के युग में हैं
- साथ ही, अच्छी तरह डिज़ाइन किया गया flow डेवलपर्स को अपने आप test candidates generate करने और बहुत कम समय में code coverage बढ़ाने में मदद कर सकता है, और यही Cover-Agent में विकसित और साझा करने की योजना है
- test generation domain से जुड़े state-of-the-art तरीकों को लगातार विकसित कर Cover-Agent open source repository में एकीकृत किया जाएगा
- आशा है कि testing के लिए generative AI में रुचि रखने वाला हर व्यक्ति सहयोग करेगा और Cover Agent की क्षमताएँ बढ़ाने में मदद करेगा, और यह open source टूल शोधकर्ताओं को नई test generation techniques खोजने के लिए प्रेरित करेगा
- GitHub के open source Cover-Agent repository में development roadmap जोड़ा गया है, और roadmap के अनुसार या अपनी स्वयं की ideas के आधार पर repository में योगदान देखने की इच्छा है
- Cover-Agent का vision यह है कि भविष्य में यह सभी pre/post-pull requests पर अपने आप चले, और काम करने वाले तथा code coverage बढ़ाने वाले validated regression test improvements को स्वचालित रूप से propose करे
- कल्पना कीजिए कि Cover-Agent अपने आप codebase scan करे और test suite के साथ PR खोले
- AI का उपयोग करके उन कामों को और अधिक कुशलता से करें जो हमें पसंद नहीं हैं!
अभी कोई टिप्पणी नहीं है.