指定された対象範囲に対して、testing-style.md に準拠した GUT テストを作成する。
ユーザーが指定した対象(スクリプト、クラス、機能など)に対して GUT テストを作成する。
プロジェクトルート: D:/MyWork/GameDevelopment/Godot/Godot_v4.5.1/projects/GameGallery(以下 $ROOT)
$ROOT/doc/guides/testing-style.md を Read で読み込み、全ルールを把握する。
ユーザーが指定した対象の .gd ファイルをすべて Read で読み込み、以下を整理する:
テストコードを書く前に、以下の形式でテスト計画をユーザーに提示し、承認を得る:
## テスト計画
### 対象: `path/to/target.gd`(クラス名)
### テスト分類: Unit / Integration
(理由: シーンツリー不要のためUnit / ノード操作があるためIntegration)
### テストケース一覧
1. `test_xxx` — 説明
2. `test_yyy` — 説明
3. ...
### 依存の扱い
- `SomeAutoload` → double/stub で切り離す
- `SomeNode` → add_child_autofree で生成
ユーザーの承認後、ステップ 4 に進む。
以下の必須ルールを守ってテストコードを Write で作成する:
$ROOT/test/unit/test_<対象名>.gd$ROOT/test/integration/test_<対象名>.gdtest_ で始める(snake_case.gd)| # | ルール |
|---|---|
| 1 | extends GutTest |
| 2 | テスト関数は test_ で始める、原則引数なし |
| 3 | 各テストは最低 1 回 assert_* / pending() / pass_test() / fail_test() を呼ぶ |
| 4 | Node/Scene 生成時は autofree() / add_child_autofree() で後始末 |
| 5 | queue_free() 使用時は await wait_seconds() / await wait_*_frames() で解放待ち |
| 6 | 非同期は await wait_for_signal(signal, timeout) でハング防止 |
| 7 | Unit テストは外部依存を double() / stub() で切り離す |
| 8 | 全クラス・全関数・全変数・全処理ブロックに日本語コメントを付ける(coding-style.md 準拠) |
| 9 | 型注釈を付ける |
| 10 | print() は使わず Log オートロードを使用(テストコード内のデバッグ出力も同様) |
## <対象クラス名> のユニットテスト
extends GutTest
## テスト対象のインスタンス
var _subject: <Type> = null
## 各テスト前にインスタンスを初期化
func before_each() -> void:
_subject = <Type>.new()
# ノードが必要な場合: _subject = add_child_autofree(<Type>.new())
## 各テスト後に後始末
func after_each() -> void:
_subject = null
## <テストの説明>
func test_xxx() -> void:
# 準備
...
# 実行
...
# 検証
assert_eq(actual, expected, "説明")
テスト作成後、以下を確認する:
$ROOT/test/ 配下の既存テストを Glob で取得日本語で以下の形式で報告する:
## テスト作成結果
### 作成したテストファイル
- `test/unit/test_xxx.gd`
- `test_aaa` — 説明
- `test_bbb` — 説明
- ...
### テスト実行方法
**GUT Panel:**
1. GUT Panel を開く
2. 該当ファイルを選択して Run
**CLI:**
godot -d -s --path "$PWD" addons/gut/gut_cmdln.gd -gtest=res://test/unit/test_xxx.gd -gexit
### 補足
(double/stub の使い方、テスト実行時の注意点など)
対象に未実装の機能がある場合は pending("未実装: <説明>") でテストケースを予約し、報告に記載する。