paint-brush
গডট-এ পরীক্ষা: আমি ব্যক্তিগতভাবে এটিকে কীভাবে গ্রহণ করিদ্বারা@dlowl
725 পড়া
725 পড়া

গডট-এ পরীক্ষা: আমি ব্যক্তিগতভাবে এটিকে কীভাবে গ্রহণ করি

দ্বারা D. Lowl4m2024/03/07
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

এক ক্লিকে AssetLib থেকে Godot Unit Test (GUT) ইনস্টল করা যাবে। এটি একটি ক্লাস প্রদান করে যা আমরা আমাদের পরীক্ষার স্ক্রিপ্টগুলির জন্য প্রসারিত করতে পারি। গডটের ডিবাগার ব্যবহার করার এবং স্বতন্ত্র পরীক্ষা চালানোর ক্ষমতা সহ এটির একটি চমৎকার UI রয়েছে। এটি CLI থেকে এবং CI তে চালানো যেতে পারে (তবে আমি পরে এটি মোকাবেলা করব)
featured image - গডট-এ পরীক্ষা: আমি ব্যক্তিগতভাবে এটিকে কীভাবে গ্রহণ করি
D. Lowl HackerNoon profile picture

গতি পরিবর্তনের জন্য, আমি কিছুটা ডেভ লগ করতে চাই। কিছু সময় আগে, আমি একটি গেম জ্যামে অংশ নিয়েছিলাম এবং এই গেমটি তৈরি করেছি – অফ মাইস অ্যান্ড ব্যাড চয়েস – একটি ছোট ধাঁধা খেলা, যেখানে আপনি ইঁদুরগুলিকে প্রলুব্ধ করার জন্য গোলকধাঁধার চারপাশে পনির রাখুন। এটা মজার ছিল, কিন্তু স্পষ্টতই কিছু ত্রুটি ছিল.


অন্যতম প্রধান হল ইঁদুরের আচরণ অজ্ঞাত। খেলোয়াড়রা উল্লেখ করেছে যে তারা আশা করবে ইঁদুরগুলিকে একটি অপছন্দনীয় পনির দ্বারা তাড়ানো হবে, শুধু হিমায়িত নয়। এছাড়াও, এই মেকানিকটি বাস্তবায়ন করলে অনেক বেশি সমৃদ্ধ ধাঁধা ডিজাইনের জন্য অনুমতি দেবে।


সুতরাং, আমি মনে করি এটি একটি ভাল সুযোগ কিভাবে গডোতে স্বয়ংক্রিয় পরীক্ষা করা যায়।

একটি প্রত্যাশিত আচরণের একটি দৃষ্টান্ত: মাউসকে নীল পনির থেকে দূরে সরানো উচিত

টেস্টিং টুল

কিছু টেস্টিং ফ্রেমওয়ার্ক আছে যা Godot 4 এর জন্য উপলব্ধ, কিন্তু যেটি আমার I ধরল তা হল Godot Unit Test (GUT) । GUT বেশ সহজ:


  • এটি এক ক্লিকে AssetLib থেকে ইনস্টল করা যেতে পারে।


  • এটি একটি ক্লাস প্রদান করে যা আমরা আমাদের পরীক্ষার স্ক্রিপ্টগুলির জন্য প্রসারিত করতে পারি: শুধুমাত্র test_ দিয়ে শুরু করে ফাংশন যোগ করুন এবং কিছু দাবী লিখুন - সাধারণ ইউনিট পরীক্ষার কাঠামো।


  • গডটের ডিবাগার ব্যবহার করার এবং স্বতন্ত্র পরীক্ষা চালানোর ক্ষমতা সহ এটির একটি চমৎকার UI রয়েছে।


  • এটি CLI থেকে এবং CI তে চালানো যেতে পারে (তবে আমি পরে এটি মোকাবেলা করব)।

আমার টেস্টিং ফ্রেমওয়ার্ক

এই বিশেষ ক্ষেত্রে, আমি জটিল পরিস্থিতি সংজ্ঞায়িত করার একটি উপায় চাই, একইভাবে আমি গেমের জন্য স্তরগুলিকে সংজ্ঞায়িত করি - কোডের পরিবর্তে ইঞ্জিন সম্পাদকে (এইভাবে, পরীক্ষাগুলি বাস্তবতার কাছাকাছি হবে)। অতএব, আমি এই জিনিসগুলি করতে চাই:


  • একটি একক রানার ফাংশন আছে যা একটি মানচিত্র নেয় এবং পরীক্ষা চালায়।


  • মানচিত্রের একটি সংগ্রহ রাখুন, প্রতিটিতে কার্যকর করার জন্য পরিস্থিতির (টেস্ট কেস) সেট রয়েছে।


  • একটি ড্র্যাগ-এন-ড্রপ পদ্ধতিতে পরীক্ষার ক্ষেত্রে সংজ্ঞায়িত করার একটি উপায় আছে: একটি মাউস রাখুন, এবং N মোড়ের মধ্যে এটি কোথায় থাকা উচিত তা সেট করুন।


সুতরাং, এর এই unwrap করা যাক.

টেস্ট কেস সংজ্ঞা

আসুন একটি নতুন শ্রেণী `মাউসটেস্টকেস` সংজ্ঞায়িত করি। আমরা এটিকে 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)


এখন, আমরা এটি একটি দৃশ্যে রাখতে পারি, এবং আমরা ভাল! আমরা জানি একটি মাউস কোথায় শুরু হয়, আমরা জানি এটি কোথায় শেষ হওয়া উচিত এবং কত ধাপে।

একটি পরীক্ষার ক্ষেত্রে সংজ্ঞায়িত করার জন্য একটি নোড ট্রি

ম্যাপে এটি এইভাবে দেখায়: মাউসটি সবুজ রঙে পরীক্ষা করা হবে, লক্ষ্য চিহ্নিতকারী লাল রঙে

পরীক্ষা মানচিত্র

এখন, আসুন সেগুলির আরও একটি গুচ্ছ তৈরি করি এবং আমাদের প্রতিরোধক আচরণ পরীক্ষা করার জন্য একটি মানচিত্র তৈরি করি।

মেকানিক পরীক্ষার জন্য 'বিকর্ষিত' পরীক্ষার মানচিত্র

এই আচরণটি কিছুটা জটিল, তাই, আমরা অনেকগুলি সামান্য ভিন্ন ক্ষেত্রে কভার করতে চাই:

  • একটি ইঁদুর অপছন্দের পনির থেকে দূরে সরে যেতে চায়/


  • একটি ইঁদুর চলাচলের দিক ধরে রাখতে চায় (অর্থাৎ, বাঁক এড়িয়ে যায়)


  • একটি মাউস বাম দিকে ডানে বাঁক এবং ইউ-টার্ন পছন্দ করে


এই আচরণটি কভার করার জন্য 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 আপনি নির্দিষ্ট পিআরও দেখতে পারেন যা পরীক্ষার প্রবর্তন করে। বোনাস পয়েন্টের জন্য, কেউ যদি তাদের CI-এ কাজ করতে পারে, তাহলে সেটা হবে দারুণ। চিয়ার্স।