Để thay đổi nhịp độ, tôi muốn ghi lại một chút nhật ký phát triển. Cách đây một thời gian, tôi đã tham gia một trò chơi jam và tạo ra trò chơi này – Of Mice and Bad Choices – một trò chơi giải đố ngắn, trong đó bạn đặt pho mát xung quanh mê cung để dụ lũ chuột ra ngoài. Nó rất vui, nhưng rõ ràng là có một số thiếu sót.
Một trong những nguyên nhân chính là hành vi của chuột không trực quan. Những người chơi đề cập rằng họ mong đợi những con chuột sẽ bị đẩy lùi bởi một loại pho mát không thích chứ không chỉ bị đóng băng. Ngoài ra, việc triển khai cơ chế này sẽ cho phép thiết kế câu đố phong phú hơn nhiều.
Vì vậy, tôi nghĩ đây là cơ hội tốt để có thể thực hiện thử nghiệm tự động trong Godot.
Có một số khung thử nghiệm có sẵn cho Godot 4, nhưng khung thử nghiệm khiến tôi chú ý nhất là Godot Unit Test (GUT) . GUT khá đơn giản:
test_
và viết một số xác nhận – cấu trúc kiểm thử đơn vị điển hình.
Đối với trường hợp cụ thể này, tôi muốn có cách xác định các kịch bản phức tạp, giống như cách tôi xác định cấp độ cho trò chơi – trong trình chỉnh sửa công cụ chứ không phải bằng mã (theo cách này, các bài kiểm tra sẽ gần với thực tế hơn). Do đó, tôi muốn làm những điều này:
Vì vậy, hãy mở gói này.
Hãy định nghĩa một lớp mới `MouseTestCase.` Chúng tôi muốn nó kế thừa Node2D
(vì chúng tôi muốn đặt nó trên một cảnh. Và chúng tôi muốn nó tìm thấy các phần tử con của nó (mà chúng tôi sẽ tự đặt trên một cảnh): một con chuột và vị trí cuối cùng dự kiến của nó (với tư cách là Người đánh dấu)
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)
Bây giờ, chúng ta có thể đưa nó vào một cảnh, và chúng ta đã ổn! Chúng tôi biết con chuột bắt đầu từ đâu, chúng tôi biết nó sẽ kết thúc ở đâu và bao nhiêu bước.
Bây giờ, hãy tạo thêm nhiều chúng nữa và tạo một bản đồ để kiểm tra hành vi xua đuổi của chúng ta.
Hành vi này hơi phức tạp, do đó, chúng tôi muốn đề cập đến nhiều trường hợp hơi khác nhau:
Bản đồ kết quả xác định 12 trường hợp thử nghiệm để bao gồm hành vi này được hiển thị ở trên (hãy tưởng tượng việc mã hóa cứng tất cả các tọa độ đó trong mã có thể tẻ nhạt đến mức nào).
Điều duy nhất còn lại phải làm là chức năng chạy thử. Chức năng này cần phải:
Mã này khá đơn giản.
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)
Tôi tưởng tượng điều này sẽ phát triển, nhưng việc triển khai hiện tại là đủ tốt. Tôi đã viết các bài kiểm tra, triển khai cơ chế và các bài kiểm tra thực sự xác nhận rằng cơ chế đó được triển khai chính xác!
Ở đây, tôi đã chỉ ra một cách để tiếp cận các bài kiểm tra trong trò chơi. Rõ ràng, còn nhiều điều cần cải thiện ở đây và tôi khuyến khích người đọc lấy mã cũng như khuôn khổ và điều chỉnh nó cho phù hợp với nhu cầu của họ.
Như mọi khi, mã có sẵn trên GitHub: https://github.com/d-lowl/of-mice-and-bad-choices Bạn cũng có thể xem PR cụ thể giới thiệu thử nghiệm. Đối với điểm thưởng, nếu ai đó có thể khiến chúng hoạt động trong CI thì điều đó thật tuyệt vời. Chúc mừng.