パラメータ化テストとタグ付け

1. なぜ「パラメータ化」と「タグ付け」が必要か

  • パラメータ化テストは “入力データ × シナリオ” の掛け算をコードの重複なしに実現し、網羅性とメンテナンス性を両立させる手法です。

  • タグ付けはテスト群にメタ情報を付与し、実行対象の絞り込みやレポートの分類を容易にします。CI/CD では「高速スモークだけ」「回帰だけ」のように切り替えられるため、総実行時間を短縮できます。


2. パラメータ化テスト(データドリブンテスト)

レイヤ 主な用途 実装ポイント
テストレベル 同一 spec 内で複数の入力値を回す 配列 .forEach() / for…oftest() を動的生成する
プロジェクトレベル ブラウザ・デバイス・ロケールなど環境差分 playwright.config.tsprojects 配列に組み込む
フィクスチャ拡張 “ユーザー種別”“権限”等の論理的パラメータ base.extend() でオプション or fixture を宣言し、projects で値注入

2.1 テストレベルのパラメータ化

ts
import { test, expect } from '@playwright/test'; [ { name: 'Alice', expected: 'Hello, Alice!' }, { name: 'Bob', expected: 'Hello, Bob!' }, { name: 'Charlie', expected: 'Hello, Charlie!' }, ].forEach(({ name, expected }) => { test(`greet ${name}`, async ({ page }) => { await page.goto(`/greet?name=${name}`); await expect(page.getByRole('heading')).toHaveText(expected); }); });

Playwright 公式は forEach ループの外側beforeEach/afterEach を配置することを推奨しています。フックをループ内部に書くと毎回実行され、テスト時間が増えるためです。playwright.dev

2.2 プロジェクトレベルのパラメータ化

ts
// playwright.config.ts import { defineConfig } from '@playwright/test'; export default defineConfig({ projects: [ { name: 'alice', use: { person: 'Alice' } }, { name: 'bob', use: { person: 'Bob' } }, ], });

npx playwright test で2プロジェクトが並列実行され、それぞれに person オプションが注入されます。playwright.dev

フィクスチャ拡張との組み合わせ

ts
import { test as base } from '@playwright/test'; export type Opts = { person: string }; export const test = base.extend<Opts>({ person: ['John', { option: true }], });

任意の値を fixture として受け取り、projects 側で上書きできます(多言語・多権限ユーザーなどに便利)。playwright.dev

2.3 ベストプラクティス

テーマ 推奨事項
テスト名の一意性 パラメータ文字列を test タイトルに含めて重複を避ける
フックの配置 beforeAll/afterAll をループ外に置き、速度・安定性を確保
並列実行 test.describe.parallel と併用しても OK だが、外部リソースが競合しないよう注意
データ分離 JSON/CSV から読み込み、テストロジックと分離するとメンテしやすい

3. タグ付け(@smoke, @critical など)

3.1 付け方 ― 新旧2つのシンタックス

ts
// ◆推奨: オブジェクト形式(v1.42~) test('ユーザー登録', { tag: ['@smoke', '@critical'] }, async ({ page }) => { … }); // ◆旧形式: タイトルに直接 test('ユーザー登録 @smoke @critical', async ({ page }) => { … });

Playwright 公式ブログでも新形式が推奨されています。dev.to

グループ全体に付与する場合:

ts
test.describe('レポート機能', { tag: '@report' }, () => { … });

playwright.dev

3.2 フィルタリング CLI

目的 CLI 例
単一タグのみ実行 npx playwright test --grep @smoke
タグを含むテストを除外 --grep-invert @wip
タグ OR 条件 `–grep “@smoke
タグ AND 条件 --grep "(?=.*@mobile)(?=.*@slow)"
NOT 条件 (HTMLレポーター) !@flaky (v1.52+ レポート UI) playwright.dev

設定ファイルでも grep / grepInvert が使えるため、CI ブランチごとに異なるデフォルトフィルタを設けることができます。

3.3 タグの可視化

  • HTML Reporter/VS Code 拡張/UI Mode のラベルとして表示され、失敗テストの絞り込みが容易

  • testInfo.tags 経由で カスタムレポーターからも取得でき、好きなフォーマットで出力可能

3.4 ベストプラクティス

シーン
粒度 @smoke, @regression, @payment, @mobile のように“実行頻度 × ドメイン”で命名
CI 戦略 プッシュ時=@smoke、夜間=全テスト、リリース前=@critical だけ失敗ゼロ確認
命名衝突回避 全タグを小文字+英数字に統一し、スペースは使わず @ で始める

4. 組み合わせ活用例

目的 具体例
ブラウザ × データ × 優先度 マトリクス projectsChrome/Firefox/WebKit, ループで ユーザーデータ10件, タグで @smoke / @full を付与
段階的テスト まず @api タグのユニットライクなテストを実行→通ったら @ui を含む E2E を実行
障害時の局所再実行 --grep "@checkout" で該当機能だけ再テストし、デバッグを高速化

5. まとめ

  • パラメータ化テストは入力や環境の組合せをコードの重複なく網羅し、projects と fixture 拡張でさらに柔軟に。

  • タグ付けは実行フィルタとレポート分類を担う“軽量メタデータ”。新シンタックス(オブジェクト形式)が推奨です。

  • 両者を併用すると、**「膨大なシナリオを高速に、必要なときだけ」**というテスト戦略を Playwright だけで完結できます。

これらを取り入れることで、CI/CD パイプラインの実行時間短縮とテストの保守性向上を同時に実現できます。

ChatGPT4o 生成日:2025/06/22