• 締切済み

テストデータ作成に苦労しています

テストデータ作成のための良いツールはないでしょうか。 今のところ、Oracle SQL Developer や Visual Studio のサーバーエクスプローラー、OSqlGridなど を使って、手作業でテストデータを作っています。 いずれも、グリッド編集的な機能によって、手作業でそれぞれのテーブルに対してデータを入力 しています。 (一度作ったデータは、再度クリーンな状態から再現するために、最終的に SQLのINSERT文に して保存しています) 1テーブルあたりのテストデータ件数は10件から50件程度なのですが、 つらいなあ、と思うのは、例えば「テーブルA」の明細レコードとして「テーブルA-1」のような テーブルがあり、テーブルA-1のさらなる明細レコードとして「テーブルA-2」がありまして、 そういった場合、上記のツールを使っている場合、それぞれに紐付くレコードを把握しつつ管理 するのが大変です。 テーブル構成を管理しているのは客先なのですが、カラムが増えたり移動(別のテーブルに移動) したりして、末端の人間としては、既に作成したテストデータを変更するのが大変だ、という 悩みもあります。 テストデータ作成及び管理に良いツールはないでしょうか。 あるいは当該プロジェクトのための専用ツールを作った方が良いでしょうか。

  • Oracle
  • 回答数2
  • ありがとう数3

みんなの回答

  • IAmJudy
  • ベストアンサー率100% (1/1)
回答No.2

テストデータ作成及び管理に良いツールなら、SuperDBToolとSuperDevToolをお勧めしますよ。今は無料で公開しています。速めにダウンロードに行ってください。 http://www.google.co.jp/search?hl=ja&q=superdbtool&lr=&aq=f&oq= データの関係で一括でデータを作るツールです。

  • uresiiwa
  • ベストアンサー率45% (49/107)
回答No.1

テストデータ生成ツールについていくつか調べたり使ったりしたこともありますが、書いておられるようなことは特にツールを使って行わないとできないようなことではないような気がします。 よって、自力でツール化のほうがお勧めですね。 >いずれも、グリッド編集的な機能によって、手作業でそれぞれのテーブルに対してデータを入力しています。 >(一度作ったデータは、再度クリーンな状態から再現するために、最終的に SQLのINSERT文に して保存しています) ここが作業が大変になるところですね。 グリッド編集でテストデータを作成するのは、よほど少量でなければ止めておいたほうがいいでしょう。 お勧めのやり方ですが、テストデータの「種」保存用のテーブルを作り、少量の種レコードを保存し、そこからSQL文で種を増幅してテストデータ保存用テーブルにINSERTやUPDATEし、データ生成するような方法です。 SQLをうまく書けば、主キーを連番にしたり、金額などの数値をばらけさしたり、ヘッダ・明細関係を保つこともできます。 増幅する方法はコツさえつかめれば簡単です。 テーブルDDL変更は、プロジェクトメンバー全員で共有すべきなので、それは必ず知らせてもらうようにしましょう。できればその時の変更DDLも入手させてもらうようにして、テストデータ用テーブルにも適用すればよいのではないでしょうか。 とにかく、早めにグリッド編集作業からは脱却して、すべてをSQLで行うようにシフトすることですね。

donkypong
質問者

補足

