web-testing について
web-testingは、回帰テストを置き換えるのではなく、実ブラウザーでダッシュボードのUI変更を探索的に検証するスキルです。差分に関係するルートをデスクトップとモバイルで確認し、スクリーンショットと構造化された判定を残します。
主な機能
- 01コード変更を対象ルートに対応付け
- 02デスクトップとモバイルの表示をテスト
- 03操作を行い結果を検証
- 04証拠としてスクリーンショットを撮影
- 05発見事項を再現可能なテストに反映
- 06エンドツーエンドテスト失敗の分類
活用シーン
- 01プルリクエストのダッシュボード変更を検証
- 02レスポンシブレイアウトの回帰を確認
- 03エンドツーエンドテストの失敗を調査
- 04発見した問題を継続的なテストに追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ onsager-ai/ dev-skills --skill web-testingインストール後、Claude Code で/web-testingを入力して読み込まれたか確認します。
詳細
Web Testing Protocol(L2)
ダッシュボード UI の変更を探索的に、AI 主導で検証します。回帰テストではありません。 回帰テストは L1 の担当です(ダッシュボードのテストディレクトリにあるスモークテストと E2E テスト)。L2 では、L1 が見逃す問題を検出します。レイアウトの不具合、モバイルでのリグレッション、実際のブラウザーでのみ失敗するインタラクションフローなどです。
別のリポジトリで採用する場合: 手順(差分を読む → ルートに対応付ける → 2 つのビューポートで agent-browser を実行する → スクリーンショットを撮る → 判定する)は、リポジトリに依存しません。以下のルート表、テストパス、判定スキーマは、
onsager-ai/onsagerの例です。スキルをフォークし、ご自身のダッシュボードに合わせて具体的な箇所を置き換えてください。
実行するタイミング
- PR が
apps/dashboard/**に変更を加えている場合 - L1 E2E が失敗し、それが実際のリグレッションなのか、不安定なテストなのか、環境の問題なのかを確認する必要がある場合
- 誰かが「UI を検証して」または「この変更を実地で試して」と言った場合
テスト対象のアプリ
CI パイプラインは crates/stiglab/deploy/Dockerfile をビルドします。この単一のイメージには、Rust バックエンド(stiglab と synodic)およびビルド済みのダッシュボード SPA がバンドルされています。http://localhost:3000 でリッスンします。
主なルート:
| ルート | ページ | 見出し |
|---|---|---|
/ | ファクトリーの概要 | Factory |
/sessions | セッション一覧 | Sessions |
/sessions/:id | セッション詳細 | —(動的) |
/nodes | ノード一覧 | Nodes |
/artifacts | アーティファクト一覧 | Artifacts |
/spine | イベントスパインビューアー | —(動的) |
/governance | ガバナンス | Governance |
/settings | 設定と認証情報 | Settings |
ビューポート(必ず両方でテスト)
- デスクトップ:
agent-browser set viewport 1280 720 - モバイル:
agent-browser set viewport 375 812
モバイルでの確認は重要です。ダッシュボードはレスポンシブレイアウトを採用しています(全体にわたる md: ブレークポイントを参照)。横方向のオーバーフローとナビゲーションの非表示は、最も多い 2 種類のリグレッションです。
手順
- 差分を読む(
git diff $DIFF_RANGE)— CI から環境変数としてDIFF_RANGEが渡されます。 - 変更をルートに対応付けます。
src/pages/SessionsPage.tsxの変更 ⇒/sessions。src/components/layout/**の変更 ⇒ すべてのルート。 - 影響を受ける各ルートについて、各ビューポートで次を行います。
agent-browser open http://localhost:3000<route>- ページのスナップショットを取得し、見出しと主要な要素が表示されることを確認します。
- インタラクティブな要素を実際に操作します。マークアップを確認するだけでは不十分です。
- ボタンをクリックし、フォームを送信し、ダイアログを開きます。
- 結果を確認します — UI の状態は変わったか、ダイアログは閉じたか、新しいデータは表示されたかを確認します。マークアップが存在するだけでは、正常に動作している証拠になりません。
- レイアウトの不具合を確認します。特にモバイルでは、横スクロールが発生したら不合格です。ナビゲーションがコンテンツを覆っている場合も不合格です。
agent-browser screenshot --screenshot-dir /tmp/l2-screenshotsを実行し、出力ファイルの名前を{route-slug}-{desktop|mobile}.pngに変更します。
- 調査結果をテストとして定着させます。 新しい動作を検証したときや、修正方法を説明できる不具合を見つけたときは、
apps/dashboard/tests/smoke/(コンポーネントレベル)またはapps/dashboard/tests/e2e/(ブラウザーレベル)に決定論的な L1 テストを作成します。こうして L2 での発見を、恒久的な L1 のテスト範囲に反映できます。 - 判定を出します。
tests/l2-verdict-schema.jsonに一致する JSON を返します。- 影響を受けるすべてのルートが、両方のビューポートで合格した場合は
PASS。 - いずれかのルートが失敗した場合は
FAIL。該当する問題をviewports[].issues[]に記載します。
- 影響を受けるすべてのルートが、両方のビューポートで合格した場合は
トリアージモード
L1 E2E の失敗後に実行された場合は、作業内容が異なります。
apps/dashboard/tests/e2e/にある失敗したテストファイルを読みます。- agent-browser を使って
http://localhost:3000で再現します。 - 失敗ごとに、regression(実際の不具合)、flaky(断続的な失敗/タイミングの問題)、environment(テストハーネスまたは CI の問題)に分類します。
- 根本原因と修正案を含む、
tests/l2-triage-schema.jsonに一致する JSON を返します。
ガードレール
- 差分の範囲に絞ります。1 行の変更でアプリ全体を再テストしないでください。
- スクリーンショットは必須の証拠です。スクリーンショットがなければ、ビューポートを実行していません。
- ルートを勝手に作らないでください。差分で新しいルートが追加された場合はそれを使い、そうでなければ上記の表に従ってください。
- コストを抑えてください。ビューポートごとにブラウザーセッションは 1 つで十分です。