BioErrorLog Tech Blog

試行錯誤の記録

Godot Engineでテストコードを書く | GUT

GUTというテストフレームワークを用いて、Godot Engineでテストコードを書く方法をまとめます。

はじめに

テストコードでコードの振る舞いを保証しながら実装を進めるのは、とても大事なことだと思っています。

が、これまでGodot Engineなどゲームエンジンで実装するときには、テストコードを書かずにきました。

今回は、GUTというGodot Engineのunit testフレームワークを使って、テストコード書く方法をまとめます。

# 作業バージョン
Godot version:  3.5.2
GUT version:  7.4.1

Godot Engineでテストコードを書く

インストール

まずは、GUTをインストールします。

GodotエディタのAssetLib (上部のタブから選べます)から、GUTを検索します。

AssetLibからGUTを検索

あとは順当に、Download -> Install ボタンを押していきます。

"Download"を選択

"Install"を選択

↓のウィンドウが表示されたら、インストール成功です。

インストール終了

GUTを有効化する

インストールができたら、次はGUTを有効化します。

エディタ上部のProjectタブからProject Settingsを選択し、Pluginsタブを選びます。 そこからGutプラグインを有効化 (Enableチェックボックスをクリック) します。

Gutプラグインを有効化する

GUTプラグインを有効化すると、エディタ下部に"GUT"タブが出現し、テスト設定/実行ができるようになります。

エディタの下部に"GUT"タブが現れる

テストコードを書く

では、いよいよテストコードを書いていきます。

テストコードを配置する場所に決まりはありませんが、下記のディレクトリが推奨されています。

  • res://test
  • res://test/unit
  • res://test/integration

テスト用スクリプトファイルはtest_から始まるファイル名で作成します。

シンプルなテストを書いてみると、こんな感じです:

extends GutTest

func before_each():
    gut.p("ran setup", 2)

func after_each():
    gut.p("ran teardown", 2)

func before_all():
    gut.p("ran run setup", 2)

func after_all():
    gut.p("ran run teardown", 2)

func test_assert_eq_number_equal():
    assert_eq('asdf', 'asdf', "Should pass")

func test_assert_true_with_true():
    assert_true(true, "Should pass, true is true")

Ref. Creating Tests · bitwes/Gut Wiki · GitHubより抜粋

まず、extends GutTestしてからコードを書きます。

テスト前後の処理を挟むには、before_each, after_each, before_all, after_allなどの関数があります。

assertには一般的なassert_eqassert_trueが使えます。

それ以外にもたくさんのutility関数やassert関数が用意されているので、詳しくは公式のwikiにあたることをお勧めします: Asserts and Methods · bitwes/Gut Wiki · GitHub


既存の関数をスクリプトからロードしてテストするには、例えば下記のようにします。

extends GutTest

var Obj = load('res://src/scripts/HUD/Dialog.gd')
var _obj = null

func before_each():
    _obj = Obj.new()

func test_convert_to_upper():
    var input = ["Hello", "world"]

    var result = _obj.convert_to_upper(input)
    var expected = ["HELLO", "WORLD"]
    assert_eq(result, expected)

loadで他のスクリプトをロードし、before_each内のnew()でインスタンス化させています。

あとは、普通にスクリプト内の関数(上記の例ではconvert_to_upper())を呼び出してテストできます。

テストを実行する

では最後にテストを実行します。

実行する前に、まずはテストコードを配置した場所 (res://test/unitなど) を"Test Directories"に指定します。

Test Directoriesを指定する

あとは、"Run All"ボタンを押せば、テストが実行されます。

"Run All"で全てのテストを実行する

テスト実行結果

追記: パラメータテスト

パラメータテストを書く方法は、別途記事にまとめました:

www.bioerrorlog.work

おわりに

以上、Godot EngineにテストフレームワークGUTをインストールし、テストを書いて実行するまでの流れを整理しました。

ゲーム開発の文面ではあまりテストが話題に上がることが少ない気がしていますが、同じくテストを書きたいどなたかの参考になれば幸いです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

GitHub - bitwes/Gut: Godot Unit Test. Unit testing tool for Godot Game Engine.

Gut - Godot Unit Testing - Godot Asset Library

Creating Tests · bitwes/Gut Wiki · GitHub

Asserts and Methods · bitwes/Gut Wiki · GitHub