偽のテストデータ生成ツール

QAやデータベースのテストのために、名前・メールアドレス・電話番号・住所など、本物らしく見えるが完全に架空のテストデータを行単位で生成します。ここで生成されるデータは実在の人物とは一切関係ありません。

247回閲覧

以下のデータはすべてテスト目的のためだけにランダムに作成されたものであり、実在の人物を表すものではありません。

実際のユーザーデータでテストすることがなぜ良くない習慣なのか

本番環境の顧客テーブルの一部をエクスポートして開発用データベースに投入するのは便利に思えますが、これは企業が個人データを誤って漏洩させる最も一般的な方法の一つです。EUのGDPRやトルコのKVKKのような規制の下では、個人データは収集された特定の目的にのみ処理され、その目的にふさわしいセキュリティで保護されるべきとされています — ステージング環境や開発環境は、本番環境に比べて日常的にはるかに管理が緩く、すべてのエンジニアがアクセスできることが多く、時にはより安全性の低いストレージにログやバックアップが残ることさえあり、ステージングURLが検索エンジンにインデックスされたり、テストサーバーの設定を誤ったりすることで、誤って公開されてしまうこともあります。そのレベルの露出に対して一度も監査されていないデータベースに、実在の顧客の名前、メールアドレス、電話番号、住所が置かれていることは、コンプライアンスとセキュリティ上の教科書的なリスクです。「デモで本番データを使ってしまった」というのは、実際のデータ漏洩事後検証で繰り返し登場するフレーズです。架空のデータを使えば、この問題全体を回避できます — 通知すべき実在の人物もおらず、正当化すべき同意の根拠もなく、テストデータベースが漏洩しても報告すべき侵害もありません。なぜなら、その行はそもそも誰にも対応していないからです。

コンプライアンスの観点を超えて、架空のテストデータは単純にQAにとってより有用でもあります。実際の本番データは、既存のユーザーがたまたまどのような姿をしているかを反映しているにすぎません — テスターが実際に必要とするエッジケース、たとえば珍しい文字を含む名前、空のオプションフィールド、最大長の文字列、フォームが受け付けるすべての入力にまんべんなく分布したデータなどを、確実に含んでいるとは限りません。合成生成であれば、量と形を正確に制御できます。このツールでは1〜100行をリクエストでき、どのフィールドを生成するかも正確に選べます — これは実際の顧客エクスポートでは決して想定されていなかったワークフローです。

乱数はどのように機能しているのか

ここでのすべての値 — どの名前を選ぶか、どの都市を選ぶか、電話番号のどの桁になるか — は、Math.random()ではなく、Web Crypto APIの暗号論的に安全な乱数源であるcrypto.getRandomValues()を使って選ばれています。正確に言うと、テスト用の行に偽の名前を割り当てること自体の実際のセキュリティ上のリスクはほぼゼロであり、パスワードやセッショントークンの生成のような意味でのセキュリティ要件ではありません。それでもこのツールがこれを使っている理由は、正しいデフォルトの習慣を示すためです — Math.random()は高速ですが暗号論的ではない疑似乱数生成器であり、その出力は原理的に環境をまたいで予測または再現され得ます。一方crypto.getRandomValues()はOSの安全なエントロピー源から値を取り出すもので、予測不可能性が求められる場面では常に正しい選択です。そのためデフォルトでこちらを使う習慣をつけておけば、割引コードやリセットトークンの生成のように予測可能性が実際に問題となる場面でMath.random()を使ってしまうという間違いを避けられます。モジュロバイアス(乱数の範囲が出力空間をきれいに割り切れないときに、一部の値がほんのわずかに他より出やすくなる微妙な偏り)を避けるため、各抽選では棄却サンプリングを使用しています。その偏りを生む値は破棄され、再度抽選し直されます。

  • 言語ごとに独立した名前・都市のプール: 「トルコ語」データを選ぶと、トルコ語専用の名・姓・都市のプールから生成されます。「英語」を選ぶと、別の英語専用プールから抽出されるため、データは無関係な命名規則の寄せ集めではなく、ロケールとして一貫したものになります。
  • 架空ドメインのみを使用: 生成されるメールアドレスは常にexample.com、example.org、example.netを使用します。これらはRFC 2606によってドキュメントおよびテスト用途向けに正式に予約されているドメインであり、誤ってどこかにメールを届けてしまう可能性のある、登録可能な実在のドメインが使われることはありません。
  • CSVエクスポートはRFC 4180形式: フィールドはカンマ区切りで引用符に囲まれているため、カンマ、引用符、改行を含む値であっても、Excel、Googleスプレッドシート、あるいは標準準拠のCSVインポーターで正しく解析されます。
  • 完全にローカルで処理: 生成はブラウザ内で行われます。サーバーに何かが送信されたり、記録されたり、ダウンロードしたファイル以外のどこかに保存されたりすることはありません。

よくある質問

このデータは実在するもの、あるいは実在の人物にたどり着けるものですか?

いいえ。すべての行は、このツール専用に構築された固定の名前・都市・会社名・ドメインのプールから値をランダムに組み合わせて作られています。実在の人物、顧客リスト、外部データソースとの照合は一切行われません — 実在の個人との類似があった場合、それは偶然によるものです。

このツールがMath.random()ではなくcrypto.getRandomValues()を使っているのはなぜですか?

ここでのセキュリティ上のリスクは低いのですが、このツールは意図的に正しいデフォルトの習慣を示しています。crypto.getRandomValues()はOSの安全なエントロピー源から値を取り出し、Math.random()が持つ予測可能性のリスクを回避します。そのためこれをデフォルトで使うことは、トークンやコードのように予測可能性が実際に問題になる場面で正しい直感を養うことにつながります。

これを本番環境や共有データベースに投入するために使えますか?

このツールはQA、ステージング、ローカル開発でのテストのために作られたものであり、顧客向けの何かを埋めるためのものではありません。値はランダムに生成されるため、異なる生成回にわたって名前やメールアドレスが重複する可能性があり、それはチェックされません。

生成されるメールドメインが常にexample.comなどになるのはなぜですか?

example.com、example.net、example.orgは、RFC 2606によってドキュメントおよびテスト専用に永続的に予約されているドメインであり、実在の組織に割り当てられることは決してありません — これらを使うことで、誰かが実際に所有しているドメインで誤って偽のアドレスを生成してしまうという、小さいながらも現実のリスクを避けられます。

CSVダウンロードの形式は何ですか?

RFC 4180に準拠しています。フィールドはカンマ区切りで、各値は二重引用符で囲まれ、内部の引用符はエスケープされ、改行はCRLFです — これはExcel、Googleスプレッドシート、そしてほぼすべてのデータベースインポートツールがデフォルトで想定する形式です。

コメント

まだコメントはありません — 最初のコメントを書いてみましょう!

関連ツール