paint-brush
गोडोट में परीक्षण: मैं इसे व्यक्तिगत रूप से कैसे अपनाता हूंद्वारा@dlowl
725 रीडिंग
725 रीडिंग

गोडोट में परीक्षण: मैं इसे व्यक्तिगत रूप से कैसे अपनाता हूं

द्वारा D. Lowl4m2024/03/07
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

गोडोट यूनिट टेस्ट (जीयूटी) को एक क्लिक में एसेटलिब से इंस्टॉल किया जा सकता है। यह एक वर्ग प्रदान करता है जिसे हम अपनी परीक्षण स्क्रिप्ट के लिए विस्तारित कर सकते हैं। इसमें गोडोट के डिबगर का उपयोग करने और व्यक्तिगत परीक्षण चलाने की क्षमता वाला एक अच्छा यूआई है। इसे सीएलआई और सीआई से चलाया जा सकता है (लेकिन मैं इस पर बाद में विचार करूंगा)
featured image - गोडोट में परीक्षण: मैं इसे व्यक्तिगत रूप से कैसे अपनाता हूं
D. Lowl HackerNoon profile picture

गति में बदलाव के लिए, मैं थोड़ा सा डेव लॉग बनाना चाहूँगा। कुछ समय पहले, मैंने एक गेम जैम में भाग लिया था और इस गेम को बनाया था - चूहों और बुरे विकल्पों का - एक छोटा पहेली गेम, जहां आप चूहों को लुभाने के लिए भूलभुलैया के चारों ओर पनीर रखते हैं। यह मजेदार था, लेकिन जाहिर तौर पर इसमें कुछ कमियां भी थीं।


उनमें से एक प्रमुख यह है कि चूहों का व्यवहार सहज नहीं होता। खिलाड़ियों ने उल्लेख किया कि वे उम्मीद करेंगे कि चूहों को नापसंद पनीर से खदेड़ा जाएगा, न कि सिर्फ फ्रीज से। साथ ही, इस मैकेनिक को लागू करने से अधिक समृद्ध पहेली डिज़ाइन की अनुमति मिलेगी।


इसलिए, मुझे लगता है कि यह एक अच्छा अवसर है कि गोडोट में स्वचालित परीक्षण कैसे किया जा सकता है।

अपेक्षित व्यवहार का एक उदाहरण: चूहे को नीली चीज़ से दूर जाना चाहिए

परीक्षण उपकरण

कुछ परीक्षण ढाँचे हैं जो गोडोट 4 के लिए उपलब्ध हैं, लेकिन जिसने मेरी पकड़ बनाई वह गोडोट यूनिट टेस्ट (जीयूटी) है। GUT बहुत सरल है:


  • इसे AssetLib से एक क्लिक में इंस्टॉल किया जा सकता है।


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


  • इसमें गोडोट के डिबगर का उपयोग करने और व्यक्तिगत परीक्षण चलाने की क्षमता वाला एक अच्छा यूआई है।


  • इसे सीएलआई और सीआई से चलाया जा सकता है (लेकिन मैं इस पर बाद में विचार करूंगा)।

मेरा परीक्षण ढाँचा

इस विशेष मामले के लिए, मैं जटिल परिदृश्यों को परिभाषित करने का एक तरीका चाहता था, उसी तरह जैसे मैं खेल के लिए स्तरों को परिभाषित करता हूं - कोड के बजाय इंजन संपादक में (इस तरह, परीक्षण वास्तविकता के करीब होंगे)। इसलिए, मैं ये चीजें करना चाहता हूं:


  • एक एकल रनर फ़ंक्शन रखें जो मानचित्र लेता है और परीक्षण चलाता है।


  • मानचित्रों का एक संग्रह रखें, प्रत्येक में निष्पादित करने के लिए परिदृश्यों (परीक्षण मामलों) का एक सेट हो।


  • परीक्षण मामलों को ड्रैग-एन-ड्रॉप तरीके से परिभाषित करने का एक तरीका है: एक माउस रखें, और सेट करें कि इसे एन मोड़ में कहां होना चाहिए।


तो, आइए इसे खोलें।

टेस्ट केस परिभाषाएँ

