GUTというテストフレームワークを用いて、Godot Engineでテストコードを書く方法をまとめます。
はじめに
テストコードでコードの振る舞いを保証しながら実装を進めるのは、とても大事なことだと思っています。
が、これまでGodot Engineなどゲームエンジンで実装するときには、テストコードを書かずにきました。
今回は、GUTというGodot Engineのunit testフレームワークを使って、テストコード書く方法をまとめます。
ゲーム開発、実は自分もテストを書いてこなかったし、界隈でも話題に上がることが少ない気がする.
— BioErrorLog (@bioerrorlog) July 3, 2023
これからは書いていく.
はてなブログに投稿しました #はてなブログ
Godot Engineでテストコードを書く | GUT - BioErrorLog Tech Blog https://t.co/6aoVCVHSZJ
# 作業バージョン Godot version: 3.5.2 GUT version: 7.4.1
Godot Engineでテストコードを書く
インストール
まずは、GUTをインストールします。
GodotエディタのAssetLib (上部のタブから選べます)から、GUTを検索します。
あとは順当に、Download -> Install ボタンを押していきます。
↓のウィンドウが表示されたら、インストール成功です。
GUTを有効化する
インストールができたら、次はGUTを有効化します。
エディタ上部のProjectタブからProject Settingsを選択し、Pluginsタブを選びます。
そこからGutプラグインを有効化 (Enableチェックボックスをクリック) します。
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_eq
やassert_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"に指定します。
あとは、"Run All"ボタンを押せば、テストが実行されます。
追記: パラメータテスト
パラメータテストを書く方法は、別途記事にまとめました:
おわりに
以上、Godot EngineにテストフレームワークGUTをインストールし、テストを書いて実行するまでの流れを整理しました。
ゲーム開発の文面ではあまりテストが話題に上がることが少ない気がしていますが、同じくテストを書きたいどなたかの参考になれば幸いです。
[関連記事]
参考
GitHub - bitwes/Gut: Godot Unit Test. Unit testing tool for Godot Game Engine.
Gut - Godot Unit Testing - Godot Asset Library