========================================================================
負荷テスト仕様 (Load Test Specification)
========================================================================
1. 概要 (Overview)
------------------------------------------------------------------------
1-1. 目的
大人数同時接続時のサーバー安定性を検証する.
実際のプレイヤーと同等の通信・ゲームプレイをシミュレートするBotを
複数同時接続し,サーバーの処理能力と通信の健全性を確認する.
1-2. テストツール
・ファイル: test/load-bot.ts
・言語: TypeScript(ts-node で直接実行)
・通信: Socket.IO クライアント
・設定ファイル: test/load-bot.constants.ts
・環境変数: test/.env.local
1-3. テスト構成
・1体目のBot(index=0)がオーナーとしてルームを作成し,ゲーム開始を実行する
・残りのBotが順次参加し,ゲーム中のプレイヤー動作をシミュレートする
・ゲーム終了通知を受信したら全Botが切断する
※ 環境構築・実行手順は docs/02_ENV/ENV_06_テスト操作手順.txt を参照すること
2. Botのシミュレーション動作 (Bot Behavior)
------------------------------------------------------------------------
2-1. 接続・入室
■ 接続
・Socket.IOで指定URLに接続する
・トランスポート: websocket, polling
・再接続: 無効(reconnection: false)
・タイムアウト: 10秒
■ 入室
・接続直後にjoin-roomイベントを送信する
・プレイヤー名: "bot-{index}"(0始まり)
・ルームID: 定数で指定(既定: "1")
■ 参加タイミングの分散
・各Botの接続開始を JOIN_DELAY_MS(既定: 25ms)ずつずらす
・接続スパイクによるサーバー負荷集中を回避する
2-2. ゲーム開始
■ オーナーBot(index=0)の動作
・接続後 START_DELAY_MS(既定: 800ms)経過後にstart-gameイベントを送信する
・不足分はサーバー側でBot AIが補充される
■ 全Botの動作
・game-startイベント受信後にready-for-gameを送信する
・game-startに含まれるstartTimeまで待機してからゲームプレイを開始する
・gridCols/gridRowsを受信し,フィールドサイズを動的に更新する
2-3. クロック同期
■ Ping/Pong
・5秒間隔でpingイベントを送信する(初回は接続直後に即時送信)
・pong受信時にRTTを計測し,clockOffsetMsを更新する
・計算式: clockOffsetMs = serverTime + (RTT / 2) - clientNow
■ game-start時の補正
・game-startペイロードのserverNowでclockOffsetMsを上書きする
・ゲーム開始直前に最も正確なオフセットを取得する
■ 経過時間の算出
・getElapsedMs() = max(0, getServerNow() - gameStartTimeMs)
・ボムの爆発判定やフィーバータイム判定に使用する
2-4. 移動
■ 移動方式
・MOVE_TICK_MS(既定: 50ms)間隔で位置を更新し,moveイベントを送信する
・ランダムな角度で方向を決定し,BOT_SPEEDで直線移動する
・フィールド端に到達したら方向をランダムに再設定する(壁反射)
■ ハリケーン回避
・ハリケーンの直径×1.5の範囲内に入った場合,逃げる方向へ移動方向を変更する
・複数のハリケーンが近い場合,回避ベクトルを合算して逃げる方向を決定する
■ スタン中の動作
・isStunned()がtrueの間は移動とボム設置をスキップする
2-5. ボム設置
■ 設置条件
・BOT_CAN_PLACE_BOMBがtrueであること
・ゲームが開始済みであること
・スタン中でないこと
・前回設置からクールダウン時間が経過していること
■ クールダウン
・通常時: BOMB_NORMAL_COOLDOWN_MS(既定: 4000ms)
・フィーバータイム時: BOMB_FEVER_COOLDOWN_MS(既定: 2000ms)
・フィーバー判定: 残り時間 ≤ 60秒
■ 送信データ
・requestId: "{botIndex}-{serial}" で一意に生成する
・x, y: Botの現在座標
・explodeAtElapsedMs: 現在の経過時間 + BOMB_FUSE_MS
■ 設置タイミング
・移動tickのたびに設置条件を判定し,条件を満たせば即座に設置する
2-6. 被弾・リスポーン
■ 爆弾の被弾判定
・他プレイヤーのbomb-placedイベントを受信し,trackedBombsに登録する
・100ms間隔で爆発時刻に達したボムを走査する
・爆発範囲(BOMB_RADIUS_GRID + PLAYER_RADIUS)内にいれば被弾処理を実行する
・自チームのボムは友軍撃ちとして無視する(ownerTeamId === myTeamId)
■ 被弾処理(爆弾・ハリケーン共通)
・hitCountを1増加させる
・5回未満: PLAYER_HIT_STUN_MS(既定: 1000ms)のスタンを適用する
・5回到達: リスポーンを実行する
- hitCountを0にリセットする
- PLAYER_RESPAWN_STUN_MS(既定: 2000ms)のスタンを適用する
- スタン明け後の次回tickMoveで初期スポーン座標に戻る
■ 爆弾の被弾報告
・被弾と判定した場合,bomb-hit-reportイベント(bombId)をサーバーに送信する
・サーバーはplayer-hitを被弾者以外に送信するため,自分のhitCountはクライアント側で管理する
■ ハリケーン被弾
・hurricane-hitイベントで自分のplayerIdが含まれていれば被弾処理を実行する
2-7. ゲーム終了
■ 終了処理
・game-endまたはgame-resultイベントを受信したら以下を実行する
- gameEndedフラグをtrueに設定する
- 全タイマー(移動・Ping・ボム判定)を停止する
- ソケットを切断する
3. 統計収集 (Statistics)
------------------------------------------------------------------------
3-1. 収集項目
・connected: 接続成功数
・joined: ルーム参加数
・startSent: ゲーム開始リクエスト送信数
・moveSent: 移動イベント送信数
・disconnects: 切断数
・errors: 接続エラー数
・gameStarts: ゲーム開始通知受信数
3-2. 出力タイミング
・テスト開始時: 設定値一覧を標準出力する
・テスト終了時: 最終統計を標準出力する
4. 確認観点 (Verification Points)
------------------------------------------------------------------------
4-1. サーバー安定性
・指定Bot数での同時接続中にサーバーがクラッシュしないこと
・全Botが正常にルーム参加・ゲーム開始できること
・ゲーム終了まで切断エラーが発生しないこと
4-2. パフォーマンス
・サーバーのティック処理時間が50ms以内に収まること
- サーバーログの avgTickMs / maxTickMs を確認する
・CPU使用率(cpuUsagePct)が許容範囲内であること
・推定送信帯域(outboundBytesPerSec)が過大でないこと
4-3. ゲームプレイの正常性
・Botの移動座標がサーバーに正しく同期されること
・ボムの設置・爆発が正常に処理されること
・被弾・リスポーンが正常に動作すること
・ハリケーンの出現・被弾が正常に処理されること
4-4. 段階的テスト
・少数(4〜8体)から開始し,段階的にBot数を増やすこと
・各段階でサーバーログを確認してからBot数を引き上げる
・本番サーバーに対して実施する場合は管理者へ事前連絡すること