テストフィクスチャとは?
テストフィクスチャとは、テストが実行される対象となる固定された既知の状態とデータであり、テストの前にセットアップされ、後に片付けられます。
テストには予測可能な出発点が必要です。フィクスチャはそれを提供します。つまり、テストが開始前に前提とするデータベースの行、ファイル、オブジェクト、または設定です。毎回同じ状態を構築することで、フィクスチャはテストを再現可能かつ独立したものにします。これは信頼できるテストスイートの基盤です。
フィクスチャに含まれるもの
フィクスチャは、単一のオブジェクトほど小さいものから、シードされたデータベースほど大きいものまであります。重要なのは、システムを既知の状態に置くことで、テストが前回の実行から残った何かではなく、予測可能な入力に対して振る舞いを検証できるようにする点です。
セットアップとティアダウン
フィクスチャはテスト前のセットアップフェーズで作成され、テスト後のティアダウンフェーズで削除されます。ティアダウンはセットアップと同じくらい重要です。状態を残したままにすると、あるテストが次のテストを汚染し、テストの順序に依存する失敗を生み出す可能性があります。
実践的な例
テストごとのフィクスチャは、各テストの前に既知のユーザーをシードし、後でそれをクリアします。これにより、すべてのテストが同じクリーンな状態から始まります。
beforeEach(async () => {
await db.users.insert({ id: 1, name: "Ada" });
});
afterEach(async () => {
await db.users.clear();
});良いフィクスチャの習慣
- テストの意図が明確になるよう、フィクスチャは最小限に保つ。
- 順序への依存を避けるため、テスト間で状態をリセットする。
- 巨大な共有ダンプよりも、コードでフィクスチャを構築することを優先する。
- 読み手が前提条件を把握できるよう、フィクスチャを明示的にする。
フィクスチャと CI の決定論性
クリーンなフィクスチャと信頼できるティアダウンこそが、テストを任意の順序で、かつ並列に、互いに干渉することなく実行できるようにするものです。隔離された CI の runner では、実行ごとに新しい環境が用意されることでその決定論性が強化され、あるテストでのフィクスチャの漏れが別のテストを密かに壊すことがなくなります。job ごとの隔離は、Latchkey の runner が並列スイートを安定に保つ理由の一つです。
重要なポイント
- フィクスチャとは、テストが実行される対象となる既知の状態とデータです。
- セットアップがそれを構築し、ティアダウンがそれを削除してテスト間の汚染を防ぎます。
- クリーンなフィクスチャは、順序に依存せず並列実行でも安全なテストを可能にします。