テスト分離とは?解説
テスト分離とは、各テストが唯一のテストであるかのように実行され、他のどのテストとの間でも共有状態が漏れ込んだり漏れ出したりしないことです。
テストが状態を共有すると、その結果は前に何が実行されたか、そしてどう順序付けや並列化されたかに依存します。この結合はflakinessの古典的な原因です。あるスイートがある順序では通り、別の順序では失敗するのです。分離は結合を取り除き、各テストがクリーンで予測可能な出発点を持つようにします。
分離とは何を意味するか
分離されたテストは、他のどのテストにも依存せず、影響も与えません。自身のfixtureをセットアップし、自身のデータを使い、後で自身の後始末をします。単独で実行しても、最初に実行しても、最後に実行しても、並列で実行しても、結果は同じです。
何が分離を壊すか
- テスト間で持ち越される共有可変グローバルやシングルトン。
- 前のテストが汚したまま残したデータベースやファイルシステム。
- スイート全体で持続するモジュールレベルのcache。
- あるテストが別のテストのために状態を変える外部サービス。
なぜflakinessを防ぐのか
順序依存および並列度依存の失敗は、テストが状態を共有するときにのみ存在します。すべてのテストがクリーンに始まり何も残さなければ、実行される順序が結果を変えることはできません。テストの順序をランダム化するツールが有用なのは、まさに隠れた分離の失敗を露呈させるからです。
どう実現するか
各テストの前に状態をリセットまたは再作成します(ロールバックするトランザクション、新しい一時ディレクトリ、テストごとのデータベーススキーマ)。共有可変グローバルを避けます。何も漏れないようセットアップとティアダウンを対称にします。良い分離こそが、並列テスト実行を安全で高速にするものです。
Latchkeyの視点
分離はrunnerではなくあなたのテストスイートの性質なので、正しくするのはあなた次第です。しかしjobごとのクリーンなrunner環境は役立ちます。Latchkeyのmanaged runnerは各jobに新しいマシンを与え、自己修復が一時的なインフラの失敗を処理するため、残るflakinessは分離のバグをはっきりと指し示します。
重要なポイント
- テスト分離とは、各テストが共有状態なしに独立して実行されることです。
- 共有グローバル、汚れたデータベース、cacheは分離を壊します。
- 分離は順序依存および並列度依存のflakinessを取り除きます。
- テストごとに状態をリセットし、共有可変グローバルを避けます。