シャーディング
WebdriverIOは、デフォルトでテストを並列実行し、マシン上のCPUコアを最適に活用するように努めます。さらに並列化を進めるために、複数のマシンで同時にテストを実行することで、WebdriverIOテスト実行をさらに拡張できます。この動作モードを「シャーディング」と呼びます。
複数マシン間でのテストのシャーディング
テストスイートをシャーディングするには、コマンドラインに`--shard=x/y`を渡します。たとえば、スイートを4つのシャードに分割し、それぞれがテストの4分の1を実行するには、次のようにします。
npx wdio run wdio.conf.js --shard=1/4
npx wdio run wdio.conf.js --shard=2/4
npx wdio run wdio.conf.js --shard=3/4
npx wdio run wdio.conf.js --shard=4/4
これらのシャードを異なるコンピューターで並列に実行すると、テストスイートは4倍の速さで完了します。
GitHub Actionsの例
GitHub Actionsは、`jobs.<job_id>.strategy.matrix`オプションを使用して、複数のジョブ間でテストをシャーディングすることをサポートしています。matrixオプションは、提供されたオプションのすべての可能な組み合わせに対して個別のジョブを実行します。
次の例は、4台のマシンで並列にテストを実行するようにジョブを設定する方法を示しています。パイプライン設定全体は、Cucumber Boilerplateプロジェクトにあります。
- 最初に、作成するシャードの数を含むshardオプションを使用して、ジョブ設定にmatrixオプションを追加します。`shard: [1, 2, 3, 4]`は、それぞれ異なるシャード番号を持つ4つのシャードを作成します。
- 次に、`--shard ${{ matrix.shard }}/${{ strategy.job-total }}`オプションを使用してWebdriverIOテストを実行します。これは、各シャードのテストコマンドになります。
- 最後に、wdioログレポートをGitHub Actions Artifactsにアップロードします。これにより、シャードが失敗した場合にログを利用できるようになります。
テストパイプラインは次のように定義されています。
name: Test
on: [push, pull_request]
jobs:
lint:
# ...
unit:
# ...
e2e:
name: 🧪 Test (${{ matrix.shard }}/${{ strategy.job-total }})
runs-on: ubuntu-latest
needs: [lint, unit]
strategy:
matrix:
shard: [1, 2, 3, 4]
steps:
- uses: actions/checkout@v4
- uses: ./.github/workflows/actions/setup
- name: E2E Test
run: npm run test:features -- --shard ${{ matrix.shard }}/${{ strategy.job-total }}
- uses: actions/upload-artifact@v1
if: failure()
with:
name: logs-${{ matrix.shard }}
path: logs
これはすべてのシャードを並列に実行し、テストの実行時間を4分の1に短縮します。
Cucumber Boilerplateプロジェクトのコミット`96d444e`を参照してください。このコミットでは、テストパイプラインにシャーディングが導入され、全体の実行時間が`2:23分`から`1:30分`に短縮され、**37%**の削減 🎉 が実現しました。