paint-brush
Thử nghiệm ở Godot: Cá nhân tôi tiếp cận nó như thế nàotừ tác giả@dlowl
603 lượt đọc
603 lượt đọc

Thử nghiệm ở Godot: Cá nhân tôi tiếp cận nó như thế nào

từ tác giả D. Lowl4m2024/03/07
Read on Terminal Reader

dài quá đọc không nổi

Godot Unit Test (GUT) có thể được cài đặt từ AssetLib chỉ bằng một cú nhấp chuột. Nó cung cấp một lớp mà chúng tôi có thể mở rộng cho các tập lệnh thử nghiệm của mình. Nó có giao diện người dùng đẹp mắt với khả năng sử dụng trình gỡ lỗi của Godot và chạy các thử nghiệm riêng lẻ. Nó có thể được chạy từ CLI và trong CI (nhưng tôi sẽ giải quyết vấn đề này sau)
featured image - Thử nghiệm ở Godot: Cá nhân tôi tiếp cận nó như thế nào
D. Lowl HackerNoon profile picture

Để 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.

Hình minh họa về hành vi được mong đợi: con chuột phải tránh xa pho mát xanh

Công cụ kiểm tra

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:


  • Nó có thể được cài đặt từ AssetLib chỉ bằng một cú nhấp chuột.


  • Nó cung cấp một lớp mà chúng ta có thể mở rộng cho các tập lệnh kiểm thử của mình: chỉ cần thêm các hàm bắt đầu bằng test_ và viết một số xác nhận – cấu trúc kiểm thử đơn vị điển hình.


  • Nó có giao diện người dùng đẹp mắt với khả năng sử dụng trình gỡ lỗi của Godot và chạy các thử nghiệm riêng lẻ.


  • Nó có thể được chạy từ CLI và trong CI (nhưng tôi sẽ giải quyết vấn đề này sau).

Khung thử nghiệm của tôi

Đố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:


  • Có chức năng chạy đơn để đưa bản đồ vào và chạy thử nghiệm.


  • Có một bộ sưu tập các bản đồ, mỗi bản đồ có một tập hợp các kịch bản (trường hợp thử nghiệm) để thực thi.


  • Có cách xác định các trường hợp kiểm thử theo cách kéo và thả: đặt chuột và đặt vị trí của nó trong N lượt.


Vì vậy, hãy mở gói này.

Định nghĩa trường hợp kiểm thử

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.

Cây nút để xác định trường hợp thử nghiệm

Đây là giao diện trên bản đồ: chuột được kiểm tra có màu xanh lá cây, điểm đánh dấu mục tiêu có màu đỏ

Bản đồ thử nghiệm

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.

Bản đồ thử nghiệm kết quả cho thử nghiệm cơ học 'đẩy lùi'

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:

  • Một con chuột muốn tránh xa miếng pho mát không thích/


  • Một con chuột muốn giữ hướng di chuyển (tức là tránh rẽ)


  • Chuột thích rẽ trái hơn phải và quay đầu


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).

Người chạy thử

Đ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:

  • Tải bản đồ chúng tôi đã xác định ở trên.


  • Mô phỏng các bước của trò chơi về phía trước cho đến khi tất cả các trường hợp thử nghiệm được thực hiện.


  • Ở mỗi bước, hãy lặp lại tất cả các trường hợp kiểm thử và nếu chúng được thực hiện xong, hãy kiểm tra xem liệu có đạt được vị trí mong đợi hay không.


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!

Khung GUT hiển thị quá trình chạy thử thành công

Thảo luận

Ở đâ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.