आइए एक नए वर्ग 'माउसटेस्टकेस' को परिभाषित करें। हम चाहते हैं कि यह Node2D को इनहेरिट करे (जैसा कि हम इसे एक दृश्य पर रखना चाहते हैं। और हम चाहते हैं कि यह अपने बच्चों को ढूंढे (जिन्हें हम स्वयं एक दृश्य पर रखेंगे): एक माउस और इसकी अपेक्षित अंतिम स्थिति (एक मार्कर के रूप में)

 extends Node2D class_name MouseTestCase @export var steps_left = 0 # How many steps to simulate @export var done = false @onready var mouse: Mouse = $Mouse @onready var expected_position = SnapUtils.get_tile_map_position($TestMarker.position)


अब, हम इसे एक दृश्य पर रख सकते हैं, और हम अच्छे हैं! हम जानते हैं कि चूहा कहाँ से शुरू होता है, हम जानते हैं कि उसे कहाँ समाप्त होना चाहिए, और कितने चरणों में।

परीक्षण केस को परिभाषित करने के लिए एक नोड ट्री

यह मानचित्र पर इस तरह दिखता है: परीक्षण किया जाने वाला माउस हरे रंग में, लक्ष्य मार्कर लाल रंग में

मानचित्रों का परीक्षण करें

अब, आइए उनमें से कुछ और बनाएं, और हमारे विकर्षक व्यवहार का परीक्षण करने के लिए एक मानचित्र बनाएं।

'रिपेल' मैकेनिक परीक्षण के लिए परिणामी परीक्षण मानचित्र

यह व्यवहार कुछ हद तक जटिल है, इसलिए, हम कई अलग-अलग मामलों को कवर करना चाहते हैं:

  • एक चूहा नापसंद पनीर से दूर जाना चाहता है/


  • एक चूहा गति की दिशा बनाए रखना चाहता है (अर्थात, मोड़ों से बचता है)


  • एक चूहा बाएँ से दाएँ मुड़ना और U-टर्न पसंद करता है


इस व्यवहार को कवर करने के लिए 12 परीक्षण मामलों को परिभाषित करने वाला परिणामी मानचित्र ऊपर दिखाया गया है (कल्पना करें कि कोड में उन सभी निर्देशांकों को हार्ड कोड करना कितना कठिन हो सकता है)।

परीक्षण धावक

केवल टेस्ट रनर फ़ंक्शन ही करना बाकी है। फ़ंक्शन की आवश्यकता है:

  • वह मानचित्र लोड करें जिसे हमने ऊपर परिभाषित किया है।


  • जब तक सभी परीक्षण मामले पूरे नहीं हो जाते, गेम के चरणों को आगे बढ़ाएं।


  • प्रत्येक चरण पर, सभी परीक्षण मामलों पर पुनरावृत्ति करें, और यदि वे हो गए हैं, तो जांचें कि अपेक्षित स्थिति तक पहुंच गया है या नहीं।


कोड काफी सरल है.

 func run_level_with_mouse_test_cases(map_path: String): var level = load(map_path) map.load_level(level) var cases = MouseTestCase.cast_all_cases(get_tree().get_nodes_in_group(MouseTestCase.MTC_GROUP_NAME)) while (cases.any(func(case): return not case.done)): map.move_mice() for case in cases: if not case.done: case.steps_left -= 1 if case.steps_left == 0: case.done = true assert_eq(case.get_mouse_position(), case.expected_position, case.get_parent().name+"/"+case.name)

मुझे लगता है कि यह विकसित होगा, लेकिन वर्तमान कार्यान्वयन अभी के लिए काफी अच्छा है। मैंने परीक्षण लिखे हैं, मैकेनिक लागू किया है, और परीक्षण वास्तव में पुष्टि करते हैं कि मैकेनिक सही ढंग से लागू किया गया है!

GUT का फलक सफल परीक्षण दिखा रहा है

चर्चाएँ

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


हमेशा की तरह, कोड GitHub पर उपलब्ध है: https://github.com/d-lowl/of-mice-and- Bad-choices आप उस विशिष्ट पीआर पर भी नज़र डाल सकते हैं जो परीक्षण पेश करता है। बोनस अंकों के लिए, यदि कोई उन्हें सीआई में काम करवा सके, तो यह शानदार होगा। प्रोत्साहित करना।