合成テストデータとは、収集されたものではなく製造されたデータです。誰も記述せず、必要に応じて再生成でき、マスキング、パージ、召喚状の対象になることもありません。住所フォーム、チェックアウトフロー、インポートパイプラインをテストするチームにとって、CI、スクリーンショット、デモで自由に使える唯一の種類のデータです。
注意点は、合成データが有用になるのは、もっともらしくかつ安全な場合だけだということです。もっともらしくないデータはバグを見逃します。安全でないデータはバグを生みます。このガイドでは中間の道を扱います。再現性のためのシード付き生成、現実と衝突しない予約済み値範囲、エンティティ間の参照整合性、そしてジェネレーターが生成を拒否すべき特定の識別子です。
実際に合成データと見なされるもの
合成データは人からサンプリングされるのではなく、ルールから生成されます。名前リストから組み立てられた名前、国別フィクスチャから組み立てられた住所、予約済みブロックからの電話番号、予約済みドメインのメールアドレス。いずれも製造されたものであり、実在の対象を指すものはありません。再現性がランダムノイズとの違いを生みます。シードなしの出力はレビュー、差分比較、再生ができないからです。
匿名化された本番データは合成データではありません。実在の行をマスキングしても同じ分布が残り、多くの場合同じ再識別リスクも残ります。ドメインを保持したままマスキングされた EMAIL 列は、依然として雇用主を漏らします。テストに本番同様の形のデータが必要なら、それは集約とアクセスに関する別の議論であり、ジェネレーターが正直に提供できるものではありません。
- 人からサンプリングするのではなく、ルールから生成される
- シードから再現可能
- レビュー可能:差分が何が変わったかを示す
- 本番の行から派生することは決してない
シード付き生成とコミットされたフィクスチャファイル
コミットされたフィクスチャファイルには利点が1つあります。検査が簡単なことです。問題はいくつかあります。スキーマが変わっても誰も更新しないため、ドリフトします。リポジトリを肥大化させます。どのバージョンが最新か誰も分からなくなるまでプロジェクト間でコピーされます。そして、いつの間にか誰もがテストする唯一のデータになり、スイートは2021年に誰かが入力した値だけをカバーするようになります。
シード付き生成は入力を小さく、出力を大きく保ちます。シードとジェネレーターのバージョンがフィクスチャです。必要に応じて再生成し、レビュー用に最初と最後のレコードだけをスナップショットし、ジェネレーター出力の変更は再ベースラインを必要とする意図的な変更として扱います。唯一の要件はジェネレーターを固定することです。アルゴリズムが変わったアップグレード版ジェネレーターは、同じシードでも新しいデータセットになるからです。
| アプローチ | リポジトリコスト | 再現可能 | ドリフトリスク |
|---|---|---|---|
| コミットされた JSON フィクスチャ | 高 | はい、ただし固定 | 経年で上昇 |
| テスト時のシード付きジェネレーター | 低 | はい、バージョン固定時 | 低 |
| シードなしランダムデータ | 低 | いいえ | 高、かつ不安定 |
| マスキングされた本番ダンプ | 高 | いいえ | 高、加えてプライバシーリスク |
現実と衝突しない予約済み範囲
いくつかの標準は、ドキュメントとテスト用に値を予約しています。それを使うことはスタイルの好みではなく、保証された無害なフィクスチャと、誰かのものかもしれないフィクスチャの違いです。予約済みブロックは安定しており、広く文書化され、ほとんどのバリデーターが構文的に正常なものとして受け入れます。
メールには、予約済みで登録できない .test 配下のドメイン、たとえば example.test を使います。北米番号計画の電話番号には、555-0100 から 555-0199 のブロックがフィクション用に予約されています。IP アドレスには、IPv4 では 192.0.2.0/24、198.51.100.0/24、203.0.113.0/24、IPv6 では 2001:db8::/32 がドキュメント用範囲です。MAC アドレスには、ドキュメント用範囲が 00-00-5E-00-53-00 から 00-00-5E-00-53-FF で、U/L ビットを設定したローカル管理アドレスもフィクスチャに安全です。
| 値の種類 | テスト用予約 | 根拠 |
|---|---|---|
| メールドメイン | example.test、example.com、example.org | RFC 2606 および RFC 6761 |
| Web ドメイン | .test、.invalid、.localhost | RFC 2606 |
| 米国・カナダの電話 | NANP 555-0100 から 555-0199 | NANP フィクション範囲 |
| IPv4 ドキュメント | 192.0.2.0/24、198.51.100.0/24、203.0.113.0/24 | RFC 5737 |
| IPv6 ドキュメント | 2001:db8::/32 | RFC 3849 |
| MAC ドキュメント | 00-00-5E-00-53-xx | RFC 7042 |
| ローカル管理 MAC | 先頭オクテット 0x02、I/G ビットクリア | IEEE 802 U/L ビット |
生成されたエンティティ間の参照整合性
ほとんどのシステムは複数のエンティティを必要とします。注文には顧客、配送先住所、請求先住所があり、スキーマが強制する方法で3つが一致しなければなりません。請求先住所が米国にあり、配送先住所が日本にある場合、税計算と配送業者の選択がその組み合わせを受け入れなければ、テスト対象の動作とは無関係な理由でテストが失敗します。
行ではなく関係を生成します。子シードを親シードから導出し、注文とその住所が1つの単位として再現可能になるようにします。どのフィールドが一致しなければならないかを意図的に決めます。配送先と請求先の国は通常同じ、郵便番号はフィクスチャの都市と一致、通貨は国と一致。これらの制約をファクトリにエンコードし、壊れたフィクスチャが3層下のアサーションではなく生成時に失敗するようにします。
- 子シードは時計ではなく親シードから導出する
- 請求先、配送先、税で国を一貫させる
- 郵便番号を都市フィクスチャと一貫させる
- 通貨を国と一貫させる
- 制約違反時は生成時に失敗させる
このサイトが生成を拒否するもの
このサイトは社会保障番号、支払カード番号、IMEI または IMSI の値、Bluetooth デバイスアドレス、シリアル番号を生成しません。各拒否には理由があります。SSN は米国で法的に制限された識別子です。カード番号には Luhn チェックサムがあるため、もっともらしいものは素朴なバリデーターを通過し、その後サポートチケットに貼り付けられる可能性があります。IMEI にはチェックディジットと割り当てレジストリがあります。Bluetooth アドレスは MAC 形式を共有しますがベンダーの意味を持たず、生成されたものは MAC ツールが避けるように設計されている混乱を招きます。
同じ理由がチェックサムやレジストリを持つあらゆる識別子に当てはまります。テストに本当に必要な場合は、ジェネレーターではなく、プロセッサまたは発行機関が公式に公開したテスト値を使用してください。そうすれば、テストパターンを認識する人には明らかに偽物であり、スクリーンショットがコンプライアンスレビューの対象になることもありません。
| 識別子 | ここで生成 | 正しい代替 |
|---|---|---|
| 社会保障番号 | いいえ | 実在または現実的な SSN は決して使わない |
| 支払カード番号 | いいえ | サンドボックス用のプロセッサテストカード |
| IMEI または IMSI | いいえ | 存在する場合はベンダーのテスト値 |
| Bluetooth アドレス | いいえ | 住所フォームのテストには不要 |
| デバイスシリアル番号 | いいえ | 自分で管理する不透明なフィクスチャ ID |
| メールアドレス | はい、example.test のみ | 安全で解決しないドメイン |
| 電話番号 | はい、NANP 555-0100 から 555-0199 | 予約済みフィクション範囲 |
ボリューム、決定性、パフォーマンス
テスト時に100レコードを生成するのは安価です。1000万レコードはそうではなく、テストセットアップ内で行うと実行時間を支配します。大量ボリュームは一度だけ分離されたストアに事前計算し、シードをマニフェストに記録し、ジェネレーターをホットパスから外します。中程度のボリュームでは、行ごとではなく単一バッチで生成します。行ごとのセットアップが実際のコストであることが多いからです。
決定性にはパフォーマンスの側面もあります。並列ワーカーが単一の逐次ジェネレーターを共有してはいけません。インターリーブによってどのワーカーがどのレコードを得るかが変わるからです。各ワーカーに実行シードとワーカーインデックスから導出した独自のシードを与え、スケジューリングに関係なくデータセットが安定するようにします。これにより、スイート全体を再実行せずにワーカー3の失敗を再現できます。
- 小ボリューム:インラインでシード付き生成
- 大ボリューム:マニフェスト付きで分離ストアに事前計算
- 並列ワーカー:ワーカーインデックスごとにシードを導出
- スレッド間で単一のジェネレーターインスタンスを共有しない
- シードとともにジェネレーターバージョンを記録する
合成データを実際のパイプラインに入れない
優れた合成データの危険は、本物に見えることです。生成されたすべてのレコードにマーカーを付けます。フィクスチャフラグ、専用テナント、example.test のメール、555-01xx 範囲の電話。それらのレコードがメール送信、支払い取得、分析への流入を行うことをブロックします。本番 CRM に到達したデモ顧客は、営業担当者が気づくのを待つサポートインシデントです。
また、コンプライアンスのために保持されるログや、公開されるスクリーンショットから生成データを遠ざけます。値が誰も記述していなくても、読者は画像からそれを判断できず、後で説明する方が今ラベルを付けるより高くつきます。スクリーンショットに現実的な住所を表示する必要がある場合は、ドキュメント範囲の値を使い、目に見える「サンプルデータ」キャプションを追加します。
- 生成されたすべての行にフィクスチャフラグまたはテナントを付ける
- フィクスチャテナントをメール、支払い、分析からブロックする
- example.test と 555-01xx を使い、もっともらしい実在ドメインは決して使わない
- 生成値を表示するスクリーンショットにキャプションを付ける
- 共有ステージングからフィクスチャを定期的にパージする
使用前レビューチェックリスト
生成されたデータセットを共有環境で使用する前に、4つの質問に答える必要があります。どこから来たのか、再生成できるのか。すべての値が予約済みまたはローカル管理範囲にあるか。スキーマ制約と参照ルールを満たしているか。そして、人間の読者が顧客と誤認しないようにラベル付けされているか。
いずれかの答えが「いいえ」なら、データセットは準備できていません。これは意図的に厳格です。誤った答えのコストは非対称だからです。再生成には数分かかる一方、収益レポートに合成顧客がいると四半期にわたって意思決定を歪める可能性があります。チェックリストは wiki のコメントではなく、レビューの一部として実行してください。
| 質問 | 合格条件 | 証拠 |
|---|---|---|
| 出所 | シードとジェネレーターバージョンが記録されている | マニフェストファイル |
| 安全性 | すべての値が予約済みまたはローカル範囲 | データセットに対するバリデーター実行 |
| 整合性 | スキーマとエンティティ間ルールを満たす | ファクトリテストがグリーン |
| ラベリング | すべての行にフィクスチャフラグ | クエリがラベルなし行ゼロを返す |
よくある質問
- はい、すべての値が合成かつ予約済みの場合、たとえば example.test のメールと NANP 555-01xx の電話です。大規模データセットをコミットするより、シードから再生成することを優先してください。
- それらの識別子は規制対象またはチェックサム付きであり、現実的な偽物は素朴な検証を通過してスクリーンショットやチケットに残る可能性があります。代わりにプロセッサまたは当局の公式テスト値を使用してください。
- 実行シードとワーカーインデックスからワーカーごとにシードを導出します。単一の共有ジェネレーターはスケジューリングに応じて異なるシーケンスを生成します。
- いいえ。マスキングは元の分布を保ち、多くの場合再識別リスクも保ちます。合成データはルールから生成され、実在の対象を記述しません。
- 38か国、それぞれ5つの都市フィクスチャ付きです。香港とアラブ首長国連邦は郵便番号を持たないため、郵便番号を返しません。
合成テストデータをコミットしても安全ですか?+
ジェネレーターがカードや SSN の値を生成するのを拒否するのはなぜですか?+
並列テストの再現性を保つにはどうすればよいですか?+
マスキングされた本番データは同じものですか?+
合成住所データは何か国をカバーしていますか?+
例は合成データです。生成された住所を本人確認、アカウント登録、配送に使用しないでください。