paint-brush
Godot에서 테스트하기: 개인적으로 접근하는 방법~에 의해@dlowl
603 판독값
603 판독값

Godot에서 테스트하기: 개인적으로 접근하는 방법

~에 의해 D. Lowl4m2024/03/07
Read on Terminal Reader

너무 오래; 읽다

GUT(Godot 단위 테스트)는 클릭 한 번으로 AssetLib에서 설치할 수 있습니다. 이는 테스트 스크립트를 위해 확장할 수 있는 클래스를 제공합니다. Godot의 디버거를 사용하고 개별 테스트를 실행할 수 있는 멋진 UI가 있습니다. CLI와 CI에서 실행할 수 있습니다(그러나 이에 대해서는 나중에 다루겠습니다).
featured image - Godot에서 테스트하기: 개인적으로 접근하는 방법
D. Lowl HackerNoon profile picture

상황의 변화를 위해 약간의 개발 일지를 작성하고 싶습니다. 얼마 전 저는 게임 잼에 참여하여 미로 주변에 치즈를 놓아 쥐를 유인하는 짧은 퍼즐 게임인 Of Mice and Bad Choices 게임을 만들었습니다. 재미있긴 했지만 분명 부족한 부분도 있었습니다.


주요한 것 중 하나는 쥐의 행동이 직관적이지 않다는 것입니다. 플레이어들은 생쥐가 단지 얼어붙는 것이 아니라 싫어하는 치즈를 먹으면 쫓겨날 것으로 예상한다고 언급했습니다. 게다가 이 메커니즘을 구현하면 훨씬 더 풍부한 퍼즐 디자인이 가능해집니다.


그래서 저는 이것이 Godot에서 자동화된 테스트를 수행할 수 있는 좋은 기회라고 생각합니다.

예상되는 동작 예시: 마우스가 블루치즈에서 멀어져야 합니다.

테스트 도구

Godot 4에 사용할 수 있는 몇 가지 테스트 프레임워크가 있지만 제 마음에 쏙 드는 프레임워크는 GUT(Godot Unit Test) 입니다. GUT는 매우 간단합니다.


  • 한 번의 클릭으로 AssetLib에서 설치할 수 있습니다.


  • 이는 테스트 스크립트를 위해 확장할 수 있는 클래스를 제공합니다. test_ 로 시작하는 함수를 추가하고 몇 가지 주장(일반적인 단위 테스트 구조)을 작성하기만 하면 됩니다.


  • Godot의 디버거를 사용하고 개별 테스트를 실행할 수 있는 멋진 UI가 있습니다.


  • CLI와 CI에서 실행할 수 있습니다(그러나 이에 대해서는 나중에 다루겠습니다).

내 테스트 프레임워크

이 특별한 경우에는 코드가 아닌 엔진 편집기에서 게임 레벨을 정의하는 것과 같은 방식으로 복잡한 시나리오를 정의하는 방법을 원했습니다(이렇게 하면 테스트가 현실에 더 가까워질 것입니다). 따라서 나는 다음과 같은 작업을 수행하고 싶습니다.


  • 지도를 가져오고 테스트를 실행하는 단일 실행기 기능이 있습니다.


  • 실행할 시나리오(테스트 사례) 세트가 포함된 맵 컬렉션을 만드세요.


  • 드래그 앤 드롭 방식으로 테스트 사례를 정의하는 방법이 있습니다. 마우스를 놓고 N 턴에 있어야 할 위치를 설정합니다.


그럼 이것을 풀어보겠습니다.

테스트 케이스 정의

새 클래스 `MouseTestCase`를 정의해 보겠습니다. 우리는 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 )에서 확인할 수 있습니다. 또한 테스트를 소개하는 특정 PR을 살펴볼 수도 있습니다. 보너스 포인트의 경우 누군가가 CI에서 작동하도록 할 수 있다면 정말 좋을 것입니다. 건배.