自動テスト用シードデータの作成

ユニットテスト、インテグレーションテスト、E2Eテストスイート用の決定論的で再現可能なテストデータを生成します。固定シードを活用して一貫したフィクスチャを作成します。

Use Cases

詳細な説明

再現可能なテストデータ

自動テストには決定論的なデータが必要です — すべてのテスト実行で完全に同じ入力を使用する必要があります。シードジェネレーターの決定論的擬似乱数ジェネレーター(PRNG)がこれを可能にします。

決定論の仕組み

ジェネレーターはシード付きPRNG(xoshiro128**)を使用します。同じ:

  1. SQLスキーマ
  2. 行数
  3. シード番号

が与えられると、出力は毎回バイト単位で同一です。つまり、テストデータを一度生成して検証し、将来の再生成が同じ結果を生むことを確信できます。

テストスイートのワークフロー

1. スキーマを定義(CREATE TABLE文)
2. 固定シード(例:seed = 42)でシードデータを生成
3. フィクスチャ用にJSONとして、またはデータベースセットアップ用にSQLとしてエクスポート
4. 生成したファイルをテストディレクトリにコミット
5. テストで参照:
   - beforeAll: シードデータをINSERT
   - afterAll: DELETEまたはロールバック

JSONフィクスチャの例

シードデータをJSONとしてエクスポートし、テストでインポート:

import users from './fixtures/users.json';

describe('UserService', () => {
  beforeAll(async () => {
    await db.users.createMany({ data: users });
  });

  it('finds user by email', async () => {
    const user = await userService.findByEmail(users[0].email);
    expect(user).toBeDefined();
    expect(user.first_name).toBe(users[0].first_name);
  });
});

SQLセットアップスクリプト

実際のデータベースに対して実行するインテグレーションテストでは、シードデータをSQL INSERT文としてエクスポートし、テストセットアップで実行:

-- test/setup.sql(Database Seed Generatorで生成)
INSERT INTO users ("first_name", "last_name", "email") VALUES ('James', 'Smith', 'james.smith42@gmail.com');
...

決定論的シードの利点

  • 再現可能な失敗: テストが失敗した時、完全に同じデータで再実行可能
  • コードレビュー: レビュアーがフィクスチャを再生成して検証可能
  • CIの一貫性: すべてのCI実行が同一データを使用し、ランダムデータによるフレーキーさを排除

ユースケース

チームがCIでPostgreSQLデータベースに対してインテグレーションテストを実行しています。各テスト実行にはユーザー、商品、注文の一貫したセットが必要です。固定シードでシードデータを一度生成し、SQLファイルをコミットして、テストセットアップステップでロードします。

試してみる — Database Seed Generator

フルツールを開く