PR
 以前に筆者は,「Visual Studio Team Edition for Database Professionals(以下,Team Data)」がデータベース向けユニットテストのフルセット作成を可能にするリッチなインフラストラクチャを提供することを示した。だが,データベースのテストには,単なるユニットテスト以上のものが必要になる。実際のところ,データベース・テストの最も重要な側面の一つは,有益なテスト・データ・セットを用意することである。

 有益なテスト・データがなければ,実行したテストによってすべての問題が明らかになったと自信を持って言うことはできない。多くの場合,実際のデータに対してテストを行って初めて,テストに意味があるということができる。Team Dataは,現実的なテスト・データを作成してユニットテストを実施するときにも威力を発揮する。

テスト・データに関連する問題


 実際のデータを見ることを許可されていないので,そのデータに対してテストを行うことができない,という状況はよくある。実際のデータには,クレジット・カード番号,社会保障番号,給与情報など他人に見られたくない多種多様な個人情報などが含まれている可能性があるからだ。

 それでは,どのようにしてこの問題を回避すればいいのだろうか? ETL(Extract/Transform/Load)ツールを使えば,データの一部を切り出して,機密データを難読化することは可能だ。だがこのソリューションでは,システムがでたらめで不正確な形で表される可能性があるうえ,セットアップに多大な労力が必要になる。

 別のソリューションとして,必要なデータを生成するクエリーを使って,ランダムなテスト・データのセットを作成する方法がある。しかし残念ながら,このソリューションではデータの繰り返しが生じる可能性があるため,前述したソリューションと同様に,システムを正確に表すことはできない。ほかに,SQL Server 2005のTABLESAMPLEオプションを使ってデータをサンプル抽出し,それをテスト環境に持ってくることも可能だ。だがこのソリューションにも,外部キーを通して関連付けられているデータの取り扱いが難しい,実際のデータが危険にさらされる可能性がある,などの制限がある。

 たとえ十分なテスト・データを生成するという最初の問題を乗り越えられても,次の問題が待ち構えている。ユニットテストを行うとき(何度も行わなければならないこともあるだろう),毎回全く同じデータに対してテストを行っているということを,どのようにして確認すればいいのだろうか? 多くの場合,テストを行うとデータに変更が加えられるため,次回のテスト実行時にはデータが異なるものになっている。こうしたケースでは,テスト結果が一致しないかもしれない。上手くいっても,結論を下すに十分なテスト結果は得られないだろう。

Plan(プラン)を作成する


 Team Dataは,ユーザーが「Data Generation Plan(データ生成プラン)」を作成できるようにすることで,こうしたテスト・データに関連する問題を解決している。Data Generation Planは,テスト・データ・セットの生成方法を定義する機能を持つ。作成したData Generation Planを「Data Generator」機能が実行して,テスト・データを生成する。

 意味のあるプランを作成するには,データベースの種類,データ範囲,データ・シェイプ,テーブル間の正常なデータ分布などを理解しておく必要がある。これらはすべてData Generatorのインタフェース画面で設定可能だ(図1)。このインタフェースを使うと,テーブル間の関係を定義して,関係比率を定義できる。例えばデータ・シェイプに目を通して,顧客一人あたりの注文数が10であることがわかったら,この比率を定義して,その定義に当てはまるデータを生成できる。

図1●Data Generatorのインタフェース(クリックすると拡大表示します)

 さらに,Data Generation Planを使うと,プラン実行時に特定のテーブルのそれぞれのフィールドにどのデータが生成されるかを,正確に定義することが可能だ。内蔵されている九つのジェネレータの一つを使うか,あるいはカスタム・ジェネレータを作成することによって,このデータを定義することができる。

 Data Generatorを使って,すべての標準データ型用のデータを生成し,データ生成方法を定義する正規表現(すなわち,RegEXのこと)使用を可能にする「正規表現ジェネレータ」を組み入れることができる。RegEXを使ってフォーマットを定義したあと,ジェネレータにランダムな値を生成させることができる。注文番号,ZIPコード,電話番号などを生成するときに,この機能は便利だろう。

 Data Generatorはさらに,生成される全データにシード(seed)値を割り当てることによって,テストを実行するたびにデータが変更される危険を回避する。このシード値があることで,任意のData Generation Plan実行時に,Data Generatorは確実に全く同じテスト・データを生成する。シードを基にして,テスト・データを生成するからだ。

 これらのData Generation Planは手動で実行することもできるし,Team Dataのユニットテスト機能と組み合わせることもできる。ユニットテスト実行時には,Data Generation Planが作動して,テストを実行しているデータベースに対して同じテスト・データを展開するようにプランを特定のユニットテストに割り当てることが可能だ。