フロントエンド開発といえば。
react アプリの初期化( npm init vite@latest <アプリ名> )

Playwright パラレル

Playwright パラレル

  • ディレクトリ構造は「ドメイン/機能」で分ける
  • 並列可否(衝突関係)は「メタ情報」として別レイヤーで表現する

構造(何のテストか)と 実行制約(どう実行できるか)を混ぜない

なぜ「並列可能集合ディレクトリ」はダメなのか

1. 並列可否は「性質」であって「所属」ではない

  • ドメイン:本質的・安定
  • 並列可否:環境・実装・時代依存
✗ tests/parallel-safe/
✗ tests/serial-only/

これは:

  • DB構造が変わる
  • テストデータが改善される
  • 並列制御が賢くなる

…だけで ディレクトリ再編が発生します。

2. 1テストが複数の制約を持てなくなる

現実のテストはこうです:

  • 機能:order
  • 制約:adminユーザー専用
  • 制約:状態遷移あり

ディレクトリ分割だと:

tests/order/
tests/serial/
tests/admin/

どこに置く?問題

3. 「なぜ直列なのか」が構造から読めない

tests/serial/order.spec.ts
  • なぜ serial?
  • 何と衝突する?
  • 将来並列に戻せる?

👉 理由がコードに残らない

Playwright 前提での「正解に近い設計」

1. ディレクトリはドメインで分ける

tests/
  auth/
  order/
  payment/
  admin/

2. 並列制約は describe レベルで表現する

Playwright には 公式に用意された解 があります。

test.describe('order lifecycle', () => {
  test.describe.configure({ mode: 'serial' });

  test('create order', async () => {});
  test('pay order', async () => {});
});
  • 構造:order ドメイン
  • 制約:この describe 内は直列

3. 複数ファイルにまたがる制約は「タグ」で表現

test('change global setting', { tag: '@global-lock' }, async () => {});
test('read global setting', { tag: '@global-lock' }, async () => {});

CI 側で:

# global-lock は worker=1 で実行
npx playwright test --grep @global-lock --workers=1

grepと逆grep

--grep <pattern>
--grep-invert <pattern>

具体例:排他グループが複数ある場合

@lock:global-setting
@lock:delivery
@lock:billing
// playwright.config.ts
export default defineConfig({
  projects: [
    {
      name: 'parallel-safe',
      grepInvert: /@lock:/,
    },
    {
      name: 'lock-global-setting',
      grep: /@lock:global-setting/,
      workers: 1,
    },
    {
      name: 'lock-delivery',
      grep: /@lock:delivery/,
      workers: 1,
    },
    {
      name: 'lock-billing',
      grep: /@lock:billing/,
      workers: 1,
    },
  ],
});

4. フェーズ実行(Wave / Batch)でグループ化

# GitHub Actions
- run: npx playwright test --grep-invert @serial
- run: npx playwright test --grep @serial --workers=1
  • フェーズ1:並列安全
  • フェーズ2:衝突あり

「グループ内並列・グループ間直列」

No.2701
12/23 18:06

edit