web-dev-qa-db-ja.com

Oracleインスタンスからインメモリデータベース構造を作成する

多くの "unit"テストが実行中にOracleデータベースへの実際の接続を使用するアプリケーションがあります。

ご想像のとおり、これらのテストは一部のSpringコンテキストを初期化してOracleインスタンスと通信する必要があるため、実行に時間がかかりすぎます。それに加えて、テスト実行後のデータベースの変更を回避するために、トランザクションなどの複雑なメカニズムを管理する必要があります(AbstractAnnotationAwareTransactionalTestsのようなSpringの便利なクラスを使用する場合でも)。

したがって、私の考えは、このOracleテストインスタンスをインメモリデータベースに徐々に置き換えることです。私は hsqldb または多分より良い h2 を使用します。

私の質問は、それを行うための最良のアプローチは何かを知ることです。私の主な関心は、インメモリデータベース構造の構築と参照データの挿入に関係しています。

もちろん、SQL DeveloperTOADなどのツールを使用してOracleからデータベース構造を抽出し、これらのスクリプトを変更してhsqldbまたはh2言語に適合させることができます。しかし、私はそれがより良いアプローチだとは思いません。


実際、別のプロジェクトでhsqldbを使用して既にそれを行っていますが、テーブルを作成するためのすべてのスクリプトを手動で作成しました。幸い、作成するテーブルはわずかしかありませんでした。この手順での主な問題は、テーブルの作成に使用されるOracleスクリプトをhsqldb言語に「変換」することでした。

たとえば、次のsqlコマンドを使用してOracleで作成されたテーブル:

CREATE TABLE FOOBAR (
    SOME_ID NUMBER,
    SOME_DATE DATE, -- Add primary key constraint
    SOME_STATUS NUMBER,
    SOME_FLAG NUMBER(1) DEFAULT 0 NOT NULL);

hsqldbを次のように「翻訳」する必要があります:

CREATE TABLE FOOBAR (
    SOME_ID NUMERIC,
    SOME_DATE TIMESTAMP PRIMARY KEY,
    SOME_STATUS NUMERIC,
    SOME_FLAG INTEGER DEFAULT 0 NOT NULL);

私の現在のプロジェクトでは、手動でそれを行うにはテーブルが多すぎます...


だから私の質問:

  • それを達成するために私に与えることができるアドバイスは何ですか?
  • h2またはhsqldbは、Oracle接続からスクリプトを生成するためのツールをいくつか提供していますか?

技術情報

Java 1.6、Spring 2.5、Oracle 10.g、Maven 2


編集

私の単体テストに関するいくつかの情報:

私がhsqldbを使用したアプリケーションでは、次のテストを行いました。-DBとは何の関係もない、いくつかの「基本」ユニットテスト。 -DAOテストでは、hsqldbを使用してCRUDなどのデータベース操作を実行しました。 -次に、サービスレイヤーでMockitoを使用してDAOオブジェクトをモックし、アプリケーション全体ではなくサービステスト(つまり、サービス+ dao + DB)に焦点を当てました。

現在のアプリケーションでは、最悪のシナリオがあります。DAOレイヤーテストを実行するには、Oracle接続が必要です。サービス層は、DAOをシミュレートするためにモックオブジェクトを(まだ)使用していません。したがって、サービステストOracle接続が必要です。

モックとインメモリデータベースは2つの別個のポイントであることを承知しており、できるだけ早く対処します。ただし、最初のステップはtryしてインメモリデータベースによるOracle接続を削除し、次にMockitoナレッジを使用してテストを強化します。

単体テストと統合テストも分離したいことに注意してください。後者は、「実際の」テストを実行するためにOracleデータベースへのアクセスが必要になりますが、私の主な関心事(そしてこれがこの質問の目的です)は、今日のほとんどすべての単体テストが分離して実行されないことです。

32
Romain Linsolas

インメモリ/ Javaデータベースをテストに使用します。これにより、テストでデータベースを「抽象化」しようとする場合よりも、テストが実世界に近くなります。このようなテストは、一方、UIテストは通常​​自動化が難しいため、テストで「抽象化」したいのはおそらくUIです。

あなたが投稿したOracle構文はH2データベース(私はテストしたところ)でうまく機能するので、H2はHSQLDBよりもOracle構文をサポートしているようです。免責事項:私はH2の作者の一人です。何かがうまくいかない場合は、H2メーリングリストに投稿してください。

とにかく、バージョン管理システムにデータベースのDDLステートメントがあるはずです。これらのスクリプトをテストに使用することもできます。おそらく、複数のスキーマバージョンもサポートする必要があります。その場合、バージョン更新スクリプト(代替テーブル...)を作成できます。 Javaデータベースを使用すると、それらもテストできます。

ちなみに、H2やHSQLDBを使用する場合は、必ずしもメモリ内モードを使用する必要はありません。データを永続化しても、両方のデータベースは高速です。また、それらは簡単にインストールでき(jarファイルのみ)、必要なメモリはOracleよりはるかに少なくて済みます。

19
Thomas Mueller

最新のHSQLDB 2.0.1は、構文互換性フラグsql.syntax_ora = trueを介して、DUAL、ROWNUM、NEXTVAL、CURRVALのOracle構文をサポートしています。同様に、文字列とNULL文字列の連結、およびUNIQUE制約でのNULLの制限は、他のフラグで処理されます。 TO_CHAR、TO_DATE、NVLなどのほとんどのOracle関数はすでに組み込まれています。

現時点では、NUMBERなどの単純なOracleタイプを使用するには、タイプ定義を使用できます。

タイプ番号を数値として作成

フラグが設定されている場合、次のスナップショットでは、NUMBER(N)およびその他のOracleタイプ互換性の側面が許可されます。

ダウンロード http://hsqldb.org/support/

[更新:] 10月4日に発行されたスナップショットは、ほとんどのOracle固有の型をANSI SQL型に変換します。 HSQLDB 2.0は、Oracleと同じように、ANSI SQL INTERVAL型と日付/タイムスタンプ演算もサポートしています。

4
fredt

あなたのユニットテストは何ですか? DDLとストアドプロシージャの適切な動作をテストする場合は、Javaコードなし、またはSpringとその他のNice Webインターフェイスなしで、dbに焦点を合わせずに、Oracleに「より近い」テストを作成する必要があります。 。

JavaおよびSpringに実装されているアプリケーションロジックをテストする場合は、モックオブジェクト/データベース接続を使用して、テストをデータベースから独立させることができます。

全体として機能をテストする場合(モジュール式の開発およびテストの原則に反するもの)、データベースを仮想化して、そのインスタンスでテストすることができます。

2
rics

テストが自分でクリーンアップする限り(既に設定方法を知っているように見える限り)、実際のデータベースインスタンスに対してテストを実行しても問題はありません。実際、できる限り本番環境に近いものをテストするため、これは私が通常好むアプローチです。

非互換性は小さいように見えますが、実際にはそれほど長くはかからなくなります。良い場合には、いくつかの厄介なSQL変換/大規模なあざけることで済むかもしれません。悪い場合には、システムの一部をテストすることは単に不可能であり、ビジネスクリティカルなシステムにとっては許容できないリスクだと思います。

1
oksayt