自動テスト用シードデータの作成
ユニットテスト、インテグレーションテスト、E2Eテストスイート用の決定論的で再現可能なテストデータを生成します。固定シードを活用して一貫したフィクスチャを作成します。
Use Cases
詳細な説明
再現可能なテストデータ
自動テストには決定論的なデータが必要です — すべてのテスト実行で完全に同じ入力を使用する必要があります。シードジェネレーターの決定論的擬似乱数ジェネレーター(PRNG)がこれを可能にします。
決定論の仕組み
ジェネレーターはシード付きPRNG(xoshiro128**)を使用します。同じ:
- SQLスキーマ
- 行数
- シード番号
が与えられると、出力は毎回バイト単位で同一です。つまり、テストデータを一度生成して検証し、将来の再生成が同じ結果を生むことを確信できます。
テストスイートのワークフロー
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ファイルをコミットして、テストセットアップステップでロードします。