diff --git "a/docs/02_ENV/ENV_06_\343\203\206\343\202\271\343\203\210\346\223\215\344\275\234\346\211\213\351\240\206.txt" "b/docs/02_ENV/ENV_06_\343\203\206\343\202\271\343\203\210\346\223\215\344\275\234\346\211\213\351\240\206.txt" index 4a15b02..d35d0ac 100644 --- "a/docs/02_ENV/ENV_06_\343\203\206\343\202\271\343\203\210\346\223\215\344\275\234\346\211\213\351\240\206.txt" +++ "b/docs/02_ENV/ENV_06_\343\203\206\343\202\271\343\203\210\346\223\215\344\275\234\346\211\213\351\240\206.txt" @@ -28,8 +28,10 @@ 2-2. 設定値 ■ 接続先URL -・既定値: https://skillsemiwebgame.onrender.com -・変更方法: コマンドライン引数(--dev)または定数を編集する +・既定値: http://localhost:3000 +・変更方法: 環境変数(.env.local)またはコマンドライン引数(--dev)で切り替える + - LOAD_TEST_SERVER_URL: 本番接続先URL + - LOAD_TEST_DEV_SERVER_URL: 開発接続先URL 3. 実行手順 (Execution Steps) @@ -52,22 +54,30 @@ ・--dev: 開発環境(DEV_SERVER_URL)に接続する 4-2. 定数 (load-bot.constants.ts) - ・URL: 本番サーバURL - ・DEV_URL: 開発サーバURL - ・BOTS: 同時接続数 - ・DURATION_MS: 実行時間 (ms)。0以下またはInfinityで無期限 - ・JOIN_DELAY_MS: 参加間隔 (ms) - ・MOVE_TICK_MS: 移動送信間隔 (ms) - ・BOT_SPEED: 移動速度 - ・BOT_RADIUS: プレイヤー半径 + ■ 接続設定 + ・URL: 本番サーバURL(環境変数 LOAD_TEST_SERVER_URL で上書き可能,既定: http://localhost:3000) + ・DEV_URL: 開発サーバURL(環境変数 LOAD_TEST_DEV_SERVER_URL で上書き可能,既定: http://localhost:3000) + ・SOCKET_PATH: Socket.IOのパス(shared の NETWORK_CONFIG から取得) + ・SOCKET_TRANSPORTS: Socket.IOのトランスポート(["websocket", "polling"]) + + ■ テスト実行設定 + ・BOTS: 同時接続するBot数(既定: 99) + ・DURATION_MS: テスト実行時間 (ms)(既定: Infinity = 無期限) + ・JOIN_DELAY_MS: Bot参加の間隔 (ms)(既定: 25) + ・START_DELAY_MS: 接続からゲーム開始リクエストまでの遅延 (ms)(既定: 800) + ・ROOM_ID: 参加するルームID(既定: "1") + ・START_GAME: 1体目のBotがゲーム開始を実行するか (true/false) + + ■ Bot動作設定 ・BOT_CAN_MOVE: ボット移動の有効化 (true/false) - ・START_DELAY_MS: 開始遅延 (ms) - ・MAX_X: X座標上限 - ・MAX_Y: Y座標上限 - ・ROOM_ID: ルームID - ・START_GAME: ゲーム開始の有効化 (true/false) - ・SOCKET_PATH: Socket.IOのパス - ・SOCKET_TRANSPORTS: Socket.IOのトランスポート + ・BOT_CAN_PLACE_BOMB: ボム設置の有効化 (true/false) + ・MOVE_TICK_MS: 移動送信間隔 (ms)(shared の GAME_CONFIG から取得) + ・BOT_SPEED: 移動速度(shared の GAME_CONFIG から取得) + ・BOT_RADIUS: プレイヤー半径(shared の GAME_CONFIG から取得) + ・BOMB_COOLDOWN_MS: ボムのクールダウン (ms)(shared の GAME_CONFIG から取得) + ・BOMB_FUSE_MS: ボムの爆発までの時間 (ms)(shared の GAME_CONFIG から取得) + ・MAX_X: X座標上限(shared の GAME_CONFIG.GRID_COLS) + ・MAX_Y: Y座標上限(shared の GAME_CONFIG.GRID_ROWS) 5. 出力と終了 (Output & Termination) diff --git "a/docs/06_TEST/TEST_01_\350\262\240\350\215\267\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.txt" "b/docs/06_TEST/TEST_01_\350\262\240\350\215\267\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.txt" new file mode 100644 index 0000000..77a0242 --- /dev/null +++ "b/docs/06_TEST/TEST_01_\350\262\240\350\215\267\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.txt" @@ -0,0 +1,182 @@ +======================================================================== +負荷テスト仕様 (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数を引き上げる + ・本番サーバーに対して実施する場合は管理者へ事前連絡すること