テスト戦略¶
本ドキュメントは、Maiden Phalanx プロジェクトにおけるテスト方針を定義する。
方針¶
基本原則¶
- 軽量テストスイート自作 — 外部フレームワークに依存せず、Godot の
--headless --scriptで実行できるテストランナーを使用する - 純粋ロジック層のみテスト — Node / SceneTree 非依存のコードだけをユニットテストの対象とする
- テスト対象は費用対効果で選定 — ゲームバランスやデータ整合性に直結するロジックを優先的にテストする
テストしないもの¶
- 演出層(View) — 描画結果は目視確認(手動テストシーン)で行う
- グルーコード — ボタン押下 → Autoload 呼び出しのみのシーンスクリプト
- システム依存層 — AudioServer、DisplayServer、SceneTree 等の Godot エンジン API に強く依存するコード
コードレイヤリング¶
全 GDScript ファイルを 4 つのレイヤに分類し、テスト対象を明示する。
Layer 1: 純粋ロジック(✅ ユニットテスト対象)¶
Node 非依存。RefCounted 継承または static 関数。副作用なし。
判断基準: 以下を全て満たすコード。
Nodeを継承していない(RefCounted/Resource/ static クラス)SceneTree、AudioServer、DisplayServer等のエンジン API を直接呼び出さない- ファイルシステムやネットワークへの副作用がない
テスト優先度の基準:
- P0: バトル勝敗に直結するロジック(ダメージ計算、ターゲット解決、勝敗判定、セーブデータ整合性)
- P1: ゲーム進行に影響するロジック(ボーナス判定、データバリデーション、インベントリ管理)
Layer 2: データ定義(⚠️ テスト不要 — ロジックなし)¶
@export フィールド + tr() ヘルパーのみ。壊れる余地がない。
判断基準: Resource 継承で、@export フィールド定義と翻訳キー導出のみを含むスクリプト。
Layer 3: システム依存 Autoload(❌ ユニットテスト対象外)¶
Godot エンジン API(AudioServer, SceneTree, FileAccess 等)に強く依存。 テストするなら統合テストだが、現段階ではコスト過大。
判断基準: エンジンの Singleton API やファイルシステムに直接依存する Autoload スクリプト。
Layer 4: 演出 / UI グルーコード(❌ ユニットテスト対象外)¶
シーンスクリプト。手動プレイまたはテストシーンで確認する。
判断基準: Node を継承し、シグナル接続・UI 操作・Tween 等の演出処理が主体のスクリプト。
テスト実行方法¶
ローカル¶
godot --headless --script res://tests/test_runner.gd
終了コード 0 = 全テスト成功、1 = 失敗あり。
CI (GitHub Actions)¶
PR で .gd ファイルが変更された場合に自動実行される。
ワークフロー: .github/workflows/test.yml
テストの書き方¶
ディレクトリ構造¶
res://tests/
├── test_runner.gd # テストランナー(エントリポイント)
└── test_*.gd # テストランナーが自動検出。手動登録不要
規約¶
- テストスイートは
RefCountedを継承する - テストメソッドは
test_プレフィックスで始める - 検証は
assert()を使用する(失敗時は Godot が即座にエラーを出力する) - 各テストメソッドは独立して実行できること(状態を共有しない)
- ファイル命名:
test_{テスト対象のファイル名}.gd
テスト追加手順¶
tests/test_{name}.gdを作成(RefCounted継承、test_プレフィックスメソッド)- ローカルで
godot --headless --script res://tests/test_runner.gdを実行して確認
Note: テストランナーは
res://tests/配下のtest_*.gdファイルをDirAccessで自動検出する。手動登録は不要。