コンテンツにスキップ

テスト戦略

本ドキュメントは、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 クラス)
  • SceneTreeAudioServerDisplayServer 等のエンジン 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         # テストランナーが自動検出。手動登録不要

規約

  1. テストスイートは RefCounted を継承する
  2. テストメソッドは test_ プレフィックスで始める
  3. 検証は assert() を使用する(失敗時は Godot が即座にエラーを出力する)
  4. 各テストメソッドは独立して実行できること(状態を共有しない)
  5. ファイル命名: test_{テスト対象のファイル名}.gd

テスト追加手順

  1. tests/test_{name}.gd を作成(RefCounted 継承、test_ プレフィックスメソッド)
  2. ローカルで godot --headless --script res://tests/test_runner.gd を実行して確認

Note: テストランナーは res://tests/ 配下の test_*.gd ファイルを DirAccess で自動検出する。手動登録は不要。