テストシャーディングとは?
テストシャーディングは1つの大きなテストスイートをスライスに分割し、各スライスを別々のrunner上で並列に実行するため、30分のスイートが数分で完了します。
成長するテストスイートは、いずれpipelineの時間を支配するようになります。シャーディングはテストをN個のrunnerに分散し、各runnerが作業全体の1/Nのみを実行するようにします。最も遅いシャードが合計時間を決めるため、シャードのバランス調整は分割そのものと同じくらい重要です。
シャーディングの仕組み
runnerにシャードの総数と、それがどのシャードなのかを伝えます - たとえば --shard=2/4 のように。各runnerは割り当てられたテストのみを実行し、最後のステップで結果を統合します。
小さな例
shard: [1, 2, 3, 4] に対するmatrixは4つのjobを起動し、それぞれが playwright test --shard=${{ matrix.shard }}/4 を実行します。32分のスイートを4分割するとおよそ8分で完了し、加えてreportをmergeするための短いfan-inステップがあります。
シャードのバランス調整
ファイル数で分割すると偏りが生じます - 1つの遅いファイルがシャードを停滞させることがあります。優れたツールは過去の実行時間で分割し、各シャードがおおむね同じwall-clock時間になるようにして、最も遅いシャードを最小化します。
シャーディング vs 並列job
並列実行は異なるjobを同時に実行しますが、シャーディングは1つのjobの作業を分割して並列化します。シャーディングは通常、シャードのインデックスを列挙するmatrixと組み合わせて使われます。
結果の統合
各シャードは独自のreportを出力します。fan-inステップがそれらすべてをダウンロードし、単一のカバレッジとテストreportにmergeするため、レビュアーは4つの部分的な結果ではなく1つの統合された結果を見ることができます。
重要なポイント
- シャーディングはスイートをスライスに分割し、別々のrunner上で並列に実行します。
- ファイル数ではなく過去の実行時間でバランスを取り、最も遅いシャードを縮小しましょう。
- シャードのインデックスに対するmatrixとfan-inのmergeと自然に組み合わさります。