メインコンテンツへスキップ
SDETRole
SDETRole

用語集 · UI 自動化

テストシャーディング(Test Sharding)

英語: Test sharding

別名: シャーディング, sharding, シャード, test shards

定義

テストスイートをシャードと呼ばれる単位に分割し、別々のマシンで同時に実行することで、長いスイートを数分の一の時間で終わらせる手法です。

シャーディングは、スイートを N 個のほぼ均等な部分に分け、それぞれを別のジョブとして、通常は別々の CI マシンで実行します。並列ワーカーより 1 つ上のレベルの仕組みです。ワーカーは 1 台のマシン内でテストを並行実行し、シャードはスイートを複数のマシンに分散させます。大規模な UI スイートのパイプライン時間を妥当な範囲に収めるには、この 2 つを組み合わせます。

例(Playwright と GitHub Actions)

Playwright はフラグ 1 つでシャーディングに対応しています。

npx playwright test --shard=1/4
npx playwright test --shard=2/4

CI ではマトリクスを使い、シャードごとに 1 つのジョブを起動します。各シャードが blob レポートを書き出し、最後のジョブがそれらを 1 つの HTML レポートにマージします。

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        shard: [1, 2, 3, 4]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - run: npm ci
      - run: npx playwright install --with-deps
      - run: npx playwright test --shard=${{ matrix.shard }}/4 --reporter=blob
      - uses: actions/upload-artifact@v4
        with:
          name: blob-report-${{ matrix.shard }}
          path: blob-report

マージ用のジョブは、すべての blob-report-* アーティファクトを 1 つのフォルダーにダウンロードし、npx playwright merge-reports --reporter html ./all-blob-reports を実行します。

テストの振り分け方

Playwright は、fullyParallel: true が設定されていない限りテストファイル単位で分割します。設定されている場合は、個々のテストをシャード間で均等に振り分けます。ファイル単位で分割する場合、巨大なスペックファイルが 1 つあると 1 つのシャードだけがほかよりずっと遅くなるため、ファイルは適度に小さく保ちましょう。

よくある間違い

  • 独立していないスイートをシャーディングする。 データを共有していたり順序に依存していたりするテストは、1 台のマシンでは合格しても、分割すると失敗します。まず独立性を確保しましょう。
  • 全体の結果を見失う。 マージの手順がないと、失敗が N 個のジョブログと N 個のレポートに散らばってしまいます。
  • シャードが多すぎる。 各シャードは、チェックアウト、インストール、ブラウザーのダウンロードという固定コストを毎回支払います。ある点を超えると、シャードを増やしても時間は短縮されず、コストだけが増えます。
  • fail-fast を有効のままにする。 1 つのシャードが失敗するとほかのシャードがキャンセルされ、残りの結果が失われます。

キーワードを入力すると SDETRole 全体を検索できます。

Pagefind による全文検索 · ブラウザ内で動作します 検索ページを開く →