テストの並列化とは?
テストの並列化は、複数のテストを次々にではなく同時に実行し、スイートにかかる合計時間を短縮します。
直列に実行されるスイートは、すべてのテストの合計に等しい時間がかかります。並列化は、スレッド、プロセス、マシンをまたいで多くのテストを一度に実行するため、スイートはその何分の一かで終わります。ただし、並列テストは互いに干渉してはならず、そのため隔離が中心的な要件になります。
どう高速化するか
1,000個のテストのスイートが直列で10分かかるなら、10個の並列workerで実行すると1分近くまで短縮できます。速度向上は、最も遅い単一テストと作業がどれだけ均等に分割されるかによって上限が決まりますが、大規模なスイートでは効果は劇的です。
隔離の要件
同時に実行されるテストは、共有リソースをめぐって衝突しうります。同じデータベースの行、同じファイル、同じポートです。並列化は、各テストが独自の状態を持ち、隠れたグローバル依存を持たず、隔離されている場合にのみ機能します。順序や共有可変状態に依存するテストは並列実行で壊れます。
簡単な例
ほとんどのtest runnerは並列workerの数を設定するflagを公開しており、スイートをそれらに自動的に分割します。
Running tests in parallel
pytest -n 8 # run across 8 worker processes
jest --maxWorkers=8並列化とsharding
- 並列化: 1回の実行内で多くのテストを一度に。
- sharding: スイートを別々のマシンやjobに分割。
- この二つは組み合わさる: runner間でshardし、各内で並列化。
- どちらも隔離され順序に依存しないテストを必要とする。
CIにおけるテストの並列化
CIは並列化が最も効果を発揮するところです。長いスイートはすべてのmergeを遅らせるからです。テストを多数の高速runnerに分割し、各内で同時実行すれば、10分のスイートを1分のスイートに変えられます。Latchkeyはまさにこれを中心に構築されています。CIを高速に保つため、高速runnerでテストを並列実行します。
重要なポイント
- 並列化はテストを同時実行して実時間を短縮します。
- 衝突を避けるため、隔離され順序に依存しないテストが必要です。
- shardingと組み合わせると、大規模なCIスイートが高速に終わります。
関連ガイド
What Is Test Sharding?Test sharding explained: splitting a test suite across multiple machines or jobs to run in parallel, balancin…
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…
What Is a Flaky Test?Flaky tests explained: tests that pass and fail on the same code, the common causes, an example, the damage t…