======================================================================== 負荷テスト仕様 (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数を引き上げる ・本番サーバーに対して実施する場合は管理者へ事前連絡すること