Playwright を使ったシナリオテストの設計・実行・コード化を一気通貫で支援するスキル。 ユーザーと対話しながらテストケースを洗い出し、Playwright CLI で手動検証を行い、 シナリオ確定後にテストコードを自動生成・リファクタリング・ lint チェックまで実施する。 生成したテストは `bun e2e` で繰り返し実行可能な状態にセットアップする。 以下のようなリクエストで必ずこのスキルを使用すること: - 「シナリオテストを作りたい」「E2E テストを作成して」「テストケースを洗い出して」 - 「○○のシナリオテストを書いて」「○○の操作をテスト化して」 - 「Playwright でテストを作って」「ブラウザテストを自動化して」 - 「テストシナリオを設計して」「テストケースを考えて」 - 「E2E テストを実行して」「シナリオテストを回して」 - 「テストコードを生成して」「手動テストを自動化して」 - シナリオテスト・ E2E テスト・ブラウザテストの設計・作成・実行に関するあらゆるリクエスト
ユーザーと協力して Web アプリケーションのシナリオテストを 設計 → 検証 → コード化 → セットアップ まで一気通貫で行うスキル。
STEP 0: ヒアリング(対象サイト・テスト目的の確認)
↓
STEP 1: テストケース設計(シナリオ洗い出し・優先度付け)
↓
STEP 2: 手動検証(Playwright CLI でシナリオ実行・動作確認)
↓
STEP 3: シナリオ Fix(ユーザー承認)
↓
STEP 4: テストコード生成(.spec.ts ファイル作成)
↓
STEP 5: 品質チェック(リファクタリング・lint:fix・テスト実行)
↓
STEP 6: セットアップ完了(実行方法の案内)
qa-management サブエージェントの STEP 4 から呼び出された場合、ヒアリングとテストケース設計は QA 側で完了済みのため ショートカットパス で動作する。
QA Management (STEP 3 で設計済みテストケースを渡す)
↓
scenario-test STEP 2: 手動検証(渡された TC を Playwright CLI で実行)
↓
STEP 3 → STEP 4 → STEP 5 → STEP 6(通常通り)
ショートカット判定ルール:
AskUserQuestion で補完する(全項目を再ヒアリングしない)QA Management から受け取る情報の対応表:
| QA 側の情報 | scenario-test での利用 |
|---|---|
| TC-ID(例: TC-E001) | .spec.ts 内のテスト名に埋め込み(トレーサビリティ確保) |
| テストケースの手順 | STEP 2 の手動検証手順として使用 |
| 期待結果 | アサーションの設計に使用 |
| 優先度(P1/P2/P3) | テストコード化の優先順位に使用 |
| 前提条件 | テストのセットアップ処理に反映 |
AskUserQuestion を使い、以下の情報を収集する。
既にユーザーが提示している情報はスキップしてよい。
| 収集項目 | 質問例 |
|---|---|
| 対象サイト URL | テスト対象のサイト URL を教えてください |
| テストの目的 | どのような操作・機能をテストしたいですか?(例: ログインフロー、購入フロー、フォーム送信など) |
| テスト範囲 | テスト対象のページや機能の範囲を教えてください |
| 前提条件 | ログインが必要か、テストデータの準備が必要かなど |
| 優先度 | 特に重要なシナリオはありますか? |
収集した情報をもとに、テストシナリオを設計する。
以下の観点でテストケースを網羅的に洗い出す:
以下のフォーマットでユーザーに提示し、フィードバックを求める:
## テストシナリオ一覧
### シナリオ 1: [シナリオ名]
- **目的**: [テストの目的]
- **前提条件**: [必要な状態・データ]
- **手順**:
1. [操作 1]
2. [操作 2]
3. ...
- **期待結果**: [期待される動作・表示]
- **優先度**: 高 / 中 / 低
### シナリオ 2: [シナリオ名]
...
AskUserQuestion でユーザーの承認・修正フィードバックを得る。
シナリオに変更があれば反映し、再度提示する。
承認されたシナリオを Playwright CLI で実際に操作し、動作を確認する。
playwright-cli open [対象URL]
各シナリオの手順に沿って Playwright CLI コマンドを実行する:
# ページ構造の確認
playwright-cli snapshot
# 要素の操作
playwright-cli click [ref]
playwright-cli fill [ref] "[入力値]"
playwright-cli press Enter
# 結果の確認
playwright-cli snapshot
playwright-cli screenshot --filename=reports/screenshots/[scenario-name].png
各シナリオについて以下を記録する:
reports/screenshots/ に保存)検証結果をユーザーに報告し、問題がなければ STEP 3 へ進む。
AskUserQuestion を使い、以下を確認する:
ユーザーが承認したら STEP 4 へ進む。 修正がある場合は STEP 1 または STEP 2 に戻る。
テストファイルは tests/ ディレクトリに作成する。
tests/[feature-name].spec.tslogin-flow.spec.ts, cart-checkout.spec.ts)既存テスト(tests/*.spec.ts)のスタイルに合わせて記述する:
import { expect, type Page, test } from "@playwright/test";
// ---------------------------------------------------------------------------
// 定数・ヘルパー
// ---------------------------------------------------------------------------
const BASE_URL = "https://example.com";
// 外部サイトへのリクエストで load が遅延するページがあるため余裕を持たせる
test.use({ navigationTimeout: 60_000 });
/**
* domcontentloaded で遷移する(load 待ちによるタイムアウトを回避)
*/
async function navigateTo(page: Page, url: string) {
return page.goto(url, { waitUntil: "domcontentloaded" });
}
// =========================================================================
// テストスイート
// =========================================================================
test.describe("[機能名]", () => {
test("[シナリオ名]", async ({ page }) => {
// 1. ページ遷移
await navigateTo(page, `${BASE_URL}/path`);
// 2. 操作(Playwright CLI で生成されたコードを活用)
await page.getByRole("button", { name: "Submit" }).click();
// 3. アサーション
await expect(page.getByText("Success")).toBeVisible();
});
});
QA Management から TC-ID 付きのテストケースを受け取った場合、テストコードと QA 成果物の紐付けを維持する。
テスト名への TC-ID 埋め込みルール:
// QA Management の TC-E001 に対応するテスト
test("TC-E001: カートに商品を追加して購入完了まで遷移する", async ({ page }) => {
// ...
});
// QA Management の TC-E002 に対応するテスト
test("TC-E002: 在庫切れ商品でエラーメッセージが表示される", async ({ page }) => {
// ...
});
test() の第一引数の先頭に TC-XXXX: プレフィックスとして付与するgetByRole(), getByText(), getByLabel() 等のセマンティックロケーターを優先。CSS セレクターは最終手段waitForURL(), waitForSelector() を使い、固定の waitForTimeout() は避けるexpect の Playwright 組み込みアサーション(toBeVisible(), toHaveURL(), toHaveText() 等)を使用test.describe() や test() のラベルは日本語で記述してよい(既存テストの慣例に準拠).env もしくは .env.project ファイルで管理し、テストコードには含めない。bun lint:fix
lint エラーが残る場合は手動で修正する。
bun e2e
テストが失敗する場合:
全テストが Pass するまで繰り返す。
テストが Pass した後、以下の観点でリファクタリングを検討する:
waitForTimeout() の除去リファクタリング後、再度 lint と テスト実行を行い Pass を確認する。
テストが安定稼働することを確認したら、ユーザーに以下を案内する:
# 全 E2E テスト実行
bun e2e
# 特定のテストファイルのみ実行
bunx playwright test tests/[file-name].spec.ts
# UI モードで実行(デバッグ用)
bun e2e:ui
# ヘッドフルモード(ブラウザ表示あり)
bun e2e:headed
# デバッグモード
bun e2e:debug
最後に、作成・変更したファイルの一覧を表示する:
[作成] tests/[file-name].spec.ts — [テストの概要]
[変更] playwright.config.ts — [変更があった場合のみ]
| 判定基準 | scenario-test(本スキル) | playwright-cli |
|---|---|---|
| 目的 | テストの設計・コード化・自動化 | ブラウザの手動操作・データ抽出 |
| 成果物 | .spec.ts テストファイル | スクリーンショット・データ・操作結果 |
| ワークフロー | 対話的にシナリオ設計 → コード生成 | 単発のブラウザ操作 |
判定ルール:
scenario-testplaywright-cliplaywright-cli スキルのコマンドを内部的に使用するtests/ ディレクトリの既存ファイル(tam-i18n.spec.ts 等)のスタイルを踏襲するplaywright.config.ts の設定(testDir, projects 等)に準拠するnavigateTo() ヘルパー等、共通パターンがあれば再利用するstorageState の活用を提案する(参考: playwright-cli/references/storage-state.md)