playwright-validation について
playwright-validation は、OpenMetadata の UI 変更と Playwright E2E テストの網羅性を確認するスキルです。ブランチとテストのレビューに加え、Playwright MCP でブラウザー検証を行い、不足シナリオの追加とリンター実行を案内します。
主な機能
- 01main との差分による UI 変更確認
- 02関連する E2E テストの検索とレビュー
- 03Playwright MCP によるフロー検証
- 04網羅性の不足とエッジケースの特定
- 05Playwright リンターによるテスト確認
活用シーン
- 01プルリクエスト前の UI 変更レビュー
- 02変更コンポーネントのテスト網羅性確認
- 03UI フローと API レスポンスの検証
- 04不足シナリオや権限テストの追加
MCP 対応
Playwright MCP を使い、ブラウザーの移動やページ状態の確認、検証中の UI 操作を行います。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ open-metadata/ openmetadata --skill playwright-validationインストール後、Claude Code で/playwright-validationを入力して読み込まれたか確認します。
詳細
Playwright 検証スキル
このスキルでは、UI の変更を検証し、包括的な Playwright E2E テストのカバレッジを確保する方法を説明します。
使用するタイミング
- UI 機能の開発完了後
- UI の変更に関する PR を作成する前
- UI 関連のブランチをレビューするとき
- 既存の Playwright テストがすべてのシナリオを網羅しているか確認するとき
ワークフロー
フェーズ 1:ブランチの変更を確認する
-
main と比較して変更されたファイルを特定します:
git diff main --stat git diff main --name-only | grep -E "\.(tsx?|less|css|scss)$" -
UI コンポーネントの変更に注目します:
git diff main -- "openmetadata-ui/src/main/resources/ui/src/components/**" --stat -
既存の Playwright テストを確認します:
git diff main --name-only | grep -E "playwright.*\.spec\.ts$" -
変更されたコンポーネントファイルを読み、UI の変更内容を把握します
フェーズ 2:既存の Playwright テストを確認する
-
関連するテストファイルを特定します:
- ページ単位のテストは
playwright/e2e/Pages/を確認します - 機能固有のテストは
playwright/e2e/Features/を確認します - Glob/Grep を使って、機能に関連するテストを探します
- ページ単位のテストは
-
テストのカバレッジを分析します:
- 既存のテストファイルを読みます
- すでに網羅されているテストシナリオを特定します
- UI の変更に基づき、カバレッジの不足箇所を確認します
-
テストユーティリティを確認します:
- ヘルパー関数は
playwright/utils/を確認します - エンティティクラスとフィクスチャは
playwright/support/を確認します
- ヘルパー関数は
フェーズ 3:Playwright MCP で検証する
-
ブラウザーを起動して移動します:
mcp__playwright__browser_navigate to http://localhost:8585 -
必要に応じて認証します:
- ログインには
mcp__playwright__browser_fill_formを使います - デフォルトの管理者:
[email protected]/admin
- ログインには
-
機能の該当エリアに移動します:
- 移動には
mcp__playwright__browser_clickを使います - ページの状態を確認するには
mcp__playwright__browser_snapshotを使います
- 移動には
-
UI の動作を検証します:
- 主なユーザーフローをテストします
- 視覚要素(アイコン、バッジ、ラベル)を確認します
- インタラクティブ要素(ボタン、ドロップダウン、フォーム)を確認します
- 状態の変化と API 呼び出しを検証します
-
調査結果を記録します:
- 正しく動作する点を記録します
- 問題や不足している機能を特定します
- 既存のテストでカバーされていないシナリオを列挙します
フェーズ 4:不足しているテストケースを追加する
-
不足しているテストシナリオのチェックリストを TodoWrite で作成します
-
不足しているテストケースごとに、次の手順を実施します:
a.
beforeAllに必要なテストフィクスチャを追加します:- 新しいエンティティインスタンス(TableClass、DataProduct など)を作成します
- 必要な関連付け(ドメイン、アセット)を設定します
b.
afterAllにクリーンアップを追加します:- 作成したエンティティを逆の順序で削除します
c. 次のパターンに従ってテストを記述します:
test('Descriptive Test Name - What it validates', async ({ page }) => { test.setTimeout(300000); await test.step('Step description', async () => { // Test actions and assertions }); await test.step('Next step', async () => { // More actions and assertions }); }); -
カバーするテストパターン:
- ハッピーパス(期待される動作)
- エッジケース(空の状態、最大値)
- エラー処理(無効な入力、リクエストの失敗)
- 状態遷移(アクションの前後)
- UI フィードバック(読み込み状態、成功/エラーメッセージ)
- 権限(無効化されたボタン、制限された操作)
-
Playwright の lint チェックを実行します:
yarn lint:playwrightplaywright/*とom-playwright/*のガードレールルールはすべてerror重大度です。リポジトリ全体のopenmetadata-playwright/*ルールはそれぞれ独自の重大度を設定しており、呼び出し箇所の移行中はwarnになっている場合があります。重大度を推測せず、ハンドブックの ESLint Enforcement テーブルにある重大度列を確認してください。
よく使うテストユーティリティ
ナビゲーション
import { sidebarClick } from '../../utils/sidebar';
import { redirectToHomePage } from '../../utils/common';
import { selectDataProduct, selectDomain } from '../../utils/domain';
待機
import { waitForAllLoadersToDisappear } from '../../utils/entity';
await waitForAllLoadersToDisappear(page);
await expect(page.getByTestId('content')).toBeVisible();
// NEVER use: page.waitForLoadState('networkidle') — blocked by ESLint
API レスポンス
const response = page.waitForResponse('/api/v1/endpoint*');
await someAction();
await response;
expect((await response).status()).toBe(200);
アサーション
await expect(page.getByTestId('element')).toBeVisible();
await expect(page.getByTestId('element')).toContainText('text');
await expect(page.locator('.class')).not.toBeVisible();
完了前のチェックリスト
- すべての UI の変更に対応するテストカバレッジがある
- テストで成功シナリオと失敗シナリオの両方をカバーしている
- テストで視覚的なインジケーター(アイコン、バッジ、状態)を検証している
- テストで API とのやり取りを検証している
-
yarn lint:playwrightがエラーなしで通る -
networkidle、page.pause()、test.only()を使用していない(ESLint によりブロックされます) - テストフィクスチャが適切に作成され、クリーンアップされている
- テストのタイムアウトには
test.slow()(推奨)またはtest.setTimeout()を使用している
例:データコントラクトの継承テスト
参考として、次のファイルにある包括的なテストカバレッジを参照してください。
playwright/e2e/Pages/DataContractInheritance.spec.ts
このファイルでは、次の内容を紹介しています。
- beforeAll での複数エンティティの設定
- ドメイン割り当てのパッチ処理
- コントラクトの作成と検証
- 継承アイコンの検証
- アクションボタンの状態の検証(無効/有効)
- API レスポンスの検証(POST と PATCH の比較)
- フォールバック動作のテスト