テストの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/4shardingと並列化
- 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を実行し、大規模スイートを高速に終わらせます。
関連ガイド
What Is Test Parallelization?Test parallelization explained: running tests concurrently to cut wall-clock time, the isolation requirement,…
What Is a Test Matrix?Test matrices explained: running the same tests across combinations of OS, runtime versions, and configs, why…
What Is Test Isolation?Test isolation explained: why each test must run independently of others, how shared state breaks suites, an…
What Is a Test Runner?Test runners explained: the tool that discovers, executes, and reports on your tests, what features they prov…