アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

大量のテストデータを作る

WEBアプリ・データベースにデータを作る話。

少なくとも自分の場合、テストデータを作るときは大きく分けて下記の3パターンがあります。

  • ロジックのテスト等の用途で、パターンを網羅したデータを揃える
  • 負荷テスト等の用途で、中身をランダムにしたデータをたくさん用意する
  • 結合テスト以降

ロジックのテスト等の用途で、パターンを網羅したデータを揃える

よほど膨大な件数になるわけでないのなら、
Excelでパターンを表にまとめ、それをそのままINSERT文に加工するのが一番早いです。
そのExcelはテスト時のチェックリストとしても使用できますし…。

結合テスト以降

通常の操作での作成が困難なデータでもない限り、データベースの直接操作は極力控えるべきです。

尚、WEBアプリではないのですが、以前はテストの自動化にIBMのRFTを使用していたこともあります。
シェアウェアですが、無料期間もあります)
放置しておくだけで、あらかじめ決めておいたデータを入力してくれます。
スクリーンショットなども撮っておいてくれます。
ただし、このためのコーディングにも若干工数がかかるので、1回限りの使用であれば手作業の方が早いかもしれません。
開発や保守期間の長い中~大規模プロジェクト向けだと思います。

参考:Rational Functional Tester -IBM
http://www-03.ibm.com/software/products/ja/functional

負荷テスト等の用途で、中身をランダムにしたデータをたくさん用意する

ランダム値で大量なINSERT文を生成したいときは専用のコードを書いてしまいます。

下記のサンプルでは、
`table`テーブルのカラム `id`,`hoge`,`fuga`,`up_date`
に、それぞれ
連番、1~10のランダム値、「test+ランダム値」文字列、現在日時
を1万行INSERTしています。

前半部分でテーブル名やフィールド名などを設定し、それに合わせてINSERT文を作成し実行します。
作業用なので別にきっちりやる必要はないのですが、いつもの癖でプレースホルダを使用。

public function makeTestData()
{
    // >> テーブル情報などの設定 >>>>>>>>>>>>>>>>>>>>>>>>>
    
    // テーブル名
    $table = "table";

    // フィールド名
    $column_list = array(
        "id",
        "hoge",
        "fuga",
        "up_date",
    );

    // 作成レコード数
    $record_count = 10000;
    
    // INSERTする値
    $value_list = array();
    for ($i = 0; $i < $record_count; $i ++)
    {
        $value_list[] = $i + 1;               // id
        $value_list[] = rand(1,10);           // hoge
        $value_list[] = "test_" . rand(1,10); // fuga
        $value_list[] = date("Y-m-d H:i:s");  // up_date
    }

    // << ここまで <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    
    // SQL生成
    $sql  = "INSERT INTO `" . $table . "` ";
    $sql .= "(" . implode("," ,$column_list) . ") ";
    $sql .= "VALUES ";
    for ($i = 0; $i < $record_count; $i ++)
    {
        if ($i > 0)
        {
            $sql .= ",";
        }
        $sql .= "(" . implode(",", array_fill(0, count($column_list), "?")) . ")";
    }

    // 実行
    // (※各環境に合わせた実行方法でどうぞ)
}

ただし、この程度の単純なデータであればSQLクエリだけで済ませることもできます。

idはauto_increment設定、up_dateはcurrent_timestamp設定にでもしておき、
適当な1レコードをINSERTして、あとは以下のようなクエリを繰り返し打つだけ。

INSERT `table` (`hoge`, `fuga`)
SELECT CEIL(RAND() * 10), CONCAT('test', CEIL(RAND() * 10))
FROM   `table`;

実行するごとに
1件→2件→4件→8件→16件…
と増えるので、増えすぎには注意です。

参考:MySQLで簡単にランダムなテストデータを作成する方法 - Qiita
http://qiita.com/tayasu/items/c5ddfc481d6b7cd8866d

また、ブログ移転前の当記事のコメントで教えていただきましたが、
以下のようなExcel拡張機能を使う(いっそ作る?)こともできそうです。

参考:Excelの作業効率アップ-2 擬似個人情報データ作成(複数シート) - 経理兼SE担当の10年間の纏めから厳選した無駄のない100Excel拡張機能!
http://superdbtool.blog.jp/archives/490043.html