テスト分離とは何か?
テスト分離とは、各テストが他のどのテストにも依存せず、また影響も与えずに独立して実行されることを意味します。
信頼できるテストスイートとは、各テストが単独で成立するものです。テスト分離とはその性質のことです。テストは自身の状態をセットアップし、アサーションを行い、後片付けをするため、その結果は前に何が実行されたかに決して依存しません。分離がなければ、テストは実行順序によって成功したり失敗したりし、不安定で並列化不可能になります。
分離に必要なこと
分離されたテストは、他のテストが残した状態を読まず、状態を残さず、可変のグローバルを共有しません。自身のフィクスチャを所有し、触れたものはすべてリセットし、実行順序について何の仮定も置きません。各テストはクリーンな実験です。
共有状態がスイートを壊す仕組み
テストが状態を共有すると、グローバル変数、データベースの行、シングルトンなどを通じて、あるテストが別のテストを成功または失敗させる状態にシステムを残すことがあります。こうしたスイートはある順序では動作し、別の順序では壊れ、失敗はランダムに見えます。バグは個々のテストではなく、その結合にあります。
簡単な例
各テストの前に共有状態をリセットすることで、あるテストが次のテストに漏れ出すのを防ぎます。
Enforcing isolation between tests
beforeEach(() => {
store.reset(); // clear state so tests do not bleed together
});分離のための手法
- セットアップとティアダウンで状態をリセットまたは再構築する。
- 各テストに独自のデータベーストランザクションまたはスキーマを与える。
- 共有の可変グローバルやシングルトンを避ける。
- 決定性のためにクロックと乱数をスタブ化する。
分離と並列CI
分離は、テストを並列およびシャードをまたいで実行するための前提条件です。並列テストは共有リソースをめぐって衝突してはならないからです。また順序に依存するflakeも防ぎます。よく分離されたスイートを別々のクリーンなrunnerで実行することはその独立性を強化し、これはLatchkeyが並列テスト実行を安定させる方法の一部です。
重要なポイント
- テスト分離とは、各テストが他から独立して実行されることを意味する。
- 共有状態は、順序に依存する不安定な失敗を引き起こす。
- 分離こそが並列およびシャード化されたCI実行を可能にする。
関連ガイド
What Is Test Parallelization?Test parallelization explained: running tests concurrently to cut wall-clock time, the isolation requirement,…
What Is Test Sharding?Test sharding explained: splitting a test suite across multiple machines or jobs to run in parallel, balancin…
What Is a Test Fixture?Test fixtures explained: the known, repeatable state a test runs against, setup and teardown, an example, and…
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…