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