Browser Walkthrough - bianchiidentity/isucon12 GitHub Wiki

画面でたどる大会運営・ブラウザE2E

← 練習ガイド · アプリの仕組み

管理者で団体を作り、主催者が大会を運営し、参加者が結果を見る。 実際のブラウザE2Eで撮影した画面を、操作順に8枚へまとめました。

1. 3つの役割で、ひとつの大会を動かす

3つの役割で、ひとつの大会を動かす

管理者が団体を作り、主催者が大会を運営し、参加者が結果を読む。

2. 団体を追加し、団体ごとの請求を把握する

団体を追加し、団体ごとの請求を把握する

テナントとはサービスを利用する団体。追加した団体は専用ホストで開く。

3. 選手を登録して、大会運営の準備をする

選手を登録して、大会運営の準備をする

選手IDはログインとCSVで使う。選手一覧は参加資格を管理する画面でもある。

4. 大会一覧が、運営の操作拠点になる

大会一覧が、運営の操作拠点になる

作成 → CSV入稿 → 終了。この順に大会の状態を進める。

5. 最高点ではなく、最後の行の得点が残る

最高点ではなく、最後の行の得点が残る

3行を受け付け、2人の結果になる。同点なら、採用された行番号が早い順。

6. 大会から選手へ。結果をたどって読める

大会から選手へ。結果をたどって読める

大会一覧 → ランキング → 選手名。選手ごとの大会と得点を確認する。

7. 開催中は0円。終了すると、利用状況が請求になる

開催中は0円。終了すると、利用状況が請求になる

登録選手2人と、閲覧だけの1人。選手本人の閲覧も、繰り返し閲覧も二重に数えない。

8. 失格にすると、本人の閲覧アクセスを止める

失格にすると、本人の閲覧アクセスを止める

選手の参加資格を変更する操作。既存の得点を削除する操作とは別。

自分のブラウザで流れを見る

ホストPCから練習サーバーへの443番ポートフォワードを起動した状態で実行します。 Google ChromeとNode.jsが必要です。新規テナントの名前解決と証明書エラーの許容は、テスト用Chrome内だけに設定します。

cd e2e
npm ci
E2E_SLOW_MO=150 npm run test:headed

速く確認するなら npm test。手順ごとの画像と結果を見るなら npm run report。

E2Eが確認すること

操作 確認すること
管理者でテナント作成 作成した団体へログインできる
主催者で選手・大会を追加 空の一覧と追加後の一覧が表示される。UUIDでも画面遷移できる
CSVでスコア登録 入力3行を受け付け、ランキング・個人戦績へ反映される
同じ選手を複数行含むCSV 最後の行の得点を採用する。最高点とは限らない
同点の選手を登録 採用されたCSV行の番号が早い選手から並ぶ
CSVを再登録 古い結果が置き換わる。ヘッダーだけなら結果と個人戦績が空になる
不正なCSVを登録 400になり、登録済みの結果は変わらない。不正な先行行も見逃さない
ランキングを繰り返し閲覧 閲覧だけの参加者も、スコア登録済みの参加者も二重課金しない
大会を終了して請求確認 開催中0円、終了後210円。SaaS管理者の一覧とも一致する
選手を失格にする 本人の大会一覧・ランキング・個人戦績APIが403になる

画面に出ない入力行数や403は、その画面操作が発生させた通信応答でも確認しています。 「空CSV」は player_id,score のヘッダーだけがあるファイルを指します。

今回E2Eで見つかった不具合

新規テナントの選手一覧が players:null を返し、画面側の map が例外になって真っ白になる問題を検出しました。 「プレイヤー追加」ボタンまで消えるため、ブラウザだけでは最初の選手を作成できませんでした。 PR #32で空配列 [] を返すように修正し、サーバー反映後に全手順がPASSしています。

テストデータと保存先

毎回専用の e2e-... テナントを作成します。既存テナントは操作しません。 削除APIがないため、作成データは残し、次回の通常のベンチ初期化で削除されます。 ベンチと同時実行しないでください。 E2E自体は初期化・ベンチ・サービス再起動を行いません。

画面PNG・HTMLレポート・失敗時traceは .e2e-artifacts/ に保存され、gitignore対象です。 公開画像はGitHub Releaseの添付ファイルなので、アプリのclone/pullでは取得されません。 認証情報を含み得るtraceやHTMLレポートは公開しません。 負荷・並行更新・初期化の30秒制限は別途ベンチで確認します。

撮影した実画面11枚を見る

団体を作る・団体ごとの請求を見る

団体を作る・団体ごとの請求を見る

同じ団体に、参加者と主催者の入口がある

同じ団体に、参加者と主催者の入口がある

選手を登録し、参加資格を管理する

選手を登録し、参加資格を管理する

大会を作る・CSVを入れる・終了する

大会を作る・CSVを入れる・終了する

CSVの最後の行が、その選手の得点になる

CSVの最後の行が、その選手の得点になる

参加者は大会一覧から結果を見に行く

参加者は大会一覧から結果を見に行く

同点なら、採用されたCSV行が早い選手が上位

同点なら、採用されたCSV行が早い選手が上位

選手ごとに、大会と得点を一覧で見る

選手ごとに、大会と得点を一覧で見る

開催中の大会は、請求人数も金額もゼロ

開催中の大会は、請求人数も金額もゼロ

スコア登録2人+閲覧のみ1人で、210円

スコア登録2人+閲覧のみ1人で、210円

失格は選手のアクセス権を止める操作

失格は選手のアクセス権を止める操作

⚠️ **GitHub.com Fallback** ⚠️