गेम इंजन में इकाई परीक्षण कैसे करता है?


23

मेरी बहुत शर्म की बात है, मैंने कभी भी एक उचित इकाई परीक्षण नहीं लिखा है, केवल छोटे असंगठित परीक्षण कार्यक्रम जिन्हें मैं परीक्षण के सफल होने के बाद फिर से निपटान करूंगा। मुझे वास्तव में इस बात का स्पष्ट पता नहीं है कि गेम प्रोजेक्ट में यूनिट परीक्षण कैसे किया जाना चाहिए। (मेरी भाषा C ++ है।)

क्या मुझे अपने इंजन में प्रत्येक सबसिस्टम के लिए एक अलग परियोजना और इसके साथ एक संबद्ध परीक्षण करना चाहिए, और फिर एक बड़ी परियोजना / समाधान है जो वास्तविक इंजन का निर्माण करता है? उदाहरण के लिए कहें तो eventमेरे इंजन में मॉड्यूल है; मुझे कैसे संभालना चाहिए?


दिलचस्प सवाल, जब आप इंजन विकसित करते हैं, तो कार्यक्षमता का परीक्षण करना बहुत आसान है, लेकिन गेम टेस्ट में बड़ी परियोजना के बारे में क्या?
येवैन

2
शर्म की बात नहीं है: इकाई-परीक्षण स्वचालित रूप से एक अच्छी बात नहीं है।
ओ ० '।

1
यदि आपने कभी यूनिट परीक्षणों का उपयोग करने की कोशिश नहीं की है, तो यह निश्चित रूप से शर्म की बात है।
क्रिस्टोफर जॉनसन

जवाबों:


18

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

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

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

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

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

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


3
If you have to [...] spend significantly more time writing the tests [...] than it took you to author the module... तब आपका मॉड्यूल बहुत जटिल है। अब इसे सरल करें, आप भविष्य में खुद को धन्यवाद देंगे!
जेस टेल्फोर्ड

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

@ क्रोध - सहमत। क्या उचित है और क्या नहीं, इसका एक स्लाइडिंग पैमाना है। इन सभी प्रकार के उत्तरों के साथ, एक आकार सभी फिट नहीं होता है :)
जेस टेलफ़ोर्ड

UnitTest ++ के लिए github.com/unittest-cpp/unittest-cpp पर जाएं । बाकी सब कुछ पुराना है।
मार्कस


4

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.