Skip to content
Latchkey

テストのshardingとは?

テストのshardingは、テストスイートを独立したスライスに分割し、別々のマシンやjobで同時に実行します。

shardingはマシンレベルの並列化です。すべてのテストを1つのrunnerで実行する代わりに、スイートをshardに分割します。4分の1、4分の2、といった具合に、それぞれを独自のrunnerで同時に実行します。スイートがどれだけ大きくなっても、実時間はおおよそ最も遅いshardの時間まで下がります。

shardingの仕組み

test runnerにshardの総数と、このjobがどのshardかを伝えます。runnerは各shardにテストのサブセットを決定的に割り当て、セット全体で各テストが正確に1回実行されるようにします。4つのshardを4つのrunnerで実行すると、直列の約4分の1の時間で終わります。

shardのバランス調整

ファイル単位やアルファベット順といった単純な分割は、1つのshardに遅いテストがすべて集まり、他がアイドルになることがあります。より賢い戦略は、各shardがおおよそ同じ実時間になるよう履歴上のtimingで分割します。バランスの取れた分割こそが理想的な速度向上に近づけます。

簡単な例

runnerはshardのインデックスと総数を伝えられ、スイートの自分のスライスだけを実行します。

Running one shard of four
playwright test --shard=2/4   # this job runs slice 2 of 4
jest --shard=2/4

shardingと並列化

  • sharding: 別々のjobやマシンに分割。
  • 並列化: 単一のjob内で同時実行。
  • 積み重なる: runner間でshardし、各内で並列化。
  • どちらも隔離され順序に依存しないテストが必要。

CIにおけるテストのsharding

CIのmatrixはshardごとに1つのjobを、それぞれ独自のrunnerで立ち上げるため、長いスイートは最も遅いshardの時間で終わります。速度向上は、投入できる高速runnerの数に比例します。Latchkeyは、高速なマネージドrunnerでshardを並列実行することで、これを安価に実現します。

重要なポイント

  • shardingはスイートをマシンに分割し、スライスを並列実行します。
  • timingでshardをバランス調整すると、理想的な速度向上に近づきます。
  • CIのmatrixはrunnerごとに1つのshardを実行し、大規模スイートを高速に終わらせます。

関連ガイド