ご回答ありがとうございます&お返事が遅くなってしまい、申し訳ありません。 > グリッド編集でテストデータを作成するのは、よほど少量で > なければ止めておいたほうがいいでしょう。 > お勧めのやり方ですが、テストデータの「種」保存用のテーブルを > 作り、少量の種レコードを保存し、そこからSQL文で種を増幅して > テストデータ保存用テーブルにINSERTやUPDATEし、データ生成する > ような方法です。 説明不足で申し訳ありません。 実はuresiiwaさんのおっしゃる 「テストデータの「種」保存用のテーブルを作り」 の部分(たぶん)をしんどいと思っているのです。 単にバリエーションのあるデータを増幅したデータが欲しい場合、 ちょっとしたプログラムを組んで、それで例えば1000件のデータを INSERT文として出力するようにしてます。 テキストを吐き出せる言語なら何でもいいので、適当な言語で吐き 出してます。 場合によっては、プログラムから直接Oracleにデータ出力するように してます。 この場合は、主キーを連場にしたり、金額などの数値をランダムにしたり といったことは、自由自在にできるので、まあ、どうでもいいんですが。 「種」となるようなデータを作るには、やはり手作業しかないと思うのですが どうでしょうか。 その手作業をする場合には、グリッド編集的なツールで、それぞれのテーブルの 関連を見ながら作らざるを得ないのでは?とか思うのですが。 その場合に、既存のグリッド編集ツールがどうにも使いにくくて、何か良い ツールはないだろうかと。 件数として、1テーブル10件から50件と言ってしまいましたが、若干の バリエーションを入れたくてそう言ってしまいまして、すみませんでした。 実際は、1テーブル最低必要なのは5件程度とか、孫明細まで入れてトータルで 30件程度のデータがあれば、種としてはOKだろうと思います。 ただ、それを作るのがしんどいです。 > グリッド編集でテストデータを作成するのは、よほど少量でなければ > 止めておいたほうがいいでしょう。 この場合は、「よほどの少量」に該当するのではないかと思っている のですが、どうでしょう。 SQLで「増幅」させる以前の件数だと思うので、さすがに手作業で 作らざるを得ないのではないかと思うのです。 ちなみに、テーブル数はとりあえず3テーブルとかそんな程度で、そこから 参照しているマスタが多数あったりします。 3テーブルの各カラム数は、数十カラムぐらいあり、10程度のマスタを参照 するようになってまして、そこがまた面倒です。 グリッド編集的な機能で、既存の(というか、他社が作った)マスタを 参照しながらそれにあうデータを作っていくのが、ほんの数件であっても 大変だなあ、と思う次第です。 しかも一度作ってOKというわけではなく、他社のマスタデータがまたコロコロ 変わるので、そういった場合に、こちらのデータの整合性がきちんと取れているか どうかとかを「パッと見」で確認しつつ、合わない部分をちょこちょこっと 修正したりできるといいなあとか思います。 > とにかく、早めにグリッド編集作業からは脱却して、すべてをSQLで行うように > シフトすることですね。 全てをSQLで行うと、逆に効率が悪くなりそうな気がするのですが、 そんなにうまくいくものなんでしょうか。

関連するQ&A

  • テストデータを作成したい

    Oracle9iです。テストデータを作成したいです。 カラムが200くらいあるテーブルに対して、既に登録済みの1レコードの主キーだけ変更したものを10万件登録したいのですが、何かいい方法はないでしょうか?

  • SQLiteで最も古いレコードのみの削除

    AndoroidでDBを使うのですが、考える動作のSQL文が作成できません。 テーブルTESTは以下のカラムを持ちます  ・ID - primary key not null  ・VALUE - not null テーブルTESTは最大で10件のレコードを保持します、11件目のレコードが発生したら 最も古い1件目のレコードを削除してから、11件目のデータを新しい10件目のデータとして テーブルに保存します。 そのために「最も古いレコード1件のみを削除する」というSQLを作成したいのですが、 考えたSQL文が正しくないと怒られてしまいます。 delete from TEST as A, (select * from TEST LIMIT 1)as B where A.ID=B.ID; この動作を1つのSQL文で行うのは不可能なのでしょうか?

  • 単体テストレベルのテストデータの作成方法

    単体テストレベルのテストデータの作成方法 以前、このような質問をさせていただきました。 http://okwave.jp/qa/q4951742.html いまだに同じ悩みを抱えておりまして、皆様どのようにしているのだろうか、あらためてご質問させていただきたいと思います。 あるいは、「このサイトで質問するよりもっと適切ながある」ということでしたら、そのサイトを教えていただけないでしょうか。 より具体的な例で質問させていただきたいと思います。 例えば、次のようなテーブル群があったとします。 ※OracleベースのDDL(適当&適宜省略(^^;)で示しております。 ※同一カラム名の個所は、それぞれのテーブルにひもづいています。 ※単純な例なので、各テーブルの関連はテーブル名でお分かりになるかと思います... CREATE TABLE 受注テーブル ( 受注ID VARCHAR2(10) PRIMARY KEY, 顧客ID VARCHAR2(10) 受注日 DATE, ); CREATE TABLE 受注明細テーブル ( 受注ID VARCHAR2(10), 製品ID VARCHAR2(10), 数量 NUMBER(10,0), PRIMARY KEY (受注ID, 製品ID) ); CREATE TABLE 顧客マスタ ( 顧客ID VARCHAR2(10) PRIMARY KEY, 顧客会社名 VARCHAR2(100), ); CREATE TABLE 製品マスタ ( 製品ID VARCHAR2(10) PRIMARY KEY, 製品名 VARCHAR(100), 仕入先ID VARCHAR2(10) ); CREATE TABLE 仕入先マスタ( 仕入先ID VARCHAR2(10) PRIMARY KEY, 仕入先会社名 VARCHAR2(100) ); 正常系のテストパターンが(仮に)数十あるものとして、各パターンごとに0件から10件程度のデータを作成したいです。 皆様どのようにテストデータを作成しているのでしょうか。 あるいは、上記の例ではたかだか5テーブルのリレーションではありますが、ここでは省略した各種カラムにひもづく別のマスタ群が多数あるとした場合はどうでしょうか。 上記のテーブルの例で言えば「注文テーブル」用のデータを作成しつつ、それにひもづいた正しい「注文明細テーブル」用データを作成するだけでもしんどいと思ってしまいます。 さらに、関連するマスタ群として「顧客マスタ」や「仕入先マスタ」などなど多数ある場合、それぞれの関連を見ながら「正しいデータ(つまりテストデータ自体が間違っている、という事態を避けたい)」を作成するのが難しいと感じてしまいます。

  • SQLを使ったデータの作成

    コマンドプロントを使用し、SQLでデータベースを作成しています。 大きなテーブルを複数作り、複数のデータの作成をしています。 1.テーブルの方の定義を行い、キー項目を決める。 2.データは、一つ一つの項目ごとに、データの型やサイズを決める。 3.いくつか検索をした際に、ちゃんと結果の違いが確認できるように、100レコード程度のデータを作成する。 の制約で制作しています。 SQLに触って、まだあまり経っていないためどうプログラムを組めばいいのか分かりません。    テーブルの意味などや、キー項目、などの言葉の意味もあまり理解出来てません。 例えば データベース:ONLAINGAME テーブル1:MEMBER テーブル2:WEAPON を制作し、MENBERの中に50件、WEAPONの中に50件データを作ればいいのでしょうか。 データの作り方も少し心配です。 create table MENBERl(age int, name varchar(20) , primary key (aa); 上記の文を打ち、insert into MENBER ( age, name) values(20, 'takasi'); と書けば、制約通りデータが格納できるのでしょうか? 分かりずらいとは思いますが、詳しいお答えお願いいたします。

  • 2つのテーブルのデータまとめて取得したい

    SQL Server2008を使用しているのですが、どうのようにデータを取得すれば良いか わからず困っております。 例えば、 名前は違うが全く同じテーブルが2つあるとします。 テーブルAには6レコード、テーブルBには3レコードのデータが存在するとします。 この時、単純に6レコード+3レコードの 9レコード分をひとつのテーブルとしてデータを 取得するにはどのようなSQL文を書けばよいでしょうか? SELECT * FROM テーブルA, テーブルBでは18レコードもデータを取得してしまい、且つ フィールド数も増加してしまいます。 宜しくお願いいたします。

  • 作成したSQLの単体テスト【エビデンスの取り方】

    作成したSQLの単体テストをするにあたって、エビデンスの取り方に悩んでおります。 テストケースとしては、 抽出した項目が正しく設定されているか、ホワイトボックスの観点から、 条件に一致する場合、しない場合で期待した値が設定されているか、などです。 抽出したものは50件のレコードで、カラムは15個程度あるとします。 エビデンスは今まではプリントスクリーンで画面キャプチャを取得して、 エクセルに張り付けていました。(SQLを使わないものの単体テスト) そしてインプットとアウトプットのデータを、テストケースのNoに合わせたファイル名にして、 フォルダに格納しておりました。 しかしSQLのテストとなると、どのようにまとめればいいか悩んでおります。 例えばあるカラムが正しい値になっているかというのは、抽出した60件のレコードのうち1レコードをコピーして、エクセルに張り付け、「このカラムのところに○○という値が設定されているため正しい」というようにするのでしょうか。 そうなるとカラムが15個あるので、15個のカラムが正しい値に設定されているかのチェックは 最低でも15個のテストケースが出来上がります。 テストケース(1):カラムAAAの値が○○であること テストケース(2):カラムBBBの値が△であること テストケース(3):カラムCCCの値が□であること    ・    ・    ・ テストケース(15):カラムYYYの値がXであること 1つの1つのテストケースに対して1レコードをコピーして、 「このカラムはこの値になっているから正しい」ということを繰り返すことになるのでしょうか。 そしてインプットとなるデータは、そのデータをDBでつかえるようにインサート文を用意すれば良いのでしょうか。 意味が伝わりにくい文章になってしまいましたが、エビデンスの取り方という点で、 どのように工夫すれば良いのか教えていただきたく、質問致しました。

  • オラクルのレコードカウントの制御(改訂版)

    プログラム初心者です。 オラクル(11g)で、10個のPCで10人が、あるテーブルのデータを更新していく、システムを作成(VB2005)しています。 画面は2パターンです。 ・データ一覧表示画面 ・上記からデータを選択し、編集する用の画面 例として下記のようなデータがあります。 テーブルC 日付順 番号はユニーク 日付_番号_ステータス__レコードカウント(Rc) 1/3____1_____Q________0 1/5____2_____R________1 1/6____5_____G________2 (Rc=2) 1/7____7_____P________3 (Rc=3) 1/20__ 9_____R________4 2/1___10_____U________5 動作の流れ 1.まず、この全データをSQLで読込みます。 SELECT * FROM テーブルC ORDER BY 日付 ASC これが一覧表示画面(VB2005のグリッドビュー等)に表示されます。 2.A氏が例えば1/6のレコードを編集したいとします。 そこで、1/6(日付)の列をマウスで選択。このとき列番号(レコードカウント)は2になります。 編集画面フォームに、同じSQL(SELECT * FROM テーブルC ORDER BY 日付 ASC) と、列番号(レコードカウント)2を、引渡しします。 3.編集画面で、引き渡されたSQLを実行し、そのデータを全てDatatblに格納します。 そのデータの3つめ(レコードカウント2)を参照します。 datatabl.Rows(2).Item("ステータス") データは参照後、ある条件によりステータスが変わります。 ステータスが、"Z"になった場合、そのレコードは、テーブルAに移動されます。 4.編集後は、他のテーブルに移動する場合でも、テーブルCがそのまま更新される場合でも、 自動的に次の列のレコードに移行し編集を行う。 今回は例として、1/6のレコードのステータスが"Z"になって A氏は次に1/7(Rc3)のデータを編集作業に入ります。 5. 4.を実行するため、また同じSQLを実行。 SQL実行後、レコードカウントを次に移行すればいいのですが(Rc=2に1を加え、Rc=3とする)、 Rc=3を見ても、1/20のデータが抽出されて しまいます。 (1/6のレコードが移動してなくなってしまった場合) また、他の例として、上記と同様に、A氏が1/6のデータを編集中に、他の人が1/3,1/5のデータを編集移動 してしまった場合、レコードカウントがぐちゃぐちゃになってしまいます。 こうした多くの人がデータを編集、更新・移動する場合のテーブルを、日付順に作業させていく場合は、どのような制御 (またはオラクルの機能)をすれば、可能なのかご指導頂ければ助かります。

  • MSアクセスのクエリで結果がおかしい

    アクセス2000で追加クエリを作成していますが、 クエリのデータシートビューで確認したレコードと 追加されたテーブルで確認したレコードが異なり、テーブルのデータが少なくなってしまっています。 条件としては、 クエリの参照元 SQLサーバからのリンクテーブル(レコード数で13万件程度) 追加先のテーブルはローカルのmdb内です たまたまかもしれませんが、今テストしているデータは、 クエリ上では、19件あるものの、実行しても9件しか追加されません。 原因としてありそうなものがわかる方がいれば、よろしくお願いします。

  • 別テーブルの検索した結果が0件のデータのレコードを削除したい

    SQL Server 2005 を使用しています。 別テーブルで検索した結果が0件の時、対応するレコードを削除したいのですが、SQLをどうかけば実現出来るかわかりません。 具体的には、テーブル Aとテーブル B があって、テーブル Aのキーが AA,AB,ACとします。 この時、テーブル Bにも AA,AB,ACという列があるとします。 この時に、テーブルBをAA,AB,ACでGROUP BYしてCOUNTをとった時にレコード数が0のキーのレコードを、テーブルAから削除したいのですが、この時SQLを一つで書きたいのです。 テーブル Aが明細、テーブル Bが名簿みたいな形で、名簿に存在しないレコードを削除するような感じです。 どういうSQLを書けばいいか少し悩んでいます。 AA,AB,ACは全て integer型です。 どなたかわかりましたら教えてください。

  • データベースのインデックスについての基本的な質問

    とあるテーブルAとBがあり、二つはあるキーで結合するSQLを頻繁に発行しています。両テーブルとも数万件のデータがあり、パフォーマンスが遅いということだったので、結合の条件としているキーのカラムにインデックスを作成したところ、劇的に速くなりました。 というところまでは良かったのですが、最近、負荷テストを行う目的で、さらに数百万件のテストデータをいっきに両テーブルにINSERTしました。この場合、インデックスは何かしら人の手によるメンテナンスが必要なのでしょうか?(ALTER INDEX REBUILD ONLINEという再構築のSQLがあることを知りました) それとも、データがテーブルに追加されても既に以前インデックスが作成されている場合は特に人の手による保守は不要なものでしょうか? 今は負荷テスト中ですが、本稼働した後にも何か自動でデータベースのインデックスの保守作業は一般的に必要なものなのかどうか、必要な場合は具体的にどのようにやるのか教えて頂きたいです。 使用しているDBはOracle 11gです。